pub struct ArborStorage { /* private fields */ }Expand description
SQLite-based storage for Arbor tree structures.
§Usage Pattern: Direct Injection
ArborStorage is infrastructure - activations should receive it directly at construction time, NOT via Plexus routing.
// Correct: Direct injection
let cone = Cone::new(cone_config, arbor_storage.clone()).await?;
// Then use directly for tree operations
let tree = arbor_storage.tree_get(&tree_id).await?;
let node_id = arbor_storage.node_create_external(&tree_id, parent, handle, None).await?;Do NOT route tree operations through Plexus - that adds unnecessary serialization overhead for what should be direct method calls.
The only case where Plexus is needed for Arbor-related data is cross-plugin handle resolution: when you have a Handle pointing to external data (e.g., a Cone message) and need to resolve its content.
See: docs/architecture/*_arbor-usage-pattern.md
Implementations§
Source§impl ArborStorage
impl ArborStorage
Sourcepub async fn new(config: ArborConfig) -> Result<Self, ArborError>
pub async fn new(config: ArborConfig) -> Result<Self, ArborError>
Create a new storage instance and run migrations
Sourcepub async fn tree_create(
&self,
metadata: Option<Value>,
owner_id: &str,
) -> Result<TreeId, ArborError>
pub async fn tree_create( &self, metadata: Option<Value>, owner_id: &str, ) -> Result<TreeId, ArborError>
Create a new tree with a root node
Sourcepub async fn tree_get(&self, tree_id: &TreeId) -> Result<Tree, ArborError>
pub async fn tree_get(&self, tree_id: &TreeId) -> Result<Tree, ArborError>
Get a tree by ID (only active trees)
Sourcepub async fn tree_get_archived(
&self,
tree_id: &TreeId,
) -> Result<Tree, ArborError>
pub async fn tree_get_archived( &self, tree_id: &TreeId, ) -> Result<Tree, ArborError>
Get an archived tree by ID
Sourcepub async fn tree_list(
&self,
include_scheduled: bool,
) -> Result<Vec<TreeId>, ArborError>
pub async fn tree_list( &self, include_scheduled: bool, ) -> Result<Vec<TreeId>, ArborError>
List all tree IDs (active only by default)
Sourcepub async fn tree_list_scheduled(&self) -> Result<Vec<TreeId>, ArborError>
pub async fn tree_list_scheduled(&self) -> Result<Vec<TreeId>, ArborError>
List trees scheduled for deletion
Sourcepub async fn tree_list_archived(&self) -> Result<Vec<TreeId>, ArborError>
pub async fn tree_list_archived(&self) -> Result<Vec<TreeId>, ArborError>
List archived trees
Sourcepub async fn tree_update_metadata(
&self,
tree_id: &TreeId,
metadata: Value,
) -> Result<(), ArborError>
pub async fn tree_update_metadata( &self, tree_id: &TreeId, metadata: Value, ) -> Result<(), ArborError>
Update tree metadata
Sourcepub async fn tree_claim(
&self,
tree_id: &TreeId,
owner_id: &str,
count: i64,
) -> Result<i64, ArborError>
pub async fn tree_claim( &self, tree_id: &TreeId, owner_id: &str, count: i64, ) -> Result<i64, ArborError>
Claim ownership of a tree (increment reference count)
Sourcepub async fn tree_release(
&self,
tree_id: &TreeId,
owner_id: &str,
count: i64,
) -> Result<i64, ArborError>
pub async fn tree_release( &self, tree_id: &TreeId, owner_id: &str, count: i64, ) -> Result<i64, ArborError>
Release ownership of a tree (decrement reference count)
Sourcepub async fn node_create_text(
&self,
tree_id: &TreeId,
parent: Option<NodeId>,
content: String,
metadata: Option<Value>,
) -> Result<NodeId, ArborError>
pub async fn node_create_text( &self, tree_id: &TreeId, parent: Option<NodeId>, content: String, metadata: Option<Value>, ) -> Result<NodeId, ArborError>
Create a text node in a tree
Sourcepub async fn node_create_external(
&self,
tree_id: &TreeId,
parent: Option<NodeId>,
handle: Handle,
metadata: Option<Value>,
) -> Result<NodeId, ArborError>
pub async fn node_create_external( &self, tree_id: &TreeId, parent: Option<NodeId>, handle: Handle, metadata: Option<Value>, ) -> Result<NodeId, ArborError>
Create an external node in a tree
Sourcepub async fn node_create_external_ephemeral(
&self,
tree_id: &TreeId,
parent: Option<NodeId>,
handle: Handle,
metadata: Option<Value>,
) -> Result<NodeId, ArborError>
pub async fn node_create_external_ephemeral( &self, tree_id: &TreeId, parent: Option<NodeId>, handle: Handle, metadata: Option<Value>, ) -> Result<NodeId, ArborError>
Create an external node that is already scheduled for deletion (ephemeral)
Sourcepub async fn node_get(
&self,
tree_id: &TreeId,
node_id: &NodeId,
) -> Result<Node, ArborError>
pub async fn node_get( &self, tree_id: &TreeId, node_id: &NodeId, ) -> Result<Node, ArborError>
Get a node by ID
Sourcepub async fn node_get_children(
&self,
tree_id: &TreeId,
node_id: &NodeId,
) -> Result<Vec<NodeId>, ArborError>
pub async fn node_get_children( &self, tree_id: &TreeId, node_id: &NodeId, ) -> Result<Vec<NodeId>, ArborError>
Get children of a node
Sourcepub async fn node_get_parent(
&self,
tree_id: &TreeId,
node_id: &NodeId,
) -> Result<Option<NodeId>, ArborError>
pub async fn node_get_parent( &self, tree_id: &TreeId, node_id: &NodeId, ) -> Result<Option<NodeId>, ArborError>
Get parent of a node
Sourcepub async fn node_get_path(
&self,
tree_id: &TreeId,
node_id: &NodeId,
) -> Result<Vec<NodeId>, ArborError>
pub async fn node_get_path( &self, tree_id: &TreeId, node_id: &NodeId, ) -> Result<Vec<NodeId>, ArborError>
Get path from root to a node (list of node IDs)
Sourcepub async fn context_list_leaves(
&self,
tree_id: &TreeId,
) -> Result<Vec<NodeId>, ArborError>
pub async fn context_list_leaves( &self, tree_id: &TreeId, ) -> Result<Vec<NodeId>, ArborError>
List all leaf nodes in a tree
Sourcepub async fn context_get_path(
&self,
tree_id: &TreeId,
node_id: &NodeId,
) -> Result<Vec<Node>, ArborError>
pub async fn context_get_path( &self, tree_id: &TreeId, node_id: &NodeId, ) -> Result<Vec<Node>, ArborError>
Get the full path data from root to a node (all node data)
Sourcepub async fn context_get_handles(
&self,
tree_id: &TreeId,
node_id: &NodeId,
) -> Result<Vec<Handle>, ArborError>
pub async fn context_get_handles( &self, tree_id: &TreeId, node_id: &NodeId, ) -> Result<Vec<Handle>, ArborError>
Get all external handles in the path to a node
Sourcepub async fn cleanup_scheduled_trees(&self) -> Result<usize, ArborError>
pub async fn cleanup_scheduled_trees(&self) -> Result<usize, ArborError>
Cleanup task: Archive trees scheduled for deletion (after 7 days)
Auto Trait Implementations§
impl Freeze for ArborStorage
impl !RefUnwindSafe for ArborStorage
impl Send for ArborStorage
impl Sync for ArborStorage
impl Unpin for ArborStorage
impl UnsafeUnpin for ArborStorage
impl !UnwindSafe for ArborStorage
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
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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