summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2023-01-07 12:00:19 +0200
committerLars Wirzenius <liw@liw.fi>2023-01-07 12:01:13 +0200
commit799d12f9ea003494d78a0943cdf9e44d7dc88ea3 (patch)
treefafe36bd378e1cb6465d9b3a6b60189c8f723a59
parentb164f69c45db556a87020d85dbbaa48f1e2e1392 (diff)
downloadriki-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.rs52
-rw-r--r--src/error.rs4
-rw-r--r--src/lib.rs1
-rw-r--r--src/version.rs57
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),
diff --git a/src/lib.rs b/src/lib.rs
index 04dffa6..be6e4a9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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)
+ }
+}