dependency-injector-derive

Crates.iodependency-injector-derive
lib.rsdependency-injector-derive
version0.1.0
created_at2025-12-21 15:03:27.288344+00
updated_at2025-12-21 15:03:27.288344+00
descriptionDerive macros for dependency-injector
homepage
repositoryhttps://github.com/pegasusheavy/dependency-injector
max_upload_size
id1998092
size14,043
Joseph R. Quinn (quinnjr)

documentation

https://docs.rs/dependency-injector-derive

README

dependency-injector-derive

Derive macros for dependency-injector.

Overview

This crate provides the #[derive(Inject)] macro for automatic compile-time dependency injection. It generates a from_container() method that resolves dependencies from a Container instance.

Installation

This crate is typically used through the derive feature of dependency-injector:

[dependencies]
dependency-injector = { version = "0.2", features = ["derive"] }

Or directly:

[dependencies]
dependency-injector-derive = "0.1"
dependency-injector = "0.2"

Usage

use dependency_injector::{Container, Inject};
use std::sync::Arc;

#[derive(Clone)]
struct Database {
    url: String,
}

#[derive(Clone)]
struct Cache {
    size: usize,
}

#[derive(Inject)]
struct UserService {
    #[inject]
    db: Arc<Database>,

    #[inject]
    cache: Arc<Cache>,

    #[inject(optional)]
    logger: Option<Arc<Logger>>,  // Won't fail if not registered

    // Non-injected fields use Default::default()
    request_count: u64,
}

fn main() -> dependency_injector::Result<()> {
    let container = Container::new();
    container.singleton(Database { url: "postgres://localhost".into() });
    container.singleton(Cache { size: 1024 });

    // Automatically resolve all #[inject] fields
    let service = UserService::from_container(&container)?;

    Ok(())
}

Attributes

Attribute Field Type Description
#[inject] Arc<T> Required dependency. Fails if not registered.
#[inject(optional)] Option<Arc<T>> Optional dependency. None if not registered.
(none) Any Default type Uses Default::default().

Generated Code

The macro generates an impl block with a from_container method:

impl UserService {
    pub fn from_container(
        container: &Container
    ) -> Result<Self, DiError> {
        Ok(Self {
            db: container.get::<Database>()?,
            cache: container.get::<Cache>()?,
            logger: container.try_get::<Logger>(),
            request_count: Default::default(),
        })
    }
}

Requirements

  • Struct must have named fields (no tuple structs)
  • #[inject] fields must be Arc<T>
  • #[inject(optional)] fields must be Option<Arc<T>>
  • Non-injected fields must implement Default

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.

Commit count: 0

cargo fmt