Skip to content

Commit

Permalink
enable updating an exercise with the generator
Browse files Browse the repository at this point in the history
  • Loading branch information
senekor committed Sep 9, 2023
1 parent 4433f5c commit 4d9fc34
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 15 deletions.
11 changes: 5 additions & 6 deletions justfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,13 @@ configlet *args="":
@[ -f bin/configlet ] || bin/fetch-configlet
./bin/configlet {{ args }}

# TODO update all if no exercise specified
update exercise:
@just configlet sync --update --yes --docs --metadata --tests include --exercise {{ exercise }}

add-practice-exercise:
cd rust-tooling && cargo run --quiet --bin add_practice_exercise
cd rust-tooling && cargo run --quiet --bin generate_exercise

update-practice-exercise:
cd rust-tooling && cargo run --quiet --bin generate_exercise update

# TODO remove. resets result of add-practice-exercise.
clean:
git restore config.json
git restore config.json exercises/practice
git clean -- exercises/practice
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,32 @@ impl std::fmt::Display for Difficulty {
fn main() {
fs_utils::cd_into_repo_root();

let slug = add_entry_to_track_config();
let is_update = std::env::args().any(|arg| arg == "update");

let slug = if is_update {
ask_for_exercise_to_update()
} else {
add_entry_to_track_config()
};

make_configlet_generate_what_it_can(&slug);

generate_exercise_files(&slug);
generate_exercise_files(&slug, is_update);
}

fn ask_for_exercise_to_update() -> String {
let implemented_exercises = glob("exercises/practice/*")
.unwrap()
.filter_map(Result::ok)
.map(|path| path.file_name().unwrap().to_str().unwrap().to_string())
.collect::<Vec<_>>();

Select::new(
"Which exercise would you like to update?",
implemented_exercises,
)
.prompt()
.unwrap()
}

/// Interactively prompts the user for required fields in the track config
Expand Down Expand Up @@ -154,18 +175,20 @@ fn make_configlet_generate_what_it_can(slug: &str) {
}
}

fn generate_exercise_files(slug: &str) {
fn generate_exercise_files(slug: &str, is_update: bool) {
let exercise = exercise_generation::new(slug);

let exercise_path = PathBuf::from("exercises/practice").join(slug);

std::fs::write(exercise_path.join(".gitignore"), exercise.gitignore).unwrap();
std::fs::write(exercise_path.join("Cargo.toml"), exercise.manifest).unwrap();
std::fs::create_dir(exercise_path.join("src")).unwrap();
std::fs::write(exercise_path.join("src/lib.rs"), exercise.lib_rs).unwrap();
std::fs::write(exercise_path.join(".meta/example.rs"), exercise.example).unwrap();
if !is_update {
std::fs::write(exercise_path.join(".gitignore"), exercise.gitignore).unwrap();
std::fs::write(exercise_path.join("Cargo.toml"), exercise.manifest).unwrap();
std::fs::create_dir(exercise_path.join("src")).ok();
std::fs::write(exercise_path.join("src/lib.rs"), exercise.lib_rs).unwrap();
std::fs::write(exercise_path.join(".meta/example.rs"), exercise.example).unwrap();
}

std::fs::create_dir(exercise_path.join("tests")).unwrap();
std::fs::create_dir(exercise_path.join("tests")).ok();
let crate_name = slug.replace('-', "_");
let mut test_file = exercise.test_header;
test_file += &exercise.test_cases;
Expand Down

0 comments on commit 4d9fc34

Please sign in to comment.