Skip to main content

boost/tools/
components.rs

1//! `list-components` — every `#[spark_component]`-registered Spark component.
2
3use async_trait::async_trait;
4use serde_json::{json, Value};
5
6use crate::protocol::CallToolResult;
7use crate::tool::{Context, Tool};
8
9pub struct ListComponents;
10
11#[async_trait]
12impl Tool for ListComponents {
13    fn name(&self) -> &'static str {
14        "list-components"
15    }
16    fn description(&self) -> &'static str {
17        "List every Spark (Livewire-equivalent) component registered via `#[spark_component]`. Returns each component's class FQN, template path, and broadcast listeners."
18    }
19
20    async fn call(&self, _ctx: &Context, _args: Value) -> CallToolResult {
21        let classes = spark::registry::classes();
22        let entries: Vec<Value> = classes
23            .iter()
24            .filter_map(|class| {
25                let entry = spark::registry::lookup(class)?;
26                Some(json!({
27                    "class": entry.class,
28                    "view": entry.view,
29                    "listeners": (entry.listeners)(),
30                }))
31            })
32            .collect();
33        CallToolResult::json(&json!({
34            "count": entries.len(),
35            "components": entries,
36        }))
37    }
38}