1#![cfg_attr(not(any(test, doc)), no_std)]
22
23extern crate alloc;
24
25pub use serde_json;
26
27pub mod json;
28
29mod accessor;
30mod animation;
31mod buffer;
32mod camera;
33mod image;
34mod material;
35mod mesh;
36mod node;
37mod sampler;
38mod scene;
39mod skin;
40mod texture;
41
42use alloc::borrow::Cow;
43use alloc::vec::Vec;
44use core::marker::PhantomData;
45
46use ownable::IntoOwned;
47use serde::Deserialize;
48
49pub use crate::accessor::*;
50pub use crate::animation::*;
51pub use crate::buffer::*;
52pub use crate::camera::*;
53pub use crate::image::*;
54pub use crate::material::*;
55pub use crate::mesh::*;
56pub use crate::node::*;
57pub use crate::sampler::*;
58pub use crate::scene::*;
59pub use crate::skin::*;
60pub use crate::texture::*;
61
62#[derive(Clone, Copy, Deserialize)]
65#[serde(transparent)]
66pub struct Idx<T: 'static>(u32, PhantomData<T>);
67
68impl<T> ownable::traits::IntoOwned for Idx<T> {
69 type Owned = Self;
70
71 fn into_owned(self) -> Self::Owned {
72 self
73 }
74}
75
76impl<T> core::fmt::Debug for Idx<T> {
77 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
78 self.0.fmt(f)
79 }
80}
81
82impl<T: 'static> Idx<T> {
83 pub fn new(index: u32) -> Self {
85 Self(index, PhantomData)
86 }
87
88 pub fn get(self) -> u32 {
90 self.0
91 }
92
93 pub fn cast<U: 'static>(self) -> Idx<U> {
95 Idx(self.0, PhantomData)
96 }
97}
98
99#[derive(Clone, Deserialize, IntoOwned)]
101#[serde(transparent)]
102pub struct Extras<'a>(#[serde(borrow)] pub json::Value<'a>);
103
104impl core::fmt::Debug for Extras<'_> {
105 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
106 self.0.fmt(f)
107 }
108}
109
110#[derive(Clone, Deserialize, Default, IntoOwned)]
112#[serde(transparent)]
113pub struct Extensions<'a>(#[serde(borrow)] pub json::Object<'a>);
114
115impl core::fmt::Debug for Extensions<'_> {
116 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
117 self.0.fmt(f)
118 }
119}
120
121#[derive(Debug, Clone, Deserialize, IntoOwned)]
123pub struct Asset<'a> {
124 #[serde(borrow)]
126 pub copyright: Option<Cow<'a, str>>,
127 #[serde(borrow)]
129 pub generator: Option<Cow<'a, str>>,
130 #[serde(borrow)]
132 pub version: Cow<'a, str>,
133 #[serde(rename = "minVersion")]
135 #[serde(borrow)]
136 pub min_version: Option<Cow<'a, str>>,
137
138 #[serde(borrow)]
139 pub extensions: Option<Extensions<'a>>,
140 #[serde(borrow)]
141 pub extras: Option<Extras<'a>>,
142}
143
144#[derive(Debug, Clone, Deserialize, IntoOwned)]
146pub struct Root<'a> {
147 pub asset: Asset<'a>,
149 #[serde(rename = "extensionsUsed")]
151 #[serde(default, borrow)]
152 pub extensions_used: Vec<Cow<'a, str>>,
153 #[serde(rename = "extensionsRequired")]
155 #[serde(default, borrow)]
156 pub extensions_required: Vec<Cow<'a, str>>,
157 pub scene: Option<Idx<Scene<'static>>>,
159
160 #[serde(default, borrow)]
162 pub accessors: Vec<Accessor<'a>>,
163 #[serde(default, borrow)]
165 pub animations: Vec<Animation<'a>>,
166 #[serde(default, borrow)]
168 pub buffers: Vec<Buffer<'a>>,
169 #[serde(rename = "bufferViews")]
171 #[serde(default, borrow)]
172 pub buffer_views: Vec<BufferView<'a>>,
173 #[serde(default, borrow)]
175 pub cameras: Vec<Camera<'a>>,
176 #[serde(default, borrow)]
178 pub images: Vec<Image<'a>>,
179 #[serde(default, borrow)]
181 pub materials: Vec<Material<'a>>,
182 #[serde(default, borrow)]
184 pub meshes: Vec<Mesh<'a>>,
185 #[serde(default, borrow)]
187 pub nodes: Vec<Node<'a>>,
188 #[serde(default, borrow)]
190 pub samplers: Vec<Sampler<'a>>,
191 #[serde(default, borrow)]
193 pub scenes: Vec<Scene<'a>>,
194 #[serde(default, borrow)]
196 pub skins: Vec<Skin<'a>>,
197 #[serde(default, borrow)]
199 pub textures: Vec<Texture<'a>>,
200
201 #[serde(borrow)]
202 pub extensions: Option<Extensions<'a>>,
203 #[serde(borrow)]
204 pub extras: Option<Extras<'a>>,
205}
206
207impl<'a> Root<'a> {
208 #[expect(
210 clippy::should_implement_trait,
211 reason = "looks like FromStr but can't be implemented as it because of lifetimes"
212 )]
213 pub fn from_str(s: &'a str) -> serde_json::Result<Self> {
214 serde_json::from_str(s)
215 }
216}