pub struct PluginContext { /* private fields */ }Expand description
A type-safe, concurrent key-value store for plugin shared state.
Uses the TypeMap pattern where each type serves as its own key.
Thread-safe via tokio::sync::RwLock for concurrent async access.
§Concurrency
- Multiple readers can access state concurrently via
getandcontains. - Writers acquire exclusive access via
insertandremove. - No locks are held across await points — each method acquires and releases the lock within a single operation.
§Examples
use adk_plugin::PluginContext;
#[derive(Clone, Debug)]
struct RateLimitState {
requests_this_minute: u32,
}
let ctx = PluginContext::new();
// A rate-limiting plugin writes state
ctx.insert(RateLimitState { requests_this_minute: 1 }).await;
// A metrics plugin reads it
if let Some(state) = ctx.get::<RateLimitState>().await {
println!("Requests: {}", state.requests_this_minute);
}Implementations§
Source§impl PluginContext
impl PluginContext
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new empty PluginContext.
§Examples
use adk_plugin::PluginContext;
let ctx = PluginContext::new();Sourcepub async fn insert<T: Send + Sync + 'static>(&self, value: T)
pub async fn insert<T: Send + Sync + 'static>(&self, value: T)
Inserts a value into the context. The type itself is the key.
If a value of the same type already exists, it is replaced. The previous value is discarded.
§Examples
use adk_plugin::PluginContext;
#[derive(Clone, Debug, PartialEq)]
struct Counter(u32);
let ctx = PluginContext::new();
ctx.insert(Counter(1)).await;
ctx.insert(Counter(2)).await; // Replaces the previous value
assert_eq!(ctx.get::<Counter>().await, Some(Counter(2)));Sourcepub async fn get<T: Clone + Send + Sync + 'static>(&self) -> Option<T>
pub async fn get<T: Clone + Send + Sync + 'static>(&self) -> Option<T>
Gets a clone of the stored value for type T.
Returns None if no value of type T has been inserted.
§Examples
use adk_plugin::PluginContext;
#[derive(Clone, Debug, PartialEq)]
struct Name(String);
let ctx = PluginContext::new();
assert_eq!(ctx.get::<Name>().await, None);
ctx.insert(Name("alice".to_string())).await;
assert_eq!(ctx.get::<Name>().await, Some(Name("alice".to_string())));Sourcepub async fn contains<T: Send + Sync + 'static>(&self) -> bool
pub async fn contains<T: Send + Sync + 'static>(&self) -> bool
Checks if a value of type T exists in the context.
§Examples
use adk_plugin::PluginContext;
#[derive(Clone, Debug)]
struct Marker;
let ctx = PluginContext::new();
assert!(!ctx.contains::<Marker>().await);
ctx.insert(Marker).await;
assert!(ctx.contains::<Marker>().await);Sourcepub async fn remove<T: Send + Sync + 'static>(&self) -> Option<T>
pub async fn remove<T: Send + Sync + 'static>(&self) -> Option<T>
Removes a value of type T, returning it if present.
After removal, get and contains for
type T will return None and false respectively.
§Examples
use adk_plugin::PluginContext;
#[derive(Clone, Debug, PartialEq)]
struct Token(String);
let ctx = PluginContext::new();
ctx.insert(Token("abc".to_string())).await;
let removed = ctx.remove::<Token>().await;
assert_eq!(removed, Some(Token("abc".to_string())));
assert_eq!(ctx.get::<Token>().await, None);Trait Implementations§
Auto Trait Implementations§
impl !Freeze for PluginContext
impl !RefUnwindSafe for PluginContext
impl Send for PluginContext
impl Sync for PluginContext
impl Unpin for PluginContext
impl UnsafeUnpin for PluginContext
impl !UnwindSafe for PluginContext
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more