wezterm_dynamic/
todynamic.rs1use crate::object::Object;
2use crate::value::Value;
3use ordered_float::OrderedFloat;
4use std::collections::{BTreeMap, HashMap};
5
6pub trait ToDynamic {
10 fn to_dynamic(&self) -> Value;
11}
12
13pub trait PlaceDynamic {
19 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}