diff options
| author | pml68 <contact@pml68.dev> | 2025-02-24 22:31:58 +0100 |
|---|---|---|
| committer | pml68 <contact@pml68.dev> | 2025-02-24 22:31:58 +0100 |
| commit | fb58080059510de9293fddaad7c543a3089b3824 (patch) | |
| tree | 21535ce88aaaa8efe8e9ce1e919916a2c73b0b28 /src/values/rotation.rs | |
| parent | feat: create separate `ValueFromStr` struct (diff) | |
| download | iced-builder-fb58080059510de9293fddaad7c543a3089b3824.tar.gz | |
feat: implement `ValueFromStr` for Rotation
Diffstat (limited to 'src/values/rotation.rs')
| -rw-r--r-- | src/values/rotation.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/values/rotation.rs b/src/values/rotation.rs new file mode 100644 index 0000000..2b7a223 --- /dev/null +++ b/src/values/rotation.rs @@ -0,0 +1,37 @@ +use std::num::ParseFloatError; +use std::str::FromStr; + +use iced::{Radians, Rotation}; + +use super::ValueFromStr; + +#[derive(Debug, thiserror::Error)] +pub enum ParseRotationError { + #[error("float parsing error: {0}")] + ParseFloatError(ParseFloatError), + #[error("invalid prefix")] + InvalidPrefix, +} + +impl From<ParseFloatError> for ParseRotationError { + fn from(value: ParseFloatError) -> Self { + Self::ParseFloatError(value) + } +} + +impl ValueFromStr for Rotation { + type Err = ParseRotationError; + + fn value_from_str(s: &str) -> Result<Self, Self::Err> { + if s.starts_with(|c: char| !c.is_digit(10)) { + let (prefix, value) = s.split_at(1); + match prefix { + "s" => Ok(Rotation::Solid(Radians(f32::from_str(value)?))), + "f" => Ok(Rotation::Floating(Radians(f32::from_str(value)?))), + _ => Err(ParseRotationError::InvalidPrefix), + } + } else { + Ok(Rotation::Floating(Radians(f32::from_str(s)?))) + } + } +} |
