use serde::{Deserialize, Serialize};
use std::io;
/// Program version metadata.
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub struct Version<'a> {
pub name: &'a str,
pub version: &'a str,
pub commit: &'a str,
pub timestamp: &'a str,
}
impl Version<'_> {
/// Write program version as string.
/// Adjust with caution, third party applications parse the string for version info.
pub fn write(&self, mut w: impl std::io::Write) -> Result<(), io::Error> {
let Version {
name,
version,
commit,
..
} = self;
writeln!(w, "{name} {version} ({commit})")?;
Ok(())
}
/// Write the program version metadata as a JSON value.
pub fn write_json(&self, w: impl std::io::Write) -> Result<(), serde_json::Error> {
serde_json::to_writer(w, self)
}
}
#[cfg(test)]
#[allow(clippy::unwrap_used)]
mod test {
use super::*;
#[test]
fn test_version() {
let mut buffer = Vec::new();
Version {
name: "rad",
version: "1.2.3",
commit: "28b341d",
timestamp: "",
}
.write(&mut buffer)
.unwrap();
let res = std::str::from_utf8(&buffer).unwrap();
assert_eq!("rad 1.2.3 (28b341d)\n", res);
}
}