feat(tvix/nix-compat/derivation): Display -> to_aterm_string()

Instead of implementing `std::fmt::Display for Derivation` and relying
on the `to_string` method, introduce a `to_aterm_string()` method, which
does the same thing, but makes it clearer what we're producing, rather
than just calling `to_string()``.

Change-Id: I21823de9096a0f2c2eb6f4591e48c1aa9fd94161
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7998
Autosubmit: flokli <flokli@flokli.de>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
Florian Klink 2023-02-01 11:45:44 +01:00 committed by clbot
parent 964367044d
commit f5ccb65f26
2 changed files with 19 additions and 11 deletions

View file

@ -40,6 +40,9 @@ pub struct Derivation {
} }
impl Derivation { impl Derivation {
/// write the Derivation to the given [std::fmt::Write], in ATerm format.
///
/// The only errors returns are these when writing to the passed writer.
pub fn serialize(&self, writer: &mut impl std::fmt::Write) -> Result<(), std::fmt::Error> { pub fn serialize(&self, writer: &mut impl std::fmt::Write) -> Result<(), std::fmt::Error> {
writer.write_str(write::DERIVATION_PREFIX)?; writer.write_str(write::DERIVATION_PREFIX)?;
writer.write_char(write::PAREN_OPEN)?; writer.write_char(write::PAREN_OPEN)?;
@ -57,6 +60,18 @@ impl Derivation {
Ok(()) Ok(())
} }
/// return the ATerm serialization as a string.
pub fn to_aterm_string(&self) -> String {
let mut buffer = String::new();
// invoke serialize and write to the buffer.
// Note we only propagate errors writing to the writer in serialize,
// which won't panic for the string we write to.
self.serialize(&mut buffer).unwrap();
buffer
}
/// Returns the fixed output path and its hash /// Returns the fixed output path and its hash
// (if the Derivation is fixed output), // (if the Derivation is fixed output),
/// or None if there is no fixed output. /// or None if there is no fixed output.
@ -116,7 +131,7 @@ impl Derivation {
// it as a hex-encoded string (prefixed with sha256:). // it as a hex-encoded string (prefixed with sha256:).
let aterm_digest = { let aterm_digest = {
let mut derivation_hasher = Sha256::new(); let mut derivation_hasher = Sha256::new();
derivation_hasher.update(self.to_string()); derivation_hasher.update(self.to_aterm_string());
derivation_hasher.finalize() derivation_hasher.finalize()
}; };
@ -171,7 +186,7 @@ impl Derivation {
}; };
// write the ATerm of that to the hash function // write the ATerm of that to the hash function
hasher.update(replaced_derivation.to_string()); hasher.update(replaced_derivation.to_aterm_string());
hasher.finalize() hasher.finalize()
} }
@ -281,10 +296,3 @@ impl Derivation {
Ok(()) Ok(())
} }
} }
impl std::fmt::Display for Derivation {
/// Formats the Derivation in ATerm representation.
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.serialize(f)
}
}

View file

@ -44,13 +44,13 @@ fn validate(path_to_drv_file: &str) {
} }
#[test_resources("src/derivation/tests/derivation_tests/*.drv")] #[test_resources("src/derivation/tests/derivation_tests/*.drv")]
fn check_to_string(path_to_drv_file: &str) { fn check_to_aterm_string(path_to_drv_file: &str) {
let data = read_file(&format!("{}.json", path_to_drv_file)); let data = read_file(&format!("{}.json", path_to_drv_file));
let derivation: Derivation = serde_json::from_str(&data).expect("JSON was not well-formatted"); let derivation: Derivation = serde_json::from_str(&data).expect("JSON was not well-formatted");
let expected = read_file(path_to_drv_file); let expected = read_file(path_to_drv_file);
assert_eq!(expected, derivation.to_string()); assert_eq!(expected, derivation.to_aterm_string());
} }
#[test_case("bar","0hm2f1psjpcwg8fijsmr4wwxrx59s092-bar.drv"; "fixed_sha256")] #[test_case("bar","0hm2f1psjpcwg8fijsmr4wwxrx59s092-bar.drv"; "fixed_sha256")]