mockforge_core/overrides/
models.rs

1//! Override data models and types
2//!
3//! This module defines the core data structures for the override system:
4//! - OverrideRule: Configuration for applying overrides
5//! - OverrideMode: How patches are applied
6//! - PatchOp: Individual patch operations
7//! - Overrides: Container for multiple rules
8
9use serde::{Deserialize, Serialize};
10use serde_json::Value;
11use std::collections::HashMap;
12
13/// Override rule configuration
14#[derive(Debug, Clone, Deserialize, Serialize)]
15pub struct OverrideRule {
16    /// Target selectors: "operation:opId", "tag:Tag", "regex:pattern", or "path:pattern"
17    pub targets: Vec<String>,
18    /// JSON patch operations to apply
19    pub patch: Vec<PatchOp>,
20    /// Optional condition expression
21    pub when: Option<String>,
22    /// Override mode: "replace" (default) or "merge"
23    #[serde(default = "default_mode")]
24    pub mode: OverrideMode,
25    /// Whether to apply post-templating expansion after patching
26    #[serde(default = "default_post_templating")]
27    pub post_templating: bool,
28}
29
30/// Override mode for applying patches
31#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
32pub enum OverrideMode {
33    /// Replace values (default JSON patch behavior)
34    #[serde(rename = "replace")]
35    Replace,
36    /// Merge objects and arrays instead of replacing
37    #[serde(rename = "merge")]
38    Merge,
39}
40
41/// JSON patch operation
42#[derive(Debug, Clone, Deserialize, Serialize)]
43#[serde(tag = "op")]
44pub enum PatchOp {
45    #[serde(rename = "add")]
46    Add { path: String, value: Value },
47    #[serde(rename = "replace")]
48    Replace { path: String, value: Value },
49    #[serde(rename = "remove")]
50    Remove { path: String },
51}
52
53/// Container for override rules with caching
54#[derive(Debug, Default, Clone, Deserialize, Serialize)]
55pub struct Overrides {
56    /// Loaded override rules
57    pub rules: Vec<OverrideRule>,
58    /// Compiled regex patterns for performance
59    #[serde(skip)]
60    pub regex_cache: HashMap<String, regex::Regex>,
61}
62
63fn default_mode() -> OverrideMode {
64    OverrideMode::Replace
65}
66
67fn default_post_templating() -> bool {
68    false
69}