summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/info_file.rs1
-rw-r--r--src/main.rs13
2 files changed, 13 insertions, 1 deletions
diff --git a/src/info_file.rs b/src/info_file.rs
index 2a45e02..18e77b9 100644
--- a/src/info_file.rs
+++ b/src/info_file.rs
@@ -39,6 +39,7 @@ impl ExerciseInfo {
#[derive(Deserialize)]
pub struct InfoFile {
+ pub format_version: u8,
pub welcome_message: Option<String>,
pub final_message: Option<String>,
pub exercises: Vec<ExerciseInfo>,
diff --git a/src/main.rs b/src/main.rs
index e72dbdc..7d4d8a5 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,4 +1,4 @@
-use anyhow::{Context, Result};
+use anyhow::{bail, Context, Result};
use app_state::StateFileStatus;
use clap::{Parser, Subcommand};
use crossterm::{
@@ -24,6 +24,8 @@ mod watch;
use self::{app_state::AppState, dev::DevCommands, info_file::InfoFile, watch::WatchExit};
+const CURRENT_FORMAT_VERSION: u8 = 1;
+
/// Rustlings is a collection of small exercises to get you used to writing and reading Rust code
#[derive(Parser)]
#[command(version)]
@@ -66,6 +68,10 @@ fn main() -> Result<()> {
let info_file = InfoFile::parse()?;
+ if info_file.format_version > CURRENT_FORMAT_VERSION {
+ bail!(FORMAT_VERSION_HIGHER_ERR);
+ }
+
if matches!(args.command, Some(Subcommands::Init)) {
init::init(&info_file.exercises).context("Initialization failed")?;
println!("{POST_INIT_MSG}");
@@ -156,6 +162,11 @@ const CARGO_NOT_FOUND_ERR: &str = "Failed to find `cargo`.
Did you already install Rust?
Try running `cargo --version` to diagnose the problem.";
+const FORMAT_VERSION_HIGHER_ERR: &str =
+ "The format version specified in the `info.toml` file is higher than the last one supported.
+It is possible that you have an outdated version of Rustlings.
+Try to install the latest Rustlings version first.";
+
const POST_INIT_MSG: &str = "Done initialization!
Run `cd rustlings` to go into the generated directory.