#![cfg_attr(not(any(test, doc)), no_std)]
extern crate alloc;
pub use serde_json;
pub mod json;
mod accessor;
mod animation;
mod buffer;
mod camera;
mod image;
mod material;
mod mesh;
mod node;
mod sampler;
mod scene;
mod skin;
mod texture;
use alloc::borrow::Cow;
use alloc::vec::Vec;
use core::marker::PhantomData;
use ownable::IntoOwned;
use serde::Deserialize;
pub use crate::accessor::*;
pub use crate::animation::*;
pub use crate::buffer::*;
pub use crate::camera::*;
pub use crate::image::*;
pub use crate::material::*;
pub use crate::mesh::*;
pub use crate::node::*;
pub use crate::sampler::*;
pub use crate::scene::*;
pub use crate::skin::*;
pub use crate::texture::*;
#[derive(Clone, Copy, Deserialize)]
#[serde(transparent)]
pub struct Idx<T: 'static>(u32, PhantomData<T>);
impl<T> ownable::traits::IntoOwned for Idx<T> {
type Owned = Self;
fn into_owned(self) -> Self::Owned {
self
}
}
impl<T> core::fmt::Debug for Idx<T> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
self.0.fmt(f)
}
}
impl<T: 'static> Idx<T> {
pub fn new(index: u32) -> Self {
Self(index, PhantomData)
}
pub fn get(self) -> u32 {
self.0
}
pub fn cast<U: 'static>(self) -> Idx<U> {
Idx(self.0, PhantomData)
}
}
#[derive(Clone, Deserialize, IntoOwned)]
#[serde(transparent)]
pub struct Extras<'a>(#[serde(borrow)] pub json::Value<'a>);
impl core::fmt::Debug for Extras<'_> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
self.0.fmt(f)
}
}
#[derive(Clone, Deserialize, Default, IntoOwned)]
#[serde(transparent)]
pub struct Extensions<'a>(#[serde(borrow)] pub json::Object<'a>);
impl core::fmt::Debug for Extensions<'_> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
self.0.fmt(f)
}
}
#[derive(Debug, Clone, Deserialize, IntoOwned)]
pub struct Asset<'a> {
#[serde(borrow)]
pub copyright: Option<Cow<'a, str>>,
#[serde(borrow)]
pub generator: Option<Cow<'a, str>>,
#[serde(borrow)]
pub version: Cow<'a, str>,
#[serde(rename = "minVersion")]
#[serde(borrow)]
pub min_version: Option<Cow<'a, str>>,
#[serde(borrow)]
pub extensions: Option<Extensions<'a>>,
#[serde(borrow)]
pub extras: Option<Extras<'a>>,
}
#[derive(Debug, Clone, Deserialize, IntoOwned)]
pub struct Root<'a> {
pub asset: Asset<'a>,
#[serde(rename = "extensionsUsed")]
#[serde(default, borrow)]
pub extensions_used: Vec<Cow<'a, str>>,
#[serde(rename = "extensionsRequired")]
#[serde(default, borrow)]
pub extensions_required: Vec<Cow<'a, str>>,
pub scene: Option<Idx<Scene<'static>>>,
#[serde(default, borrow)]
pub accessors: Vec<Accessor<'a>>,
#[serde(default, borrow)]
pub animations: Vec<Animation<'a>>,
#[serde(default, borrow)]
pub buffers: Vec<Buffer<'a>>,
#[serde(rename = "bufferViews")]
#[serde(default, borrow)]
pub buffer_views: Vec<BufferView<'a>>,
#[serde(default, borrow)]
pub cameras: Vec<Camera<'a>>,
#[serde(default, borrow)]
pub images: Vec<Image<'a>>,
#[serde(default, borrow)]
pub materials: Vec<Material<'a>>,
#[serde(default, borrow)]
pub meshes: Vec<Mesh<'a>>,
#[serde(default, borrow)]
pub nodes: Vec<Node<'a>>,
#[serde(default, borrow)]
pub samplers: Vec<Sampler<'a>>,
#[serde(default, borrow)]
pub scenes: Vec<Scene<'a>>,
#[serde(default, borrow)]
pub skins: Vec<Skin<'a>>,
#[serde(default, borrow)]
pub textures: Vec<Texture<'a>>,
#[serde(borrow)]
pub extensions: Option<Extensions<'a>>,
#[serde(borrow)]
pub extras: Option<Extras<'a>>,
}
impl<'a> Root<'a> {
#[expect(
clippy::should_implement_trait,
reason = "looks like FromStr but can't be implemented as it because of lifetimes"
)]
pub fn from_str(s: &'a str) -> serde_json::Result<Self> {
serde_json::from_str(s)
}
}