Skip to main content

diagnostics/
detail_level.rs

1use serde::{Deserialize, Serialize};
2
3/// Controls the level of detail in validation output.
4#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
5#[cfg_attr(feature = "wasm-bindings", derive(tsify::Tsify))]
6#[cfg_attr(feature = "wasm-bindings", tsify(from_wasm_abi))]
7#[cfg_attr(feature = "uniffi-bindings", derive(uniffi::Enum))]
8#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
9pub enum DetailLevel {
10    /// Flattened diagnostics without violation context.
11    Standard,
12    /// Includes violation context with actual values, constraints, and resolution sources.
13    #[default]
14    Detailed,
15}
16
17impl DetailLevel {
18    /// Whether diagnostics should be enriched with metadata (section, phase, category).
19    pub fn needs_enrichment(&self) -> bool {
20        matches!(self, DetailLevel::Detailed)
21    }
22
23    /// Whether this detail level requires violation context to be populated.
24    pub fn needs_context(&self) -> bool {
25        matches!(self, DetailLevel::Detailed)
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32
33    #[test]
34    fn default_is_detailed() {
35        assert_eq!(DetailLevel::default(), DetailLevel::Detailed);
36    }
37
38    #[test]
39    fn standard_skips_context_and_enrichment() {
40        assert!(!DetailLevel::Standard.needs_context());
41        assert!(!DetailLevel::Standard.needs_enrichment());
42    }
43
44    #[test]
45    fn detailed_requires_context_and_enrichment() {
46        assert!(DetailLevel::Detailed.needs_context());
47        assert!(DetailLevel::Detailed.needs_enrichment());
48    }
49}