1use super::*;
4use half::f16;
5use std::collections::HashMap;
6
7pub type Array<T> = Vec<T>;
8pub type Dictionary = HashMap<String, vt::Value>;
9
10#[derive(Debug, Clone)]
11pub struct Value {
12 store: ValueStore,
13}
14
15impl Value {
16 pub fn get_unchecked<T: ValueType>(&self) -> T {
17 T::load(&self.store).unwrap()
18 }
19
20 pub fn get<T: ValueType>(&self) -> Option<T> {
21 T::load(&self.store)
22 }
23
24 pub fn new<T: ValueType>(value: T) -> Self {
25 Value {
26 store: value.store(),
27 }
28 }
29
30 pub fn empty() -> Self {
31 Value {
32 store: ValueStore::Empty,
33 }
34 }
35
36 pub fn is_empty(&self) -> bool {
37 matches!(self.store, ValueStore::Empty)
38 }
39}
40
41#[derive(Debug, Clone)]
42pub enum ValueStore {
43 Empty,
44
45 Bool(bool),
46 BoolArray(Array<bool>),
47
48 UChar(u8),
49 UCharArray(Array<u8>),
50
51 IntArray(Array<i32>),
52 UIntArray(Array<u32>),
53
54 Int(i32),
55 Half(f16),
56 HalfArray(Array<f16>),
57 Float(f32),
58 FloatArray(Array<f32>),
59 Double(f64),
60 DoubleArray(Array<f64>),
61
62 Vec2i(gf::Vec2i),
63 Vec2h(gf::Vec2h),
64 Vec2f(gf::Vec2f),
65 Vec2fArray(Array<gf::Vec2f>),
66 Vec2d(gf::Vec2d),
67
68 Vec3i(gf::Vec3i),
69 Vec3h(gf::Vec3h),
70 Vec3f(gf::Vec3f),
71 Vec3fArray(Array<gf::Vec3f>),
72 Vec3d(gf::Vec3d),
73
74 Vec4i(gf::Vec4i),
75 Vec4h(gf::Vec4h),
76 Vec4f(gf::Vec4f),
77 Vec4fArray(Array<gf::Vec4f>),
78 Vec4d(gf::Vec4d),
79
80 Quath(gf::Quath),
81 Quatf(gf::Quatf),
82 Quatd(gf::Quatd),
83
84 Matrix2d(gf::Matrix2d),
85 Matrix3d(gf::Matrix3d),
86 Matrix4d(gf::Matrix4d),
87
88 Token(tf::Token),
89 TokenArray(Array<tf::Token>),
90
91 String(String),
92 StringArray(Array<String>),
93
94 IntListOp(sdf::IntListOp),
95 UIntListOp(sdf::UIntListOp),
96 Int64ListOp(sdf::Int64ListOp),
97 UInt64ListOp(sdf::UInt64ListOp),
98
99 TokenListOp(sdf::TokenListOp),
100 StringListOp(sdf::StringListOp),
101 PathListOp(sdf::PathListOp),
102 ReferenceListOp(sdf::ReferenceListOp),
103 PayloadListOp(sdf::PayloadListOp),
104
105 Path(sdf::Path),
106 AssetPath(sdf::AssetPath),
107
108 Specifier(sdf::Specifier),
109 Variability(sdf::Variability),
110
111 Dictionary(Dictionary),
112}
113
114pub trait ValueType {
115 fn load(store: &ValueStore) -> Option<Self>
116 where
117 Self: Sized;
118 fn store(self) -> ValueStore;
119}
120
121macro_rules! impl_value_type_clone {
122 ($type:ty, $store:ident) => {
123 impl ValueType for $type {
124 fn load(store: &ValueStore) -> Option<Self> {
125 match store {
126 ValueStore::$store(v) => Some(v.clone()),
127 _ => None,
128 }
129 }
130
131 fn store(self) -> ValueStore {
132 ValueStore::$store(self)
133 }
134 }
135
136 impl From<$type> for Value {
137 fn from(value: $type) -> Self {
138 Value {
139 store: ValueStore::$store(value),
140 }
141 }
142 }
143 };
144}
145
146macro_rules! impl_value_type_deref {
147 ($type:ty, $store:ident) => {
148 impl ValueType for $type {
149 fn load(store: &ValueStore) -> Option<Self> {
150 match store {
151 ValueStore::$store(v) => Some(*v),
152 _ => None,
153 }
154 }
155
156 fn store(self) -> ValueStore {
157 ValueStore::$store(self)
158 }
159 }
160
161 impl From<$type> for Value {
162 fn from(value: $type) -> Self {
163 Value {
164 store: ValueStore::$store(value),
165 }
166 }
167 }
168 };
169}
170
171impl_value_type_deref!(bool, Bool);
172impl_value_type_clone!(Array<bool>, BoolArray);
173
174impl_value_type_deref!(u8, UChar);
175impl_value_type_clone!(Array<u8>, UCharArray);
176
177impl_value_type_clone!(Array<i32>, IntArray);
178impl_value_type_clone!(Array<u32>, UIntArray);
179
180impl_value_type_clone!(tf::Token, Token);
181impl_value_type_clone!(Array<tf::Token>, TokenArray);
182
183impl_value_type_clone!(String, String);
184impl_value_type_clone!(Array<String>, StringArray);
185
186impl_value_type_clone!(sdf::IntListOp, IntListOp);
187impl_value_type_clone!(sdf::UIntListOp, UIntListOp);
188impl_value_type_clone!(sdf::Int64ListOp, Int64ListOp);
189impl_value_type_clone!(sdf::UInt64ListOp, UInt64ListOp);
190
191impl_value_type_clone!(sdf::Path, Path);
192impl_value_type_clone!(sdf::AssetPath, AssetPath);
193
194impl_value_type_deref!(i32, Int);
195impl_value_type_deref!(f16, Half);
196impl_value_type_clone!(Array<f16>, HalfArray);
197impl_value_type_deref!(f32, Float);
198impl_value_type_clone!(Array<f32>, FloatArray);
199impl_value_type_deref!(f64, Double);
200impl_value_type_clone!(Array<f64>, DoubleArray);
201
202impl_value_type_deref!(gf::Vec2i, Vec2i);
203impl_value_type_deref!(gf::Vec2h, Vec2h);
204impl_value_type_deref!(gf::Vec2f, Vec2f);
205impl_value_type_clone!(Array<gf::Vec2f>, Vec2fArray);
206impl_value_type_deref!(gf::Vec2d, Vec2d);
207
208impl_value_type_deref!(gf::Vec3i, Vec3i);
209impl_value_type_deref!(gf::Vec3h, Vec3h);
210impl_value_type_deref!(gf::Vec3f, Vec3f);
211impl_value_type_clone!(Array<gf::Vec3f>, Vec3fArray);
212impl_value_type_deref!(gf::Vec3d, Vec3d);
213
214impl_value_type_deref!(gf::Vec4i, Vec4i);
215impl_value_type_deref!(gf::Vec4h, Vec4h);
216impl_value_type_deref!(gf::Vec4f, Vec4f);
217impl_value_type_clone!(Array<gf::Vec4f>, Vec4fArray);
218impl_value_type_deref!(gf::Vec4d, Vec4d);
219
220impl_value_type_deref!(gf::Quath, Quath);
221impl_value_type_deref!(gf::Quatf, Quatf);
222impl_value_type_deref!(gf::Quatd, Quatd);
223
224impl_value_type_deref!(gf::Matrix2d, Matrix2d);
225impl_value_type_deref!(gf::Matrix3d, Matrix3d);
226impl_value_type_deref!(gf::Matrix4d, Matrix4d);
227
228impl_value_type_deref!(sdf::Specifier, Specifier);
229impl_value_type_deref!(sdf::Variability, Variability);
230
231impl_value_type_clone!(Dictionary, Dictionary);
232
233impl_value_type_clone!(sdf::PathListOp, PathListOp);