Skip to main content

mockforge_core/
openapi_rewriter.rs

1//! Concrete [`ResponseRewriter`] implementation for core.
2//!
3//! [`ResponseRewriter`]: mockforge_openapi::response_rewriter::ResponseRewriter
4//!
5//! Wraps core's `templating::expand_tokens` and the optional
6//! [`Overrides`](crate::overrides::Overrides) engine so the OpenAPI router
7//! (which now depends only on the `ResponseRewriter` trait) can dispatch
8//! through it without core's templating/conditions graph bleeding into
9//! `mockforge-openapi`.
10
11use crate::overrides::Overrides;
12use crate::templating::expand_tokens as core_expand_tokens;
13use mockforge_openapi::response_rewriter::ResponseRewriter;
14use serde_json::Value;
15
16/// Core's `ResponseRewriter` implementation — chains core's templating
17/// expander and (optionally) an `Overrides` ruleset.
18#[derive(Debug, Default, Clone)]
19pub struct CoreResponseRewriter {
20    /// Optional overrides ruleset. When `None`, [`apply_overrides`] is a
21    /// no-op.
22    ///
23    /// [`apply_overrides`]: ResponseRewriter::apply_overrides
24    pub overrides: Option<Overrides>,
25}
26
27impl CoreResponseRewriter {
28    /// Construct a rewriter with the given optional overrides ruleset.
29    pub fn new(overrides: Option<Overrides>) -> Self {
30        Self { overrides }
31    }
32}
33
34impl ResponseRewriter for CoreResponseRewriter {
35    fn expand_tokens(&self, body: &mut Value) {
36        *body = core_expand_tokens(body);
37    }
38
39    fn apply_overrides(&self, operation_id: &str, tags: &[String], path: &str, body: &mut Value) {
40        if let Some(ref rules) = self.overrides {
41            rules.apply(operation_id, tags, path, body);
42        }
43    }
44}