Skip to main content

DependencyGraph

Struct DependencyGraph 

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

A dependency graph of all injectable types in the application.

The graph is constructed from metadata generated by the proc macros and is validated once at container build time. After validation, the graph is not used during runtime resolution — providers resolve dependencies through static dispatch.

§Construction

The graph is typically built automatically by the container builder:

let graph = DependencyGraph::new(vec![
    GraphNode::new("UserService", &["Database", "Cache"]),
    GraphNode::leaf("Database"),
    GraphNode::leaf("Cache"),
]);
graph.validate()?;

Implementations§

Source§

impl DependencyGraph

Source

pub fn empty() -> DependencyGraph

Create a new empty dependency graph.

Source

pub fn new(nodes: Vec<GraphNode>) -> DependencyGraph

Create a new dependency graph from a list of nodes.

Source

pub fn add_node(&mut self, node: GraphNode)

Add a node to the graph.

Source

pub fn nodes(&self) -> &[GraphNode]

Get all nodes in the graph.

Source

pub fn len(&self) -> usize

Get the number of nodes in the graph.

Source

pub fn is_empty(&self) -> bool

Returns true if the graph contains no nodes.

Source

pub fn find_node(&self, name: &str) -> Option<&GraphNode>

Find a node by name.

Source

pub fn validate(&self) -> Result<(), Vec<ValidationError>>

Validate the entire dependency graph.

Checks for:

  • Circular dependencies (via DFS)
  • Missing dependencies (references to types not in the graph)
  • Duplicate node definitions
  • Scope mismatches (wider-scope types depending on narrower-scope types)

Returns a list of validation errors. An empty list means the graph is valid.

Source

pub fn topological_order(&self) -> Result<Vec<&str>, Vec<ValidationError>>

Compute the topological order of the dependency graph.

Returns nodes in construction order (dependencies before dependents). Returns an error if the graph contains cycles.

Source

pub fn destruction_order(&self) -> Result<Vec<&str>, Vec<ValidationError>>

Compute the destruction order (reverse topological).

Dependencies are destroyed after their dependents.

Trait Implementations§

Source§

impl Clone for DependencyGraph

Source§

fn clone(&self) -> DependencyGraph

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DependencyGraph

Source§

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

Formats the value using the given formatter. 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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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.