55 lines
1.3 KiB
Rust
55 lines
1.3 KiB
Rust
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);
|
|
}
|
|
}
|