macro_rules! declare_resources {
(resources: [ $($resource:expr),* $(,)? ]) => { ... };
(
resources: [ $($resource:expr),* $(,)? ],
templates: [ $($template:expr),* $(,)? ]
) => { ... };
(
resources: [ $($resource:expr),* $(,)? ],
templates: [ $($template:expr),* $(,)? ],
read_fallback: $fallback:expr
) => { ... };
(@impl resources: [$($resource:expr),*], templates: [$($template:expr),*], read_fallback: [$($fallback:tt)*]) => { ... };
(@generated_functions) => { ... };
}Expand description
Declare resources and auto-generate list_resources, list_resource_templates, and read_resource
Dispatches read_resource in order: exact static URI, first matching URI template
({var} placeholders), then optional read_fallback.
§Example (static resources only)
ⓘ
declare_resources! {
resources: [
Resource::builder("file:///docs/readme", read_readme)
.name("readme.md")
.build(),
]
}§Example (templates + fallback)
ⓘ
fn read_file(uri: &str, vars: &HashMap<String, String>) -> Result<ResourceContents, String> {
let path = vars.get("path").ok_or("missing path")?;
Ok(vec![ResourceContent::text(uri, contents, Some("text/plain".into()))])
}
fn read_any(uri: &str) -> Result<ResourceContents, String> {
Err("not found".into())
}
declare_resources! {
resources: [],
templates: [
ResourceTemplate::builder("file:///project/{path}", read_file)
.name("project-files")
.build(),
],
read_fallback: read_any
}