hlctl/src/hlwm/pad.rs

66 lines
1.8 KiB
Rust

use std::{fmt::Display, str::FromStr};
use crate::split;
use super::parser::{FromStrings, ParseError};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Pad {
Unchanged,
Up(u32),
UpRight(u32, u32),
UpRightDown(u32, u32, u32),
UpRightDownLeft(u32, u32, u32, u32),
}
impl FromStrings for Pad {
fn from_strings<I: Iterator<Item = String>>(s: I) -> Result<Self, ParseError> {
let parts = s.collect::<Vec<_>>();
match parts.len() {
0 => Err(ParseError::Empty),
1 => Ok(Pad::Up(parts[0].parse()?)),
2 => Ok(Pad::UpRight(parts[0].parse()?, parts[1].parse()?)),
3 => Ok(Pad::UpRightDown(
parts[0].parse()?,
parts[1].parse()?,
parts[2].parse()?,
)),
_ => Ok(Pad::UpRightDownLeft(
parts[0].parse()?,
parts[1].parse()?,
parts[2].parse()?,
parts[3].parse()?,
)),
}
}
}
impl FromStr for Pad {
type Err = ParseError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let parts = split::tab_or_space(s);
Self::from_strings(parts.into_iter())
}
}
impl Display for Pad {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Pad::Unchanged => Ok(()),
Pad::Up(up) => f.write_str(&up.to_string()),
Pad::UpRight(up, right) => write!(f, "{up}\t{right}"),
Pad::UpRightDown(up, right, down) => write!(f, "{up}\t{right}\t{down}"),
Pad::UpRightDownLeft(up, right, down, left) => {
write!(f, "{up}\t{right}\t{down}\t{left}")
}
}
}
}
impl Default for Pad {
fn default() -> Self {
Pad::Unchanged
}
}