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}