Skip to main content

declare_resources

Macro declare_resources 

Source
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
}