summaryrefslogtreecommitdiff
path: root/src/version.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/version.rs')
-rw-r--r--src/version.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/version.rs b/src/version.rs
new file mode 100644
index 0000000..4066ab5
--- /dev/null
+++ b/src/version.rs
@@ -0,0 +1,57 @@
+use git_testament::{GitModification, GitTestament};
+
+#[derive(Debug, thiserror::Error)]
+pub enum VersionError {
+ #[error("string formatting error: {0}")]
+ Format(#[from] std::fmt::Error),
+}
+
+pub struct Version<'a> {
+ testament: &'a GitTestament<'a>,
+}
+
+impl<'a> Version<'a> {
+ pub fn new(testament: &'a GitTestament<'a>) -> Self {
+ Self { testament }
+ }
+
+ pub fn version(&self) -> Result<String, VersionError> {
+ use std::fmt::Write as _;
+ let mut ret = String::new();
+ writeln!(ret, "{}", &self.testament)?;
+ writeln!(
+ ret,
+ "{} {}",
+ env!("CARGO_PKG_NAME"),
+ env!("CARGO_PKG_VERSION")
+ )?;
+ Ok(ret)
+ }
+
+ pub fn long_version(&self) -> Result<String, VersionError> {
+ use std::fmt::Write as _;
+ let mut ret = String::new();
+ writeln!(ret, "{}", &self.testament)?;
+ writeln!(ret, "Crate version: {}", env!("CARGO_PKG_VERSION"))?;
+ if let Some(branch) = self.testament.branch_name {
+ writeln!(ret, "Built from branch: {}", branch)?;
+ } else {
+ writeln!(ret, "Branch information is missing.")?;
+ }
+ writeln!(ret, "Commit info: {}", self.testament.commit)?;
+ if self.testament.modifications.is_empty() {
+ writeln!(ret, "Working tree is clean")?;
+ } else {
+ use GitModification::*;
+ for fmod in self.testament.modifications {
+ match fmod {
+ Added(f) => writeln!(ret, "Added: {}", String::from_utf8_lossy(f))?,
+ Removed(f) => writeln!(ret, "Removed: {}", String::from_utf8_lossy(f))?,
+ Modified(f) => writeln!(ret, "Modified: {}", String::from_utf8_lossy(f))?,
+ Untracked(f) => writeln!(ret, "Untracked: {}", String::from_utf8_lossy(f))?,
+ }
+ }
+ }
+ Ok(ret)
+ }
+}