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>>ReturnsNonewhen 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>