1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// SPDX-License-Identifier: Apache-2.0
// Copyright (c) 2026 Praxis Contributors
//! Programmatic JSON Pointer extract/add/replace/remove.
//!
//! One tokenizer walk copies unused subtrees as byte spans. YAML
//! [`JsonBodyFilter`](crate::builtins::JsonBodyFilter) compiles through the same builder.
//!
//! ```
//! use praxis_filter::json_ops::{ExtractDest, JsonOps, JsonValue};
//! use serde_json::json;
//!
//! let ops = JsonOps::builder()
//! .extract("/model", ExtractDest::metadata("original.model"))?
//! .add("/tenant", JsonValue::static_json(json!("acme"))?)?
//! .add("/original_model", JsonValue::metadata("original.model"))?
//! .remove("/password")?
//! .replace("/model", JsonValue::static_json(json!("forced"))?)?
//! .build()?;
//!
//! let body = br#"{"model":"old","password":"x"}"#;
//! let rewrite = ops.apply(body, None)?;
//! let out = rewrite.output.expect("mutating ops emit a body");
//! assert_eq!(
//! serde_json::from_slice::<serde_json::Value>(&out).unwrap(),
//! json!({"model":"forced","original_model":"old","tenant":"acme"})
//! );
//! # Ok::<(), praxis_filter::json_ops::JsonError>(())
//! ```
// -----------------------------------------------------------------------------
// Re-exports
// -----------------------------------------------------------------------------
pub use ;
pub use JsonError;
pub use ExtractDest;
pub use ;