From: Thomas Karpiniec Date: Tue, 21 Jan 2020 06:55:45 +0000 (+1100) Subject: Make clipboard functionality an optional feature X-Git-Tag: v0.2.0~9 X-Git-Url: https://code.octet-stream.net/hashgood/commitdiff_plain/a81302dca6183729495f32f396e4f7a793b89e96 Make clipboard functionality an optional feature --- diff --git a/Cargo.toml b/Cargo.toml index 1f68f35..4075cee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,5 +10,11 @@ hex = "0.4.0" rust-crypto = "0.2.36" crossbeam-channel = "0.4.0" termcolor = "1.0.5" -clipboard = "0.5.0" regex = "1" + +[dependencies.clipboard] +version = "0.5.0" +optional = true + +[features] +paste = ["clipboard"] diff --git a/src/main.rs b/src/main.rs index 2f1e7f3..a82c40a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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,17 @@ pub struct Opt { hash: Option, } +impl Opt { + fn get_paste(&self) -> bool { + #[cfg(feature = "paste")] { + return self.paste; + } + #[cfg(not(feature = "paste"))] { + return false; + } + } +} + /// Types of supported digest algorithm #[derive(Debug, PartialEq, Copy, Clone)] pub enum Algorithm { @@ -179,12 +191,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() { diff --git a/src/verify.rs b/src/verify.rs index 6ad9ea9..f5ba2a2 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -2,8 +2,8 @@ use super::{ Algorithm, CandidateHash, CandidateHashes, Hash, MatchLevel, MessageLevel, Opt, Verification, VerificationSource, }; -use clipboard::ClipboardContext; -use clipboard::ClipboardProvider; +#[cfg(feature = "paste")] +use clipboard::{ClipboardContext, ClipboardProvider}; use regex::Regex; use std::fs::File; use std::io; @@ -17,7 +17,7 @@ use std::path::PathBuf; pub fn get_candidate_hashes(opt: &Opt) -> Result, String> { if let Some(hash_string) = &opt.hash { return Ok(Some(get_by_parameter(hash_string)?)); - } else if opt.paste { + } else if opt.get_paste() { return Ok(Some(get_from_clipboard()?)); } else if let Some(hash_file) = &opt.hash_file { return Ok(Some(get_from_file(hash_file)?)); @@ -43,28 +43,33 @@ fn get_by_parameter(param: &str) -> Result { /// Generate a candidate hash from the system clipboard, or throw an error. fn get_from_clipboard() -> Result { - let mut ctx: ClipboardContext = match ClipboardProvider::new() { - Ok(ctx) => ctx, - Err(e) => return Err(format!("Error getting system clipboard: {}", e)), - }; - - let possible_hash = match ctx.get_contents() { - Ok(value) => value, - Err(e) => format!("Error reading from clipboard: {}", e), - }; - - let bytes = hex::decode(&possible_hash) - .map_err(|_| "Clipboard contains invalid or truncated hex".to_owned())?; - let alg = Algorithm::from_len(bytes.len())?; - let candidate = CandidateHash { - filename: None, - bytes, - }; - Ok(CandidateHashes { - alg, - hashes: vec![candidate], - source: VerificationSource::Clipboard, - }) + #[cfg(feature = "paste")] { + let mut ctx: ClipboardContext = match ClipboardProvider::new() { + Ok(ctx) => ctx, + Err(e) => return Err(format!("Error getting system clipboard: {}", e)), + }; + + let possible_hash = match ctx.get_contents() { + Ok(value) => value, + Err(e) => format!("Error reading from clipboard: {}", e), + }; + + let bytes = hex::decode(&possible_hash) + .map_err(|_| "Clipboard contains invalid or truncated hex".to_owned())?; + let alg = Algorithm::from_len(bytes.len())?; + let candidate = CandidateHash { + filename: None, + bytes, + }; + return Ok(CandidateHashes { + alg, + hashes: vec![candidate], + source: VerificationSource::Clipboard, + }); + } + #[cfg(not(feature = "paste"))] { + return Err("Paste not implemented".to_owned()); + } } /// Generate a candidate hash from the digests file specified (could be "-" for STDIN), or throw an error.