summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Mühlbacher <tmuehlbacher@posteo.net>2024-05-30 18:31:10 +0200
committerThomas Mühlbacher <tmuehlbacher@posteo.net>2024-05-30 22:26:06 +0200
commit21b1111b59fe9935d12e2e23abd5261458c4d77e (patch)
treeb257e2cdf13e19eb33cab1f3b1cf45a73c49ce2d /src
parentde6e8ac23014b18795b08aad0e7a0b38323a49d3 (diff)
refactor: reduce `UnlockPolicy` boilerplate
Signed-off-by: Thomas Mühlbacher <tmuehlbacher@posteo.net>
Diffstat (limited to 'src')
-rw-r--r--src/commands/mount.rs3
-rw-r--r--src/key.rs55
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,
diff --git a/src/key.rs b/src/key.rs
index b8ddcd02..284d1844 100644
--- a/src/key.rs
+++ b/src/key.rs
@@ -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")),
}
}