diff options
author | Thomas Mühlbacher <tmuehlbacher@posteo.net> | 2024-05-30 18:31:10 +0200 |
---|---|---|
committer | Thomas Mühlbacher <tmuehlbacher@posteo.net> | 2024-05-30 22:26:06 +0200 |
commit | 21b1111b59fe9935d12e2e23abd5261458c4d77e (patch) | |
tree | b257e2cdf13e19eb33cab1f3b1cf45a73c49ce2d /src | |
parent | de6e8ac23014b18795b08aad0e7a0b38323a49d3 (diff) |
refactor: reduce `UnlockPolicy` boilerplate
Signed-off-by: Thomas Mühlbacher <tmuehlbacher@posteo.net>
Diffstat (limited to 'src')
-rw-r--r-- | src/commands/mount.rs | 3 | ||||
-rw-r--r-- | src/key.rs | 55 |
2 files changed, 10 insertions, 48 deletions
diff --git a/src/commands/mount.rs b/src/commands/mount.rs index 474f58ff..7f5937d0 100644 --- a/src/commands/mount.rs +++ b/src/commands/mount.rs @@ -231,7 +231,8 @@ pub struct Cli { #[arg( short = 'k', long = "key_location", - default_value = "ask", + value_enum, + default_value_t, verbatim_doc_comment )] unlock_policy: UnlockPolicy, @@ -1,63 +1,25 @@ use std::{ - fmt, fs, + fmt::Debug, + fs, io::{stdin, IsTerminal}, }; -use crate::c_str; use anyhow::anyhow; use bch_bindgen::bcachefs::bch_sb_handle; -use clap::builder::PossibleValue; use log::info; -#[derive(Clone, Debug)] +use crate::c_str; + +#[derive(Clone, Debug, clap::ValueEnum, strum::Display)] pub enum UnlockPolicy { - None, Fail, Wait, Ask, } -impl std::str::FromStr for UnlockPolicy { - type Err = anyhow::Error; - fn from_str(s: &str) -> anyhow::Result<Self> { - match s { - "" | "none" => Ok(UnlockPolicy::None), - "fail" => Ok(UnlockPolicy::Fail), - "wait" => Ok(UnlockPolicy::Wait), - "ask" => Ok(UnlockPolicy::Ask), - _ => Err(anyhow!("Invalid unlock policy provided")), - } - } -} - -impl clap::ValueEnum for UnlockPolicy { - fn value_variants<'a>() -> &'a [Self] { - &[ - UnlockPolicy::None, - UnlockPolicy::Fail, - UnlockPolicy::Wait, - UnlockPolicy::Ask, - ] - } - - fn to_possible_value(&self) -> Option<PossibleValue> { - Some(match self { - Self::None => PossibleValue::new("none").alias(""), - Self::Fail => PossibleValue::new("fail"), - Self::Wait => PossibleValue::new("wait"), - Self::Ask => PossibleValue::new("ask"), - }) - } -} - -impl fmt::Display for UnlockPolicy { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - UnlockPolicy::None => write!(f, "None"), - UnlockPolicy::Fail => write!(f, "Fail"), - UnlockPolicy::Wait => write!(f, "Wait"), - UnlockPolicy::Ask => write!(f, "Ask"), - } +impl Default for UnlockPolicy { + fn default() -> Self { + Self::Ask } } @@ -185,6 +147,5 @@ pub fn apply_key_unlocking_policy( UnlockPolicy::Fail => Err(anyhow!("no passphrase available")), UnlockPolicy::Wait => Ok(wait_for_unlock(&block_device.sb().uuid())?), UnlockPolicy::Ask => ask_for_passphrase(block_device), - _ => Err(anyhow!("no unlock policy specified for locked filesystem")), } } |