summaryrefslogtreecommitdiff
path: root/src/eval/value.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2022-04-08 14:48:02 +0200
committerLaurenz <laurmaedje@gmail.com>2022-04-08 14:48:02 +0200
commite1d7edb7c1845e6df6f5e23e3baf7bc88159eade (patch)
tree4256919d2be06abdaf5267ac804cfc9d4d3a8dc5 /src/eval/value.rs
parent4bb6240b401605ef6d905273db07545e14f9a21f (diff)
Property resolving
Diffstat (limited to 'src/eval/value.rs')
-rw-r--r--src/eval/value.rs37
1 files changed, 24 insertions, 13 deletions
diff --git a/src/eval/value.rs b/src/eval/value.rs
index 44df89e2..12948d72 100644
--- a/src/eval/value.rs
+++ b/src/eval/value.rs
@@ -590,6 +590,19 @@ impl<T: Cast> Cast<Spanned<Value>> for Spanned<T> {
}
}
+impl<T: Cast> Cast for Option<T> {
+ fn is(value: &Value) -> bool {
+ matches!(value, Value::None) || T::is(value)
+ }
+
+ fn cast(value: Value) -> StrResult<Self> {
+ match value {
+ Value::None => Ok(None),
+ v => T::cast(v).map(Some).map_err(|msg| with_alternative(msg, "none")),
+ }
+ }
+}
+
/// A value that can be automatically determined.
#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum Smart<T> {
@@ -601,6 +614,17 @@ pub enum Smart<T> {
}
impl<T> Smart<T> {
+ /// Map the contained custom value with `f`.
+ pub fn map<F, U>(self, f: F) -> Smart<U>
+ where
+ F: FnOnce(T) -> U,
+ {
+ match self {
+ Self::Auto => Smart::Auto,
+ Self::Custom(x) => Smart::Custom(f(x)),
+ }
+ }
+
/// Returns the contained custom value or a provided default value.
pub fn unwrap_or(self, default: T) -> T {
match self {
@@ -627,19 +651,6 @@ impl<T> Default for Smart<T> {
}
}
-impl<T: Cast> Cast for Option<T> {
- fn is(value: &Value) -> bool {
- matches!(value, Value::None) || T::is(value)
- }
-
- fn cast(value: Value) -> StrResult<Self> {
- match value {
- Value::None => Ok(None),
- v => T::cast(v).map(Some).map_err(|msg| with_alternative(msg, "none")),
- }
- }
-}
-
impl<T: Cast> Cast for Smart<T> {
fn is(value: &Value) -> bool {
matches!(value, Value::Auto) || T::is(value)