wezterm_dynamic/
todynamic.rs

1use crate::object::Object;
2use crate::value::Value;
3use ordered_float::OrderedFloat;
4use std::collections::{BTreeMap, HashMap};
5
6/// The ToDynamic trait allows a type to emit a representation of itself
7/// as the Value type.
8/// This trait can be derived.
9pub trait ToDynamic {
10    fn to_dynamic(&self) -> Value;
11}
12
13/// The PlaceDynamic trait is used by derived implementations of FromDynamic
14/// to implement flattened conversions.
15/// Deriving FromDynamic for a struct will usually also derive
16/// PlaceDynamic for the same struct.
17/// You do not typically consume PlaceDynamic directly.
18pub trait PlaceDynamic {
19    /// Convert from Self to Value, by storing directly into the
20    /// target Object.
21    fn place_dynamic(&self, place: &mut Object);
22}
23
24impl ToDynamic for Value {
25    fn to_dynamic(&self) -> Value {
26        self.clone()
27    }
28}
29
30impl ToDynamic for ordered_float::NotNan<f64> {
31    fn to_dynamic(&self) -> Value {
32        Value::F64(OrderedFloat::from(**self))
33    }
34}
35
36impl ToDynamic for std::time::Duration {
37    fn to_dynamic(&self) -> Value {
38        Value::F64(OrderedFloat(self.as_secs_f64()))
39    }
40}
41
42impl<K: ToDynamic + ToString + 'static, T: ToDynamic> ToDynamic for HashMap<K, T> {
43    fn to_dynamic(&self) -> Value {
44        Value::Object(
45            self.iter()
46                .map(|(k, v)| (k.to_dynamic(), v.to_dynamic()))
47                .collect::<BTreeMap<_, _>>()
48                .into(),
49        )
50    }
51}
52
53impl<T: ToDynamic> ToDynamic for std::sync::Arc<T> {
54    fn to_dynamic(&self) -> Value {
55        self.as_ref().to_dynamic()
56    }
57}
58
59impl<T: ToDynamic> ToDynamic for Box<T> {
60    fn to_dynamic(&self) -> Value {
61        self.as_ref().to_dynamic()
62    }
63}
64
65impl<T: ToDynamic> ToDynamic for Option<T> {
66    fn to_dynamic(&self) -> Value {
67        match self {
68            None => Value::Null,
69            Some(t) => t.to_dynamic(),
70        }
71    }
72}
73
74impl<T: ToDynamic, const N: usize> ToDynamic for [T; N] {
75    fn to_dynamic(&self) -> Value {
76        Value::Array(
77            self.iter()
78                .map(T::to_dynamic)
79                .collect::<Vec<Value>>()
80                .into(),
81        )
82    }
83}
84
85impl<T: ToDynamic> ToDynamic for Vec<T> {
86    fn to_dynamic(&self) -> Value {
87        Value::Array(
88            self.iter()
89                .map(T::to_dynamic)
90                .collect::<Vec<Value>>()
91                .into(),
92        )
93    }
94}
95
96impl ToDynamic for () {
97    fn to_dynamic(&self) -> Value {
98        Value::Null
99    }
100}
101
102impl ToDynamic for bool {
103    fn to_dynamic(&self) -> Value {
104        Value::Bool(*self)
105    }
106}
107
108impl ToDynamic for str {
109    fn to_dynamic(&self) -> Value {
110        Value::String(self.to_string())
111    }
112}
113
114impl ToDynamic for std::path::PathBuf {
115    fn to_dynamic(&self) -> Value {
116        Value::String(self.to_string_lossy().to_string())
117    }
118}
119
120impl ToDynamic for String {
121    fn to_dynamic(&self) -> Value {
122        Value::String(self.to_string())
123    }
124}
125
126impl ToDynamic for char {
127    fn to_dynamic(&self) -> Value {
128        Value::String(self.to_string())
129    }
130}
131
132impl ToDynamic for isize {
133    fn to_dynamic(&self) -> Value {
134        Value::I64((*self).try_into().unwrap())
135    }
136}
137
138impl ToDynamic for i8 {
139    fn to_dynamic(&self) -> Value {
140        Value::I64((*self).into())
141    }
142}
143
144impl ToDynamic for i16 {
145    fn to_dynamic(&self) -> Value {
146        Value::I64((*self).into())
147    }
148}
149
150impl ToDynamic for i32 {
151    fn to_dynamic(&self) -> Value {
152        Value::I64((*self).into())
153    }
154}
155
156impl ToDynamic for i64 {
157    fn to_dynamic(&self) -> Value {
158        Value::I64(*self)
159    }
160}
161
162impl ToDynamic for usize {
163    fn to_dynamic(&self) -> Value {
164        Value::U64((*self).try_into().unwrap())
165    }
166}
167
168impl ToDynamic for u8 {
169    fn to_dynamic(&self) -> Value {
170        Value::U64((*self).into())
171    }
172}
173
174impl ToDynamic for u16 {
175    fn to_dynamic(&self) -> Value {
176        Value::U64((*self).into())
177    }
178}
179
180impl ToDynamic for u32 {
181    fn to_dynamic(&self) -> Value {
182        Value::U64((*self).into())
183    }
184}
185
186impl ToDynamic for u64 {
187    fn to_dynamic(&self) -> Value {
188        Value::U64(*self)
189    }
190}
191
192impl ToDynamic for f64 {
193    fn to_dynamic(&self) -> Value {
194        Value::F64(OrderedFloat(*self))
195    }
196}
197
198impl ToDynamic for f32 {
199    fn to_dynamic(&self) -> Value {
200        Value::F64(OrderedFloat((*self).into()))
201    }
202}