use std::io::Write as _;
use anyhow::{Context, Result};
use cabin_core::Verbosity;
use clap::Args;
use crate::version_info::{VersionInfo, VersionOutputMode};
#[derive(Debug, Args)]
pub(crate) struct VersionArgs {}
fn output_mode_for(verbosity: Verbosity) -> VersionOutputMode {
if verbosity.shows_verbose() {
VersionOutputMode::Verbose
} else {
VersionOutputMode::Concise
}
}
pub(crate) fn version(_args: VersionArgs, verbosity: Verbosity) -> Result<()> {
let info = VersionInfo::current();
let output = info.format(output_mode_for(verbosity));
let stdout = std::io::stdout();
let mut handle = stdout.lock();
handle
.write_all(output.as_bytes())
.context("failed to write version output")?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn output_mode_normal_is_concise() {
assert_eq!(
output_mode_for(Verbosity::Normal),
VersionOutputMode::Concise
);
}
#[test]
fn output_mode_quiet_is_concise() {
assert_eq!(
output_mode_for(Verbosity::Quiet),
VersionOutputMode::Concise
);
}
#[test]
fn output_mode_verbose_is_verbose() {
assert_eq!(
output_mode_for(Verbosity::Verbose),
VersionOutputMode::Verbose
);
}
#[test]
fn output_mode_very_verbose_is_still_verbose() {
assert_eq!(
output_mode_for(Verbosity::VeryVerbose),
VersionOutputMode::Verbose
);
}
}