boost/tools/
components.rs1use 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}