X-Git-Url: https://code.octet-stream.net/hashgood/blobdiff_plain/1dec1ec82f55d639d9fad0d0933545aa509c4272..cfcab0977a3267bfc7f52a0d26224753a491bbcb:/src/main.rs diff --git a/src/main.rs b/src/main.rs index 2f1e7f3..f0fc474 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ use std::error::Error; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use std::process; use structopt::StructOpt; @@ -16,6 +16,7 @@ mod verify; #[structopt(name = "hashgood")] pub struct Opt { /// Read the hash from the clipboard + #[cfg(feature = "paste")] #[structopt(short = "p", long = "paste")] paste: bool, @@ -36,6 +37,19 @@ pub struct Opt { hash: Option, } +impl Opt { + fn get_paste(&self) -> bool { + #[cfg(feature = "paste")] + { + self.paste + } + #[cfg(not(feature = "paste"))] + { + false + } + } +} + /// Types of supported digest algorithm #[derive(Debug, PartialEq, Copy, Clone)] pub enum Algorithm { @@ -57,11 +71,12 @@ impl Algorithm { } /// The method by which one or more hashes were supplied to verify the calculated digest +#[derive(Debug, PartialEq)] pub enum VerificationSource { CommandArgument, Clipboard, - RawFile(PathBuf), - DigestsFile(PathBuf), + RawFile(String), + DigestsFile(String), } /// A complete standalone hash result @@ -72,7 +87,7 @@ pub struct Hash { } impl Hash { - pub fn new(alg: Algorithm, bytes: Vec, path: &PathBuf) -> Self { + pub fn new(alg: Algorithm, bytes: Vec, path: &Path) -> Self { // Taking the filename component should always work? // If not, just fall back to the full path let filename = match path.file_name() { @@ -88,6 +103,7 @@ impl Hash { } /// A possible hash to match against. The algorithm is assumed. +#[derive(Debug, PartialEq)] pub struct CandidateHash { bytes: Vec, filename: Option, @@ -95,6 +111,7 @@ pub struct CandidateHash { /// A list of candidate hashes that our input could potentially match. At this point it is /// assumed that we will be verifying a digest of a particular, single algorithm. +#[derive(Debug, PartialEq)] pub struct CandidateHashes { alg: Algorithm, hashes: Vec, @@ -138,7 +155,7 @@ fn main() { fn hashgood() -> Result<(), Box> { let opt = get_verified_options()?; let candidates = verify::get_candidate_hashes(&opt)?; - let input = calculate::get_input_reader(&opt.input)?; + let input = calculate::get_input_reader(opt.input.as_path())?; if let Some(c) = candidates { // If we have a candidate hash of a particular type, use that specific algorithm let hashes = calculate::create_digests(&[c.alg], input)?; @@ -179,12 +196,12 @@ fn hashgood() -> Result<(), Box> { fn get_verified_options() -> Result { let opt = Opt::from_args(); let hash_methods = - opt.hash.is_some() as i32 + opt.paste as i32 + opt.hash_file.is_some() as i32; + opt.hash.is_some() as i32 + opt.get_paste() as i32 + opt.hash_file.is_some() as i32; if hash_methods > 1 { if opt.hash.is_some() { eprintln!("* specified as command line argument"); } - if opt.paste { + if opt.get_paste() { eprintln!("* paste from clipboard (-p)") } if opt.hash_file.is_some() {