ic_memory/schema.rs
1use serde::{Deserialize, Serialize};
2
3///
4/// SchemaMetadata
5///
6/// Optional diagnostic metadata for an in-place store schema.
7///
8/// This metadata helps humans and frameworks diagnose which schema version was
9/// declared in each generation. It is bounded and validated for durable ledger
10/// encoding, but it does not perform application schema migrations or validate
11/// stable data semantics.
12///
13
14#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
15#[serde(deny_unknown_fields)]
16pub struct SchemaMetadata {
17 /// Optional in-place schema version.
18 pub schema_version: Option<u32>,
19}
20
21impl SchemaMetadata {
22 /// Construct schema metadata after validating the persisted encoding bounds.
23 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 /// Validate schema metadata encoding rules.
30 pub fn validate(&self) -> Result<(), SchemaMetadataError> {
31 if self.schema_version == Some(0) {
32 return Err(SchemaMetadataError::InvalidVersion);
33 }
34 Ok(())
35 }
36}
37
38///
39/// SchemaMetadataError
40///
41/// Schema metadata validation failure.
42///
43
44#[derive(Clone, Debug, Eq, thiserror::Error, PartialEq)]
45pub enum SchemaMetadataError {
46 /// Schema version zero is reserved for absence.
47 #[error("schema_version must be greater than zero when present")]
48 InvalidVersion,
49}