Skip to main content

AgentBuilder

Struct AgentBuilder 

Source
pub struct AgentBuilder<S: StateStoreBackend = StateStore, D: DatabaseBackend = Database, P: ProviderBackend = Provider, T: ToolsetBackend = Toolset> { /* private fields */ }
Expand description

Configures creation or reopening of one durable Agent.

The builder accepts already-built provider, tool, and storage values without exposing their implementation details through agents-kit.

The hierarchy preserves concrete S, D, P and T types, with no Clone requirement on caller backends or T::Handler. New identity creation and durable reopen use separate constructors; reopening resupplies integrations instead of reconstructing credentials or lower configuration from records.

Native Codex/OpenCode can select P as static composition context without owning a provider value. Custom requires a value through Self::with_provider. The builder owns supplied values, while Self::build accepts construction and cleanup work. Await consuming AgentBackend::shutdown on the built Agent while its runtime remains driven.

The local example uses memory Lance and a passively constructed Provider. It selects an exact model without verifying a running service or generating output.

§Examples

use std::{num::NonZeroUsize, time::Duration};
use agents_kit::{AgentBackend, AgentBuilder, AgentStorage};
use agents_kit::config::{AgentConfig, CustomAgentConfig, CustomLoopLimits, CustomToolApproval};
use agents_kit::{model::ModelSelector, tool::ToolSelection};
use providers_kit::{Provider, ProviderConfig, config::{OllamaConfig, ProviderKind, TransportConfig}};
use storage_kit::{StateStore, state::config::{LanceStateStoreConfig, StateStoreConfig}};
let store = StateStore::connect(StateStoreConfig::Lance(LanceStateStoreConfig::memory())).await?;
let storage = AgentStorage::new(store);
let custom = CustomAgentConfig::new(ModelSelector::new("exact-model")?, ToolSelection::None,
    CustomLoopLimits::new(4, 0, 1)?, CustomToolApproval::Deny)?;
let config = AgentConfig::new(custom.into(), Duration::from_secs(10), NonZeroUsize::MIN)?;
let provider_config = ProviderConfig::new(ProviderKind::Ollama(OllamaConfig::local()), TransportConfig::default());
let provider = Provider::from_config(provider_config.clone())?;
// This constructs local owners and selects a model; it makes no generation request.
let agent = AgentBuilder::create(config, storage).with_provider(provider).build().await?;
assert!(agent.list_workspaces().await?.is_empty());
agent.shutdown().await?;

Implementations§

Source§

impl<S: StateStoreBackend> AgentBuilder<S, Database, Provider>

Source

pub fn create(config: AgentConfig, storage: AgentStorage<S>) -> Self

Configures a new durable agent over the required control-plane store.

This records creation intent without opening a backend. Self::build creates a fresh durable identity. Storage is required up front and retains its exact associated transaction type. For an existing identity use Self::reopen.

§Examples
use std::{num::NonZeroUsize, time::Duration};
use agents_kit::{AgentBackend, AgentBuilder, AgentStorage};
use agents_kit::config::{AgentConfig, CustomAgentConfig, CustomLoopLimits, CustomToolApproval};
use agents_kit::{model::ModelSelector, tool::ToolSelection};
use providers_kit::{Provider, ProviderConfig, config::{OllamaConfig, ProviderKind, TransportConfig}};
use storage_kit::{StateStore, state::config::{LanceStateStoreConfig, StateStoreConfig}};
let store = StateStore::connect(StateStoreConfig::Lance(LanceStateStoreConfig::memory())).await?;
let storage = AgentStorage::new(store);
let custom = CustomAgentConfig::new(ModelSelector::new("exact-model")?, ToolSelection::None,
    CustomLoopLimits::new(4, 0, 1)?, CustomToolApproval::Deny)?;
let config = AgentConfig::new(custom.into(), Duration::from_secs(10), NonZeroUsize::MIN)?;
let provider_config = ProviderConfig::new(ProviderKind::Ollama(OllamaConfig::local()), TransportConfig::default());
let provider = Provider::from_config(provider_config.clone())?;
let builder = AgentBuilder::create(config, storage);
let agent = builder.with_provider(provider).build().await?;
assert!(agent.list_workspaces().await?.is_empty());
agent.shutdown().await?;
Source

pub fn create_for_backends<P2: ProviderBackend, T2: ToolsetBackend>( config: AgentConfig, storage: AgentStorage<S>, ) -> AgentBuilder<S, Database, P2, T2>

Configures a new agent with fixed Provider and Toolset implementation types.

Codex and OpenCode retain their native providers, so this selects only the static provider type shared with other agents in a caller-owned composition. Custom agents receive their provider value through Self::with_provider. Repeated Self::with_toolset calls append T2 values to one homogeneous inventory without normalization or a Clone bound.

§Examples
use std::{num::NonZeroUsize, time::Duration};
use agents_kit::{AgentBackend, AgentBuilder, AgentStorage};
use agents_kit::config::{AgentConfig, CustomAgentConfig, CustomLoopLimits, CustomToolApproval};
use agents_kit::{model::ModelSelector, tool::ToolSelection};
use providers_kit::{Provider, ProviderConfig, config::{OllamaConfig, ProviderKind, TransportConfig}};
use storage_kit::{StateStore, state::config::{LanceStateStoreConfig, StateStoreConfig}};
let store = StateStore::connect(StateStoreConfig::Lance(LanceStateStoreConfig::memory())).await?;
let storage = AgentStorage::new(store);
let custom = CustomAgentConfig::new(ModelSelector::new("exact-model")?, ToolSelection::None,
    CustomLoopLimits::new(4, 0, 1)?, CustomToolApproval::Deny)?;
let config = AgentConfig::new(custom.into(), Duration::from_secs(10), NonZeroUsize::MIN)?;
let provider_config = ProviderConfig::new(ProviderKind::Ollama(OllamaConfig::local()), TransportConfig::default());
let provider = Provider::from_config(provider_config.clone())?;
let builder = AgentBuilder::create_for_backends::<Provider, tools_kit::Toolset>(config, storage);
// Selecting P alone does not supply the provider required by Custom.
let agent = builder.with_provider(provider).build().await?;
assert!(agent.list_workspaces().await?.is_empty());
agent.shutdown().await?;
Source

pub fn reopen( config: AgentConfig, storage: AgentStorage<S>, id: AgentId, ) -> Self

Configures reopening of an existing durable agent.

Selects an existing identity; it never falls back to creating one. Build checks stored compatibility and the storage clone family’s live-ownership claim. Resupply fresh provider/tool/database values required by that identity. An AgentStorage clone shares coordination without requiring S: Clone.

§Examples
use std::{num::NonZeroUsize, time::Duration};
use agents_kit::{AgentBackend, AgentBuilder, AgentStorage};
use agents_kit::config::{AgentConfig, CustomAgentConfig, CustomLoopLimits, CustomToolApproval};
use agents_kit::{model::ModelSelector, tool::ToolSelection};
use providers_kit::{Provider, ProviderConfig, config::{OllamaConfig, ProviderKind, TransportConfig}};
use storage_kit::{StateStore, state::config::{LanceStateStoreConfig, StateStoreConfig}};
let store = StateStore::connect(StateStoreConfig::Lance(LanceStateStoreConfig::memory())).await?;
let storage = AgentStorage::new(store);
let custom = CustomAgentConfig::new(ModelSelector::new("exact-model")?, ToolSelection::None,
    CustomLoopLimits::new(4, 0, 1)?, CustomToolApproval::Deny)?;
let config = AgentConfig::new(custom.into(), Duration::from_secs(10), NonZeroUsize::MIN)?;
let provider_config = ProviderConfig::new(ProviderKind::Ollama(OllamaConfig::local()), TransportConfig::default());
let provider = Provider::from_config(provider_config.clone())?;
let agent = AgentBuilder::create(config.clone(), storage.clone())
    .with_provider(provider).build().await?;
let id = agent.id();
agent.shutdown().await?;
// Reuse the same storage family, and supply a fresh provider after shutdown.
let reopened = AgentBuilder::reopen(config, storage, id.clone())
    .with_provider(Provider::from_config(provider_config)?).build().await?;
assert_eq!(reopened.id(), id);
reopened.shutdown().await?;
Source

pub fn reopen_for_backends<P2: ProviderBackend, T2: ToolsetBackend>( config: AgentConfig, storage: AgentStorage<S>, id: AgentId, ) -> AgentBuilder<S, Database, P2, T2>

Configures reopening with fixed Provider and Toolset implementation types.

This is the reopening counterpart to Self::create_for_backends. It selects no provider value and performs no provider operation.

§Examples
use std::{num::NonZeroUsize, time::Duration};
use agents_kit::{AgentBackend, AgentBuilder, AgentStorage};
use agents_kit::config::{AgentConfig, CustomAgentConfig, CustomLoopLimits, CustomToolApproval};
use agents_kit::{model::ModelSelector, tool::ToolSelection};
use providers_kit::{Provider, ProviderConfig, config::{OllamaConfig, ProviderKind, TransportConfig}};
use storage_kit::{StateStore, state::config::{LanceStateStoreConfig, StateStoreConfig}};
let store = StateStore::connect(StateStoreConfig::Lance(LanceStateStoreConfig::memory())).await?;
let storage = AgentStorage::new(store);
let custom = CustomAgentConfig::new(ModelSelector::new("exact-model")?, ToolSelection::None,
    CustomLoopLimits::new(4, 0, 1)?, CustomToolApproval::Deny)?;
let config = AgentConfig::new(custom.into(), Duration::from_secs(10), NonZeroUsize::MIN)?;
let provider_config = ProviderConfig::new(ProviderKind::Ollama(OllamaConfig::local()), TransportConfig::default());
let provider = Provider::from_config(provider_config.clone())?;
let agent = AgentBuilder::create(config.clone(), storage.clone())
    .with_provider(provider).build().await?;
let id = agent.id();
agent.shutdown().await?;
let builder = AgentBuilder::reopen_for_backends::<Provider, tools_kit::Toolset>(
    config, storage, id.clone(),
);
let reopened = builder.with_provider(Provider::from_config(provider_config)?).build().await?;
assert_eq!(reopened.id(), id);
reopened.shutdown().await?;
Source§

impl<S: StateStoreBackend, D: DatabaseBackend, P: ProviderBackend, T: ToolsetBackend> AgentBuilder<S, D, P, T>

Source

pub fn with_provider<P2: ProviderBackend>( self, provider: P2, ) -> AgentBuilder<S, D, P2, T>

Supplies the already-built provider required by the Custom backend.

Consumes the provider and changes the builder’s concrete provider parameter; accepted Toolsets and the Database remain attached. Replacing an earlier value drops that value, so complete any required lower lifecycle work before replacing it. Codex/OpenCode reject a supplied provider value during build; use typed construction to select their static provider parameter without a value.

§Examples
use std::{num::NonZeroUsize, time::Duration};
use agents_kit::{AgentBackend, AgentBuilder, AgentStorage};
use agents_kit::config::{AgentConfig, CustomAgentConfig, CustomLoopLimits, CustomToolApproval};
use agents_kit::{model::ModelSelector, tool::ToolSelection};
use providers_kit::{Provider, ProviderConfig, config::{OllamaConfig, ProviderKind, TransportConfig}};
use storage_kit::{StateStore, state::config::{LanceStateStoreConfig, StateStoreConfig}};
let store = StateStore::connect(StateStoreConfig::Lance(LanceStateStoreConfig::memory())).await?;
let storage = AgentStorage::new(store);
let custom = CustomAgentConfig::new(ModelSelector::new("exact-model")?, ToolSelection::None,
    CustomLoopLimits::new(4, 0, 1)?, CustomToolApproval::Deny)?;
let config = AgentConfig::new(custom.into(), Duration::from_secs(10), NonZeroUsize::MIN)?;
let provider_config = ProviderConfig::new(ProviderKind::Ollama(OllamaConfig::local()), TransportConfig::default());
let provider = Provider::from_config(provider_config.clone())?;
let agent = AgentBuilder::create(config, storage)
    .with_provider(provider).build().await?;
assert!(agent.list_workspaces().await?.is_empty());
// Shutdown includes the transferred provider; do not reuse it afterward.
agent.shutdown().await?;
§Direct lower implementations and non-Clone tools

These caller-owned enums deliberately expose only Provider selection and generation, and Local tool execution. Other Provider operations retain the trait’s Unsupported defaults. They delegate actual transport/handler semantics, not fabricated success. Agent uses LocalProvider::Model and LocalTools::Handler; neither tool enum implements Clone.

This example executes a real Local handler and builds Custom without model inference. A prompt would require the exact configured Ollama model. See providers_kit::ProviderBackend and tools_kit::ToolsetBackend for implementing those lower contracts rather than delegating them.

use std::{convert::Infallible, num::NonZeroUsize, time::Duration};
use agents_kit::{AgentBackend, AgentBuilder, AgentStorage};
use agents_kit::config::{AgentConfig, CustomAgentConfig, CustomLoopLimits, CustomToolApproval};
use agents_kit::{model::ModelSelector, tool::ToolSelection};
use providers_kit::{Model, ModelBackend, ModelId, Provider, ProviderBackend, ProviderConfig};
use providers_kit::config::{OllamaConfig, ProviderKind, TransportConfig};
use providers_kit::generation::{GenerateEventStream, GenerateRequest, GenerateResponse, GenerationContinuation};
use storage_kit::{StateStore, state::config::{LanceStateStoreConfig, StateStoreConfig}};
use tools_kit::{ToolError, ToolHandler, ToolHandlerBackend, Toolset, ToolsetBackend};
use tools_kit::declaration::{ToolInfo, ToolName};
use tools_kit::execution::{ToolHandlerInput, ToolHandlerOutput, ToolInvocation, ToolResult};
use tools_kit::{local::ToolRegistration, schema::JsonSchema};

enum LocalProvider { Ollama(Provider) }
enum LocalModel { Ollama(Model) }
enum LocalTools { Functions(Toolset) }
enum LocalHandler { Function(ToolHandler) }
impl ProviderBackend for LocalProvider {
    type Model = LocalModel;
    fn model(&self, id: ModelId) -> Result<Self::Model, providers_kit::KitError> {
        match self { Self::Ollama(value) => value.model(id).map(LocalModel::Ollama) }
    }
    async fn shutdown(&self) -> Result<(), providers_kit::KitError> {
        match self { Self::Ollama(value) => value.shutdown().await }
    }
}
impl ModelBackend for LocalModel {
    type Continuation = GenerationContinuation;
    type Session = Infallible;
    fn model_id(&self) -> &ModelId {
        match self { Self::Ollama(value) => value.model_id() }
    }
    async fn generate(&self, request: &GenerateRequest<Self::Continuation>)
        -> Result<GenerateResponse<Self::Continuation>, providers_kit::KitError> {
        match self { Self::Ollama(value) => value.generate(request).await }
    }
    async fn generate_stream(&self, request: &GenerateRequest<Self::Continuation>)
        -> Result<GenerateEventStream<Self::Continuation>, providers_kit::KitError> {
        match self { Self::Ollama(value) => value.generate_stream(request).await }
    }
}
impl ToolsetBackend for LocalTools {
    type Handler = LocalHandler;
    async fn list_tools(&self) -> Result<Vec<ToolInfo>, ToolError> {
        match self { Self::Functions(value) => value.list_tools().await }
    }
    async fn tool_handler(&self, name: ToolName) -> Result<Self::Handler, ToolError> {
        match self { Self::Functions(value) => value.tool_handler(name).await.map(LocalHandler::Function) }
    }
    async fn shutdown(&self) -> Result<(), ToolError> {
        match self { Self::Functions(value) => value.shutdown().await }
    }
}
impl ToolHandlerBackend for LocalHandler {
    async fn step(&mut self, input: ToolHandlerInput) -> Result<ToolHandlerOutput, ToolError> {
        match self { Self::Function(value) => value.step(input).await }
    }
}
let tools = LocalTools::Functions(Toolset::local(vec![ToolRegistration::function(
    ToolInfo::new(ToolName::new("ping")?, JsonSchema::strict(serde_json::json!({"type": "object"}))),
    |_| async { Ok(ToolResult::json(serde_json::json!({"reply": "pong"}))) },
)])?);
let direct = async {
    let mut handler = tools.tool_handler(ToolName::new("ping")?).await?;
    let output = handler.step(ToolHandlerInput::Invoke(ToolInvocation {
        call_id: Some("caller-ping".into()), arguments: serde_json::json!({}),
    })).await?;
    let ToolHandlerOutput::Completed(result) = output else {
        return Err(ToolError::Unsupported { operation: "ping must complete without interaction".into() });
    };
    assert!(!result.is_error);
    assert_eq!(result.structured_content, Some(serde_json::json!({"reply": "pong"})));
    Ok::<(), ToolError>(())
}.await;
if let Err(error) = direct {
    let primary = agents_kit::KitError::from(error);
    let error = match tools.shutdown().await {
        Ok(()) => primary,
        Err(cleanup) => primary.with_supplementary(agents_kit::KitError::from(cleanup)),
    };
    return Err(Box::<dyn std::error::Error>::from(error));
}
let store = StateStore::connect(StateStoreConfig::Lance(LanceStateStoreConfig::memory())).await?;
let custom = CustomAgentConfig::new(ModelSelector::new("exact-model")?, ToolSelection::Auto,
    CustomLoopLimits::new(4, 4, 1)?, CustomToolApproval::Allow)?;
let config = AgentConfig::new(custom.into(), Duration::from_secs(10), NonZeroUsize::MIN)?;
let provider = LocalProvider::Ollama(Provider::from_config(ProviderConfig::new(
    ProviderKind::Ollama(OllamaConfig::local()), TransportConfig::default()))?);
let agent = AgentBuilder::create_for_backends::<LocalProvider, LocalTools>(config, AgentStorage::new(store))
    .with_provider(provider).with_toolset(tools).build().await?;
let outcome = agent.list_workspaces().await;
let shutdown = agent.shutdown().await; // owns Provider and the non-Clone Toolset
assert!(outcome?.is_empty());
shutdown?;
Source

pub fn with_toolset(self, toolset: T) -> Self

Appends one already-built executable Toolset implementation.

T remains fixed by construction. Changing the Provider or Database keeps every accepted Toolset; its unique Handler remains associated as T::Handler.

Each call appends a value of the construction-selected T; use caller-owned exhaustive Toolset/Handler enums for heterogeneous sources. Custom executes the associated Handler directly. Build validates unique effective names and selected tools before publication. Native support is backend-specific: OpenCode rejects supplied executable toolsets. Builder transfer alone never invokes a handler.

§Examples
use std::{num::NonZeroUsize, time::Duration};
use agents_kit::{AgentBackend, AgentBuilder, AgentStorage};
use agents_kit::config::{AgentConfig, CustomAgentConfig, CustomLoopLimits, CustomToolApproval};
use agents_kit::{model::ModelSelector, tool::ToolSelection};
use providers_kit::{Provider, ProviderConfig, config::{OllamaConfig, ProviderKind, TransportConfig}};
use storage_kit::{StateStore, state::config::{LanceStateStoreConfig, StateStoreConfig}};
let store = StateStore::connect(StateStoreConfig::Lance(LanceStateStoreConfig::memory())).await?;
let storage = AgentStorage::new(store);
let custom = CustomAgentConfig::new(ModelSelector::new("exact-model")?, ToolSelection::None,
    CustomLoopLimits::new(4, 0, 1)?, CustomToolApproval::Deny)?;
let config = AgentConfig::new(custom.into(), Duration::from_secs(10), NonZeroUsize::MIN)?;
let provider_config = ProviderConfig::new(ProviderKind::Ollama(OllamaConfig::local()), TransportConfig::default());
let provider = Provider::from_config(provider_config.clone())?;
use tools_kit::{Toolset, declaration::{ToolInfo, ToolName}, execution::ToolResult,
    local::ToolRegistration, schema::JsonSchema};
let tools = Toolset::local(vec![ToolRegistration::function(
    ToolInfo::new(ToolName::new("ping")?, JsonSchema::strict(serde_json::json!({"type":"object"}))),
    |_| async { Ok(ToolResult::text("pong")) },
)])?;
let agent = AgentBuilder::create(config, storage)
    .with_toolset(tools).with_provider(provider).build().await?;
assert!(agent.list_workspaces().await?.is_empty());
// The accepted Toolset is retained across with_provider and closed by Agent shutdown.
agent.shutdown().await?;
Source

pub fn with_knowledge_database<D2: DatabaseBackend>( self, database: D2, ) -> AgentBuilder<S, D2, P, T>

Supplies the Database used by the private managed-knowledge owner.

Consumes a direct Database implementation and changes only the builder’s concrete D parameter. Existing Toolsets and Provider remain attached. This Database is separate from AgentStorage’s control-plane records and exposes no public knowledge runtime. Reopen must resupply a compatible Database when the durable identity requires managed knowledge.

§Examples
use std::{num::NonZeroUsize, time::Duration};
use agents_kit::{AgentBackend, AgentBuilder, AgentStorage};
use agents_kit::config::{AgentConfig, CustomAgentConfig, CustomLoopLimits, CustomToolApproval};
use agents_kit::{model::ModelSelector, tool::ToolSelection};
use providers_kit::{Provider, ProviderConfig, config::{OllamaConfig, ProviderKind, TransportConfig}};
use storage_kit::{StateStore, state::config::{LanceStateStoreConfig, StateStoreConfig}};
let store = StateStore::connect(StateStoreConfig::Lance(LanceStateStoreConfig::memory())).await?;
let storage = AgentStorage::new(store);
let custom = CustomAgentConfig::new(ModelSelector::new("exact-model")?, ToolSelection::None,
    CustomLoopLimits::new(4, 0, 1)?, CustomToolApproval::Deny)?;
let config = AgentConfig::new(custom.into(), Duration::from_secs(10), NonZeroUsize::MIN)?;
let provider_config = ProviderConfig::new(ProviderKind::Ollama(OllamaConfig::local()), TransportConfig::default());
let provider = Provider::from_config(provider_config.clone())?;
use storage_kit::{Database, database::config::{DatabaseConfig, LanceConfig}};
let database = Database::connect(DatabaseConfig::lance(LanceConfig::embedded_path("memory://"))).await?;
let agent = AgentBuilder::create(config, storage).with_provider(provider)
    .with_knowledge_database(database).build().await?;
assert!(agent.list_workspaces().await?.is_empty());
agent.shutdown().await?;
Source

pub async fn build(self) -> Result<Agent<S, D, P, T>, KitError>

Validates the complete configuration and creates or reopens the agent.

Takes ownership of construction after acceptance. On failure, prepared resources are cleaned in reverse ownership order within the lifecycle deadline; the first failure remains primary and later failures remain supplementary. Losing the caller observation does not detach accepted build/cleanup ownership.

On success the unique Agent owns its runtime and transferred integrations. Keep Tokio and lower runtimes driven through consuming shutdown. Custom model selection alone does not verify remote model availability; later provider operations own service validation.

§Errors

Returns InvalidConfig for invalid backend/integration combinations (including a missing Custom provider), Unsupported for a supplied integration the selected backend cannot represent, and Conflict/Busy for incompatible or already-owned reopen state. Missing identities use NotFound; malformed durable evidence uses InvalidState. Process, transport, protocol, storage and deadline failures retain their owning portable classification. Inspect KitError::kind and KitError::context; build and reopen carry distinct operation context.

This example requires an installed, configured codex executable and its real App Server process. It does not submit a model prompt.

§Examples
use std::{num::NonZeroUsize, time::Duration};
use agents_kit::{AgentBackend, AgentBuilder, AgentStorage};
use agents_kit::config::{AgentConfig, CodexConfig};
use storage_kit::{StateStore, state::config::{LanceStateStoreConfig, StateStoreConfig}};
let config = AgentConfig::new(CodexConfig::spawn(Duration::from_secs(15),
    Duration::from_secs(60))?.into(), Duration::from_secs(30), NonZeroUsize::MIN)?;
let store = StateStore::connect(StateStoreConfig::Lance(LanceStateStoreConfig::memory())).await?;
let agent = AgentBuilder::create(config, AgentStorage::new(store)).build().await?;
let observed = agent.info().await;
let cleanup = agent.shutdown().await;
let info = observed?;
assert!(!info.id().as_str().is_empty());
cleanup?;

Auto Trait Implementations§

§

impl<S, D, P, T> Freeze for AgentBuilder<S, D, P, T>

§

impl<S, D, P, T> RefUnwindSafe for AgentBuilder<S, D, P, T>

§

impl<S, D, P, T> Send for AgentBuilder<S, D, P, T>
where AgentStorage<S>: Send, Option<P>: Send, Vec<Arc<T>>: Send, Option<D>: Send,

§

impl<S, D, P, T> Sync for AgentBuilder<S, D, P, T>
where AgentStorage<S>: Sync, Option<P>: Sync, Vec<Arc<T>>: Sync, Option<D>: Sync,

§

impl<S, D, P, T> Unpin for AgentBuilder<S, D, P, T>
where AgentStorage<S>: Unpin, Option<P>: Unpin, Vec<Arc<T>>: Unpin, Option<D>: Unpin,

§

impl<S, D, P, T> UnsafeUnpin for AgentBuilder<S, D, P, T>

§

impl<S, D, P, T> UnwindSafe for AgentBuilder<S, D, P, T>

Blanket Implementations§

Source§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

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> ArchivePointee for T

Source§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
Source§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. 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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<T> LayoutRaw for T

Source§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Returns the layout of the type.
Source§

impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
where T: SharedNiching<N1, N2>, N1: Niching<T>, N2: Niching<T>,

Source§

unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool

Returns whether the given value has been niched. Read more
Source§

fn resolve_niched(out: Place<NichedOption<T, N1>>)

Writes data to out indicating that a T is niched.
Source§

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

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Pointee for T

Source§

type Metadata = ()

The metadata type for pointers and references to this type.
Source§

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

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + 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: Sized + 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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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