Skip to content

Commit

Permalink
implement laze_required_version
Browse files Browse the repository at this point in the history
  • Loading branch information
kaspar030 committed Dec 14, 2023
1 parent 9db1896 commit 7407116
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 0 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased] - ReleaseDate

- add file-level `laze_required_version`

## [0.1.17] - 2023-10-06

### Fixed
Expand Down
10 changes: 10 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ clap_complete = "4.4.4"
clap_mangen = "0.2.15"
camino = { version = "1.1.6", features = ["serde1"] }
evalexpr = "11.3.0"
semver = { version = "1.0.20", features = ["serde"] }

[profile.release]
lto = "fat"
Expand Down
1 change: 1 addition & 0 deletions book/src/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
# Reference

- [laze file format](./reference/laze_yaml.md)
- [laze_required_version](./reference/laze_required_version.md)
- [apps](./reference/apps.md)
- [builders](./reference/builders.md)
- [contexts](./reference/contexts.md)
Expand Down
10 changes: 10 additions & 0 deletions book/src/reference/laze_required_version.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# laze_required_version

Expects a semver version string (`a.b.c`). Laze will refuse to read the file if
its own version is smaller.

Example:

```yaml
laze_required_version: 1.0.0
```
30 changes: 30 additions & 0 deletions src/data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ use std::time::Instant;

use anyhow::{Context as _, Error, Result};
use camino::{Utf8Path, Utf8PathBuf};
use semver::Version;
use serde::{Deserialize, Deserializer};

use treestate::{FileState, TreeState};
Expand All @@ -40,6 +41,33 @@ where
Deserialize::deserialize(deserializer).map(Some)
}

fn deserialize_version_checked<'de, D>(deserializer: D) -> Result<Option<Version>, D::Error>
where
// T: Deserialize<'de>,
D: Deserializer<'de>,
{
use serde::de;

let version: Option<String> = Deserialize::deserialize(deserializer)?;
if let Some(version) = &version {
if let Ok(version) = Version::parse(version) {
let my_version = Version::parse(env!("CARGO_PKG_VERSION")).unwrap();
if version > my_version {
return Err(de::Error::custom(format!(
"laze_required_version: got \"{version}\", expected any version <={my_version}"
)));
}
Ok(Some(version))
} else {
return Err(de::Error::custom(format!(
"error parsing \"{version}\" as semver version string"
)));
}
} else {
Ok(None)
}
}

#[derive(Debug, Serialize, Deserialize)]
struct YamlFile {
contexts: Option<Vec<YamlContext>>,
Expand All @@ -51,6 +79,8 @@ struct YamlFile {
imports: Option<Vec<Import>>,
subdirs: Option<Vec<String>>,
defaults: Option<HashMap<String, YamlModule>>,
#[serde(default, deserialize_with = "deserialize_version_checked")]
laze_required_version: Option<Version>,
#[serde(skip)]
filename: Option<Utf8PathBuf>,
#[serde(skip)]
Expand Down

0 comments on commit 7407116

Please sign in to comment.