diff options
author | Lars Wirzenius <liw@liw.fi> | 2023-01-07 12:00:19 +0200 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2023-01-07 12:01:13 +0200 |
commit | 799d12f9ea003494d78a0943cdf9e44d7dc88ea3 (patch) | |
tree | fafe36bd378e1cb6465d9b3a6b60189c8f723a59 | |
parent | b164f69c45db556a87020d85dbbaa48f1e2e1392 (diff) | |
download | riki-799d12f9ea003494d78a0943cdf9e44d7dc88ea3.tar.gz |
refactor: move version code from src/bin/riki.rs into src/version.rs
Sponsored-by: author
-rw-r--r-- | src/bin/riki.rs | 52 | ||||
-rw-r--r-- | src/error.rs | 4 | ||||
-rw-r--r-- | src/lib.rs | 1 | ||||
-rw-r--r-- | src/version.rs | 57 |
4 files changed, 67 insertions, 47 deletions
diff --git a/src/bin/riki.rs b/src/bin/riki.rs index 20990f5..c1f9e4b 100644 --- a/src/bin/riki.rs +++ b/src/bin/riki.rs @@ -1,5 +1,5 @@ use clap::{CommandFactory, FromArgMatches, Parser}; -use git_testament::{git_testament, render_testament, GitModification}; +use git_testament::git_testament; use log::{debug, error, info}; use riki::error::RikiError; use riki::git::{git_dirty, git_whatchanged}; @@ -8,6 +8,7 @@ use riki::pagespec; use riki::site::Site; use riki::time::parse_timestamp; use riki::util::{canonicalize, copy_file_from_source, get_mtime, mkdir, set_mtime}; +use riki::version::Version; use std::error::Error; use std::path::{Path, PathBuf}; @@ -34,13 +35,14 @@ fn real_main() -> Result<(), RikiError> { info!("riki starts"); - let version = version().map_err(RikiError::Format)?; - let long_version = long_version().map_err(RikiError::Format)?; + let version = Version::new(&VERSION); + let short = version.version()?; + let long = version.long_version()?; { let argparser = Args::command(); - let argparser = argparser.version(version.as_str()); - let argparser = argparser.long_version(long_version.as_str()); + let argparser = argparser.version(short.as_str()); + let argparser = argparser.long_version(long.as_str()); let args = argparser.get_matches(); let args = Args::from_arg_matches(&args).unwrap(); @@ -57,46 +59,6 @@ fn real_main() -> Result<(), RikiError> { Ok(()) } -fn version() -> Result<String, std::fmt::Error> { - use std::fmt::Write as _; - let mut ret = String::new(); - writeln!(ret, "{}", render_testament!(VERSION))?; - writeln!( - ret, - "{} {}", - env!("CARGO_PKG_NAME"), - env!("CARGO_PKG_VERSION") - )?; - Ok(ret) -} - -fn long_version() -> Result<String, std::fmt::Error> { - use std::fmt::Write as _; - let mut ret = String::new(); - writeln!(ret, "{}", render_testament!(VERSION))?; - writeln!(ret, "Crate version: {}", env!("CARGO_PKG_VERSION"))?; - if let Some(branch) = VERSION.branch_name { - writeln!(ret, "Built from branch: {}", branch)?; - } else { - writeln!(ret, "Branch information is missing.")?; - } - writeln!(ret, "Commit info: {}", VERSION.commit)?; - if VERSION.modifications.is_empty() { - writeln!(ret, "Working tree is clean")?; - } else { - use GitModification::*; - for fmod in VERSION.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) -} - /// Static site generator. /// /// Riki generates a static web site from markdown files. It mostly diff --git a/src/error.rs b/src/error.rs index 845f08d..bab58fb 100644 --- a/src/error.rs +++ b/src/error.rs @@ -24,8 +24,8 @@ pub enum RikiError { #[error(transparent)] Time(#[from] crate::time::TimeError), - #[error("string formatting error: {0}")] - Format(#[source] std::fmt::Error), + #[error(transparent)] + Version(#[from] crate::version::VersionError), #[error("link to missing page {1} on {0}")] PageMissing(PathBuf, PathBuf), @@ -21,3 +21,4 @@ pub mod time; pub mod token; pub mod util; pub mod wikitext; +pub mod version; 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) + } +} |