macro_rules! generate_catalog_registry {
($({
feature: $feature:literal,
// `$field`:Client 字段名;generation-time 唯一性(同模块重复 struct → 编译失败)
field: $field:ident,
ty: $_ty:ty,
doc: $_doc:literal,
init: |$_core_config:ident, $_base_core_config:ident| $_init:block,
name: $name:literal,
description: $description:literal,
dependencies: [$($dependency:literal),* $(,)?],
provides: [$($capability:literal),* $(,)?],
priority: $priority:literal $(,)?
}),* $(,)?) => {
assert_capability_catalog_unique! {
$(
{ field: $field, name: $name },
)*
}
pub(crate) fn register_catalog_capabilities(
registry: &mut crate::DefaultServiceRegistry,
) -> crate::Result<()> {
let _: fn(
&mut crate::DefaultServiceRegistry,
crate::registry::ServiceMetadata,
) -> crate::registry::RegistryResult<()> =
crate::DefaultServiceRegistry::register_service;
$(
#[cfg(feature = $feature)]
{
use crate::registry::ServiceMetadata;
let metadata = ServiceMetadata {
name: $name.to_string(),
version: "1.0.0".to_string(),
description: Some($description.to_string()),
dependencies: vec![$($dependency.to_string()),*],
provides: vec![$($capability.to_string()),*],
priority: $priority,
};
registry
.register_service(metadata)
.map_err(crate::error::registry_error)?;
}
)*
let _ = registry;
Ok(())
}
#[cfg(test)]
pub(crate) fn catalog_capability_names() -> Vec<&'static str> {
[
None::<&'static str>,
$(
#[cfg(feature = $feature)]
Some($name),
)*
]
.into_iter()
.flatten()
.collect()
}
};
}