Skip to main content

marser_trace_schema/
version.rs

1//! AI assistance: this file was written with AI assistance. The maintainer reviewed it and did not find errors.
2//!
3//! On-disk `trace_version` policy for JSON traces.
4
5/// Version written in the `{ "trace_version", "nodes", "source_text?" }` JSON envelope.
6pub const SCHEMA_VERSION: u32 = 3;
7
8/// Lowest `trace_version` value this crate accepts when loading JSON.
9pub const SUPPORTED_TRACE_VERSION_MIN: u32 = 2;
10
11/// Highest `trace_version` value this crate accepts when loading JSON.
12pub const SUPPORTED_TRACE_VERSION_MAX: u32 = 3;
13
14#[derive(Clone, Debug, PartialEq, Eq)]
15pub struct UnsupportedTraceVersion {
16    pub found: u32,
17    pub min: u32,
18    pub max: u32,
19}
20
21impl std::fmt::Display for UnsupportedTraceVersion {
22    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
23        write!(
24            f,
25            "unsupported trace_version {} (supported {}..={})",
26            self.found, self.min, self.max
27        )
28    }
29}
30
31impl std::error::Error for UnsupportedTraceVersion {}
32
33/// Validates `trace_version` from a JSON object payload.
34///
35/// `None` is treated as version [`SCHEMA_VERSION`] for backward compatibility.
36pub fn check_trace_version(version: Option<u32>) -> Result<(), UnsupportedTraceVersion> {
37    let v = version.unwrap_or(SCHEMA_VERSION);
38    if !(SUPPORTED_TRACE_VERSION_MIN..=SUPPORTED_TRACE_VERSION_MAX).contains(&v) {
39        return Err(UnsupportedTraceVersion {
40            found: v,
41            min: SUPPORTED_TRACE_VERSION_MIN,
42            max: SUPPORTED_TRACE_VERSION_MAX,
43        });
44    }
45    Ok(())
46}