Skip to main content

define_aam_loader

Macro define_aam_loader 

Source
macro_rules! define_aam_loader {
    {
        name: $struct_name:ident,
        dir: $dir:expr,
        list: { $($list_field:ident: $list_ty:ty),* $(,)? },
        opt: { $($opt_field:ident: $opt_ty:ty),* $(,)? },
        req: { $($req_field:ident: $req_ty:ty),* $(,)? },
        $(,)?
    } => { ... };
    {
        name: $struct_name:ident,
        dir: $dir:expr,
        list: { $($list_field:ident: $list_ty:ty),* $(,)? },
        opt: { $($opt_field:ident: $opt_ty:ty),* $(,)? },
        $(,)?
    } => { ... };
    {
        name: $struct_name:ident,
        dir: $dir:expr,
        list: { $($list_field:ident: $list_ty:ty),* $(,)? },
        req: { $($req_field:ident: $req_ty:ty),* $(,)? },
        $(,)?
    } => { ... };
    {
        name: $struct_name:ident,
        dir: $dir:expr,
        opt: { $($opt_field:ident: $opt_ty:ty),* $(,)? },
        req: { $($req_field:ident: $req_ty:ty),* $(,)? },
        $(,)?
    } => { ... };
    {
        name: $struct_name:ident,
        dir: $dir:expr,
        list: { $($list_field:ident: $list_ty:ty),* $(,)? },
        $(,)?
    } => { ... };
    {
        name: $struct_name:ident,
        dir: $dir:expr,
        opt: { $($opt_field:ident: $opt_ty:ty),* $(,)? },
        $(,)?
    } => { ... };
    {
        name: $struct_name:ident,
        dir: $dir:expr,
        req: { $($req_field:ident: $req_ty:ty),* $(,)? },
        $(,)?
    } => { ... };
    {
        name: $struct_name:ident,
        dir: $dir:expr,
        $(,)?
    } => { ... };
    {
        @impl
        name: $struct_name:ident,
        list: { $($list_field:ident: $list_ty:ty),* $(,)? },
        opt: { $($opt_field:ident: $opt_ty:ty),* $(,)? },
        req: { $($req_field:ident: $req_ty:ty),* $(,)? },
        $(,)?
    } => { ... };
}
Expand description

Generates an AAM-based config loader struct that reads .aam files from a directory and exposes typed field accessors.

§Syntax

define_aam_loader! {
    name: MyLoader,
    dir: "packages/",

    list: {
        build_deps: String,
        run_deps: String,
    },
    opt: {
        updating_time: u64,
        version: String,
    },
    req: {
        description: String,
    },
}

Field sections (all optional, omit any empty section):

  • list: { name: InnerType }fn name(&self, id) -> Result<Vec<InnerType>> Returns empty vec when the key is missing.
  • opt: { name: Type }fn name(&self, id) -> Result<Option<Type>> Returns None when the key is missing.
  • req: { name: Type }fn name(&self, id) -> Result<Type> Returns an error when the key is missing.

Generated methods (always present):

  • new(), load_dir(path), load_aam(path)
  • get_dep(id) -> Option<Arc<AAM>>
  • get_all_ids() -> Vec<String>

§Example

use aam_core::define_aam_loader;

define_aam_loader! {
    name: Deps,
    dir: "packages",

    list: {
        build_deps: String,
        tags: String,
    },
    opt: {
        updating_time: u64,
    },
    req: {
        description: String,
    },
}

// The struct Deps is generated with:
// - Deps::new()
// - deps.load_dir("path/") -> anyhow::Result<()>
// - deps.get_dep("id") -> Option<Arc<AAM>>
// - deps.get_all_ids() -> Vec<String>
// - deps.build_deps("id") -> anyhow::Result<Vec<String>>
// - deps.tags("id") -> anyhow::Result<Vec<String>>
// - deps.updating_time("id") -> anyhow::Result<Option<u64>>
// - deps.description("id") -> anyhow::Result<String>