RedactionBuilder

Struct RedactionBuilder 

Source
pub struct RedactionBuilder<T> { /* private fields */ }
Available on crate feature redaction only.
Expand description

Builder for applying redactions to JSON responses.

This builder allows you to chain multiple redaction operations before finalizing the result. Paths can use either JSON Pointer (RFC 6901) or JSONPath (RFC 9535) syntax.

§Path Syntax

The syntax is auto-detected based on the path prefix:

§JSON Pointer (starts with /)

  • /field - top-level field
  • /field/subfield - nested field
  • /array/0 - array index
  • /field~1with~1slashes - ~1 escapes /
  • /field~0with~0tildes - ~0 escapes ~

§JSONPath (starts with $)

  • $.field - top-level field
  • $.items[*].id - all id fields in array
  • $..id - all id fields anywhere (recursive)
  • $[0:3] - array slice

Implementations§

Source§

impl<T> RedactionBuilder<T>

Source

pub fn redact<R: Redactor>( self, path: &str, redactor: R, ) -> Result<Self, ApiClientError>

Redacts values at the specified path using a redactor.

The path can be either JSON Pointer (RFC 6901) or JSONPath (RFC 9535). The syntax is auto-detected based on the prefix:

  • $... → JSONPath (supports wildcards)
  • /... → JSON Pointer (exact path)

The redactor can be:

  • A static value: "replacement" or serde_json::json!(...)
  • A closure: |path, val| transform(path, val)
§Arguments
  • path - Path expression (e.g., /id, $.items[*].id)
  • redactor - The redactor to apply (static value or closure)
§Errors

Returns an error if:

  • The path is invalid
  • The path matches no values
§Example
// Static value
let result = client
    .get("/api/users/123")?
    .await?
    .as_json_redacted::<serde_json::Value>().await?
    .redact("/id", "test-uuid")?
    .finish()
    .await;

// Closure for index-based IDs
let result = client
    .get("/api/users")?
    .await?
    .as_json_redacted::<Vec<serde_json::Value>>().await?
    .redact("$[*].id", |path, _val| {
        let idx = path.split('/').nth(1).unwrap_or("0");
        serde_json::json!(format!("user-{idx}"))
    })?
    .finish()
    .await;
Source

pub fn redact_with_options<R: Redactor>( self, path: &str, redactor: R, options: RedactOptions, ) -> Result<Self, ApiClientError>

Redacts values at the specified path with configurable options.

This is like redact but allows customizing behavior through RedactOptions.

§Arguments
  • path - Path expression (e.g., /id, $.items[*].id)
  • redactor - The redactor to apply
  • options - Configuration options
§Example
use clawspec_core::RedactOptions;

// Allow empty matches for optional fields
let options = RedactOptions { allow_empty_match: true };

builder
    .redact_with_options("$.optional[*].field", "value", options)?
    .finish()
    .await;
Source

pub fn redact_remove(self, path: &str) -> Result<Self, ApiClientError>

Removes values at the specified path.

This completely removes the field from objects or the element from arrays, unlike setting it to null.

The path can be either JSON Pointer (RFC 6901) or JSONPath (RFC 9535).

§Arguments
  • path - Path expression to remove
§Errors

Returns an error if:

  • The path is invalid
  • The path matches no values
§Example
// Remove specific field
let result = client
    .get("/api/users/123")?
    .await?
    .as_json_redacted::<serde_json::Value>().await?
    .redact_remove("/password")?
    .finish()
    .await;

// Remove field from all array elements
let result = client
    .get("/api/users")?
    .await?
    .as_json_redacted::<Vec<serde_json::Value>>().await?
    .redact_remove("$[*].password")?
    .finish()
    .await;
Source

pub fn redact_remove_with( self, path: &str, options: RedactOptions, ) -> Result<Self, ApiClientError>

Removes values at the specified path with configurable options.

This is like redact_remove but allows customizing behavior through RedactOptions.

§Arguments
  • path - Path expression to remove
  • options - Configuration options
§Example
use clawspec_core::RedactOptions;

// Allow empty matches for optional fields
let options = RedactOptions { allow_empty_match: true };

builder
    .redact_remove_with("$.optional[*].field", options)?
    .finish()
    .await;
Source

pub async fn finish(self) -> RedactedResult<T>
where T: ToSchema + 'static,

Finalizes the redaction and returns the result.

This consumes the builder and returns a RedactedResult containing both the original value and the redacted JSON.

The redacted JSON value is recorded as an example in both the OpenAPI schema for type T and in the response content for this operation.

Trait Implementations§

Source§

impl<T> Debug for RedactionBuilder<T>
where T: Debug,

Source§

fn fmt(&self, __derive_more_f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<T> Freeze for RedactionBuilder<T>
where T: Freeze,

§

impl<T> RefUnwindSafe for RedactionBuilder<T>
where T: RefUnwindSafe,

§

impl<T> Send for RedactionBuilder<T>
where T: Send,

§

impl<T> Sync for RedactionBuilder<T>
where T: Sync,

§

impl<T> Unpin for RedactionBuilder<T>
where T: Unpin,

§

impl<T> UnwindSafe for RedactionBuilder<T>
where T: UnwindSafe,

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more