1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
15#[serde(deny_unknown_fields)]
16pub struct SchemaMetadata {
17 #[serde(deserialize_with = "crate::cbor::deserialize_present_option")]
19 pub(crate) schema_version: Option<u32>,
20}
21
22impl SchemaMetadata {
23 pub fn new(schema_version: Option<u32>) -> Result<Self, SchemaMetadataError> {
25 let metadata = Self { schema_version };
26 metadata.validate()?;
27 Ok(metadata)
28 }
29
30 pub fn validate(&self) -> Result<(), SchemaMetadataError> {
32 if self.schema_version == Some(0) {
33 return Err(SchemaMetadataError::InvalidVersion);
34 }
35 Ok(())
36 }
37
38 #[must_use]
40 pub const fn schema_version(&self) -> Option<u32> {
41 self.schema_version
42 }
43}
44
45#[non_exhaustive]
52#[derive(Clone, Debug, Eq, thiserror::Error, PartialEq)]
53pub enum SchemaMetadataError {
54 #[error("schema_version must be greater than zero when present")]
56 InvalidVersion,
57}