1use std::{error, sync::Arc};
2use tokio::sync::Mutex;
3
4use org_core::{Config, OrgMode};
5use rmcp::handler::server::tool::ToolRouter;
6
7pub struct OrgModeRouter {
8 pub(crate) org_mode: Arc<Mutex<OrgMode>>,
9 pub(crate) tool_router: ToolRouter<Self>,
10}
11
12impl OrgModeRouter {
13 pub fn with_config(config: Config) -> Result<Self, Box<dyn error::Error>> {
14 let org_mode = OrgMode::new(config)?;
15 Ok(Self {
16 org_mode: Arc::new(Mutex::new(org_mode)),
17 tool_router: Self::tool_router(),
18 })
19 }
20
21 pub fn with_directory(org_dir: &str) -> Result<Self, Box<dyn error::Error>> {
22 let mut config = Config::default();
23 config.org.org_directory = org_dir.to_string();
24 let config = config.validate()?;
25 Self::with_config(config)
26 }
27
28 fn tool_router() -> ToolRouter<Self> {
29 Self::tool_router_list_files() + Self::tool_router_search()
30 }
31}