diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2023-10-03 11:38:42 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2023-10-03 11:38:42 +0400 |
| commit | 7558ac14e6473c98bc4eea442b28a5ae330115ef (patch) | |
| tree | ba94429719e506167204500e3adbd506da6fc043 /src/config.rs | |
| parent | bb3fbe2e83e5173b7e0df40908280aec02dc1a4b (diff) | |
| download | niri-7558ac14e6473c98bc4eea442b28a5ae330115ef.tar.gz niri-7558ac14e6473c98bc4eea442b28a5ae330115ef.tar.bz2 niri-7558ac14e6473c98bc4eea442b28a5ae330115ef.zip | |
Add set-column-width action
Diffstat (limited to 'src/config.rs')
| -rw-r--r-- | src/config.rs | 98 |
1 files changed, 95 insertions, 3 deletions
diff --git a/src/config.rs b/src/config.rs index 7ff7e338..9f73518b 100644 --- a/src/config.rs +++ b/src/config.rs @@ -181,10 +181,10 @@ impl Default for Cursor { } } -#[derive(knuffel::Decode, Debug, Default, PartialEq, Eq)] +#[derive(knuffel::Decode, Debug, Default, PartialEq)] pub struct Binds(#[knuffel(children)] pub Vec<Bind>); -#[derive(knuffel::Decode, Debug, PartialEq, Eq)] +#[derive(knuffel::Decode, Debug, PartialEq)] pub struct Bind { #[knuffel(node_name)] pub key: Key, @@ -209,7 +209,7 @@ bitflags! { } } -#[derive(knuffel::Decode, Debug, Clone, PartialEq, Eq)] +#[derive(knuffel::Decode, Debug, Clone, PartialEq)] pub enum Action { #[knuffel(skip)] None, @@ -248,6 +248,15 @@ pub enum Action { MoveWindowToMonitorUp, SwitchPresetColumnWidth, MaximizeColumn, + SetColumnWidth(#[knuffel(argument, str)] SizeChange), +} + +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum SizeChange { + SetFixed(i32), + SetProportion(f64), + AdjustFixed(i32), + AdjustProportion(f64), } #[derive(knuffel::Decode, Debug, PartialEq)] @@ -383,6 +392,58 @@ impl FromStr for Key { } } +impl FromStr for SizeChange { + type Err = miette::Error; + + fn from_str(s: &str) -> Result<Self, Self::Err> { + match s.split_once('%') { + Some((value, empty)) => { + if !empty.is_empty() { + return Err(miette!("trailing characters after '%' are not allowed")); + } + + match value.bytes().next() { + Some(b'-' | b'+') => { + let value = value + .parse() + .into_diagnostic() + .context("error parsing value")?; + Ok(Self::AdjustProportion(value)) + } + Some(_) => { + let value = value + .parse() + .into_diagnostic() + .context("error parsing value")?; + Ok(Self::SetProportion(value)) + } + None => Err(miette!("value is missing")), + } + } + None => { + let value = s; + match value.bytes().next() { + Some(b'-' | b'+') => { + let value = value + .parse() + .into_diagnostic() + .context("error parsing value")?; + Ok(Self::AdjustFixed(value)) + } + Some(_) => { + let value = value + .parse() + .into_diagnostic() + .context("error parsing value")?; + Ok(Self::SetFixed(value)) + } + None => Err(miette!("value is missing")), + } + } + } + } +} + #[cfg(test)] mod tests { use miette::NarratableReportHandler; @@ -586,4 +647,35 @@ mod tests { assert!("1920x1080@".parse::<Mode>().is_err()); assert!("1920x1080@60Hz".parse::<Mode>().is_err()); } + + #[test] + fn parse_size_change() { + assert_eq!( + "10".parse::<SizeChange>().unwrap(), + SizeChange::SetFixed(10), + ); + assert_eq!( + "+10".parse::<SizeChange>().unwrap(), + SizeChange::AdjustFixed(10), + ); + assert_eq!( + "-10".parse::<SizeChange>().unwrap(), + SizeChange::AdjustFixed(-10), + ); + assert_eq!( + "10%".parse::<SizeChange>().unwrap(), + SizeChange::SetProportion(10.), + ); + assert_eq!( + "+10%".parse::<SizeChange>().unwrap(), + SizeChange::AdjustProportion(10.), + ); + assert_eq!( + "-10%".parse::<SizeChange>().unwrap(), + SizeChange::AdjustProportion(-10.), + ); + + assert!("-".parse::<SizeChange>().is_err()); + assert!("10% ".parse::<SizeChange>().is_err()); + } } |
