1use crate::validation::{Checked, Error, USize64, Validate};
2use crate::{extensions, Extras, Index, Path, Root};
3use gltf_derive::Validate;
4use serde::{de, ser};
5use serde_derive::{Deserialize, Serialize};
6use std::fmt;
7
8pub const ARRAY_BUFFER: u32 = 34_962;
10
11pub const ELEMENT_ARRAY_BUFFER: u32 = 34_963;
13
14pub const MIN_BYTE_STRIDE: usize = 4;
16
17pub const MAX_BYTE_STRIDE: usize = 252;
19
20pub const VALID_TARGETS: &[u32] = &[ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER];
22
23#[derive(Clone, Copy, Debug, Eq, PartialEq)]
25pub enum Target {
26 ArrayBuffer = 1,
28
29 ElementArrayBuffer,
31}
32
33impl ser::Serialize for Target {
34 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
35 where
36 S: ser::Serializer,
37 {
38 match *self {
39 Target::ArrayBuffer => serializer.serialize_u32(ARRAY_BUFFER),
40 Target::ElementArrayBuffer => serializer.serialize_u32(ELEMENT_ARRAY_BUFFER),
41 }
42 }
43}
44
45#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, Hash, PartialEq, Serialize)]
47pub struct Stride(pub usize);
48
49impl Validate for Stride {
50 fn validate<P, R>(&self, _root: &Root, path: P, report: &mut R)
51 where
52 P: Fn() -> Path,
53 R: FnMut(&dyn Fn() -> Path, Error),
54 {
55 if self.0 < MIN_BYTE_STRIDE || self.0 > MAX_BYTE_STRIDE {
56 report(&path, Error::Invalid);
57 }
58 }
59}
60
61#[derive(Clone, Debug, Deserialize, Serialize, Validate)]
63pub struct Buffer {
64 #[serde(default, rename = "byteLength")]
66 pub byte_length: USize64,
67
68 #[cfg(feature = "names")]
70 #[cfg_attr(feature = "names", serde(skip_serializing_if = "Option::is_none"))]
71 pub name: Option<String>,
72
73 #[serde(skip_serializing_if = "Option::is_none")]
76 pub uri: Option<String>,
77
78 #[serde(default, skip_serializing_if = "Option::is_none")]
80 pub extensions: Option<extensions::buffer::Buffer>,
81
82 #[serde(default)]
84 #[cfg_attr(feature = "extras", serde(skip_serializing_if = "Option::is_none"))]
85 #[cfg_attr(not(feature = "extras"), serde(skip_serializing))]
86 pub extras: Extras,
87}
88
89#[derive(Clone, Debug, Deserialize, Serialize, Validate)]
94pub struct View {
95 pub buffer: Index<Buffer>,
97
98 #[serde(rename = "byteLength")]
100 pub byte_length: USize64,
101
102 #[serde(
104 default,
105 rename = "byteOffset",
106 skip_serializing_if = "Option::is_none"
107 )]
108 pub byte_offset: Option<USize64>,
109
110 #[serde(rename = "byteStride")]
114 #[serde(skip_serializing_if = "Option::is_none")]
115 pub byte_stride: Option<Stride>,
116
117 #[cfg(feature = "names")]
119 #[cfg_attr(feature = "names", serde(skip_serializing_if = "Option::is_none"))]
120 pub name: Option<String>,
121
122 #[serde(skip_serializing_if = "Option::is_none")]
124 pub target: Option<Checked<Target>>,
125
126 #[serde(default, skip_serializing_if = "Option::is_none")]
128 pub extensions: Option<extensions::buffer::View>,
129
130 #[serde(default)]
132 #[cfg_attr(feature = "extras", serde(skip_serializing_if = "Option::is_none"))]
133 #[cfg_attr(not(feature = "extras"), serde(skip_serializing))]
134 pub extras: Extras,
135}
136
137impl<'de> de::Deserialize<'de> for Checked<Target> {
138 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
139 where
140 D: de::Deserializer<'de>,
141 {
142 struct Visitor;
143 impl<'de> de::Visitor<'de> for Visitor {
144 type Value = Checked<Target>;
145
146 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
147 write!(f, "any of: {:?}", VALID_TARGETS)
148 }
149
150 fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
151 where
152 E: de::Error,
153 {
154 use self::Target::*;
155 use crate::validation::Checked::*;
156 Ok(match value as u32 {
157 ARRAY_BUFFER => Valid(ArrayBuffer),
158 ELEMENT_ARRAY_BUFFER => Valid(ElementArrayBuffer),
159 _ => Invalid,
160 })
161 }
162 }
163 deserializer.deserialize_u64(Visitor)
164 }
165}