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