Skip to main content

openusd_rs/
vt.rs

1//! Value Types
2
3use 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);