summaryrefslogtreecommitdiff
path: root/src/values/rotation.rs
diff options
context:
space:
mode:
authorpml68 <contact@pml68.dev>2025-02-24 22:31:58 +0100
committerpml68 <contact@pml68.dev>2025-02-24 22:31:58 +0100
commitfb58080059510de9293fddaad7c543a3089b3824 (patch)
tree21535ce88aaaa8efe8e9ce1e919916a2c73b0b28 /src/values/rotation.rs
parentfeat: create separate `ValueFromStr` struct (diff)
downloadiced-builder-fb58080059510de9293fddaad7c543a3089b3824.tar.gz
feat: implement `ValueFromStr` for Rotation
Diffstat (limited to 'src/values/rotation.rs')
-rw-r--r--src/values/rotation.rs37
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)?)))
+ }
+ }
+}