use crate::{Extensions, Extras, Idx};
use alloc::borrow::Cow;
use ownable::IntoOwned;
use serde::Deserialize;
#[derive(Debug, Clone, Deserialize, IntoOwned)]
pub struct Buffer<'a> {
#[serde(borrow)]
pub name: Option<Cow<'a, str>>,
#[serde(borrow)]
pub uri: Option<Cow<'a, str>>,
#[serde(rename = "byteLength")]
pub byte_length: u64,
#[serde(borrow)]
pub extensions: Option<Extensions<'a>>,
#[serde(borrow)]
pub extras: Option<Extras<'a>>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BufferViewTargetEnum {
ArrayBuffer,
ElementArrayBuffer,
}
#[derive(Clone, Copy, PartialEq, Eq, Deserialize, IntoOwned)]
#[serde(transparent)]
pub struct BufferViewTarget(pub u64);
impl core::fmt::Debug for BufferViewTarget {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
if let Some(e) = self.to_enum() {
e.fmt(f)
} else {
self.0.fmt(f)
}
}
}
impl BufferViewTarget {
pub const ARRAY_BUFFER: Self = Self(34962);
pub const ELEMENT_ARRAY_BUFFER: Self = Self(34963);
pub fn to_enum(self) -> Option<BufferViewTargetEnum> {
Some(match self {
Self::ARRAY_BUFFER => BufferViewTargetEnum::ArrayBuffer,
Self::ELEMENT_ARRAY_BUFFER => BufferViewTargetEnum::ElementArrayBuffer,
_ => return None,
})
}
}
#[derive(Debug, Clone, Deserialize, IntoOwned)]
pub struct BufferView<'a> {
#[serde(borrow)]
pub name: Option<Cow<'a, str>>,
pub buffer: Idx<Buffer<'static>>,
#[serde(rename = "byteOffset")]
#[serde(default)]
pub byte_offset: u64,
#[serde(rename = "byteLength")]
pub byte_length: u64,
#[serde(rename = "byteStride")]
pub byte_stride: Option<u64>,
pub target: Option<BufferViewTarget>,
#[serde(borrow)]
pub extensions: Option<Extensions<'a>>,
#[serde(borrow)]
pub extras: Option<Extras<'a>>,
}