Skip to main content

SchemaCache

Struct SchemaCache 

Source
pub struct SchemaCache { /* private fields */ }
Expand description

A thread-safe cache for normalized JSON Schemas.

An adapter-bound cache stores normalized schemas keyed by a 64-bit hash of the input schema. Binding the adapter at construction prevents results produced by different adapter instances from sharing an entry.

§Thread Safety

Uses std::sync::Mutex internally, making it safe to share across threads. The lock is held only briefly during hash lookup and insertion.

§Placement

Intended to live on model instances so each provider adapter maintains its own cache of normalized schemas. Use SchemaCache::new for the generic adapter or SchemaCache::for_adapter for a provider-specific adapter.

Implementations§

Source§

impl SchemaCache

Source

pub fn new() -> Self

Creates an empty cache bound to GenericSchemaAdapter.

Use SchemaCache::for_adapter when normalization requires a provider-specific adapter.

§Example
use adk_core::SchemaCache;
use serde_json::json;

let cache = SchemaCache::new();
let normalized = cache.normalize(&json!({"type": "string"}));
Source

pub fn for_adapter(adapter: Arc<dyn SchemaAdapter>) -> Self

Creates an empty cache bound to one schema adapter.

The cache owns the adapter, so every entry is guaranteed to have been produced by that adapter instance.

§Example
use adk_core::{GenericSchemaAdapter, SchemaCache};
use std::sync::Arc;

let cache = SchemaCache::for_adapter(Arc::new(GenericSchemaAdapter));
assert!(cache.is_empty());
Source

pub fn normalize(&self, schema: &Value) -> Value

Returns the schema normalized by this cache’s adapter.

If the same input schema has been normalized before, the cached result is returned. Otherwise, the bound adapter normalizes the schema and the result is stored.

§Example
use adk_core::{GenericSchemaAdapter, SchemaCache};
use serde_json::json;
use std::sync::Arc;

let cache = SchemaCache::for_adapter(Arc::new(GenericSchemaAdapter));
let schema = json!({"$schema": "draft-07", "type": "string"});

let normalized = cache.normalize(&schema);
assert!(normalized.get("$schema").is_none());
Source

pub fn get_or_normalize( &self, schema: &Value, adapter: &dyn SchemaAdapter, ) -> Value

👎Deprecated:

bind the adapter with SchemaCache::for_adapter and call SchemaCache::normalize

Returns a schema normalized by the supplied adapter.

This compatibility path normalizes before looking up the result because a borrowed trait object has no stable identity that the cache can safely retain. Use SchemaCache::for_adapter and SchemaCache::normalize to avoid repeated normalization.

Source

pub fn clear(&self)

Clears all cached entries.

Call this when the set of tools changes (e.g., MCP server advertises updated schemas) to force re-normalization on the next request.

§Example
use adk_core::{GenericSchemaAdapter, SchemaCache};
use serde_json::json;
use std::sync::Arc;

let cache = SchemaCache::for_adapter(Arc::new(GenericSchemaAdapter));
let schema = json!({"type": "string"});

// Populate cache
cache.normalize(&schema);

// Invalidate all entries
cache.clear();
Source

pub fn len(&self) -> usize

Returns the number of cached entries.

Source

pub fn is_empty(&self) -> bool

Returns true if the cache contains no entries.

Trait Implementations§

Source§

impl Debug for SchemaCache

Source§

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

Formats the value using the given formatter. Read more
Source§

impl Default for SchemaCache

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

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

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

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

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

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

Source§

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

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

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
Source§

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

Source§

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, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

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

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

Performs the conversion.
Source§

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

Source§

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

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

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