lsp_workspace_symbols/
lsp_workspace_symbols.rs1use std::{env, path::PathBuf, time::Duration};
2
3use anyhow::{Context, Result, anyhow};
4use cgraph::fetch::lsp::{LspConfig, LspProvider};
5
6#[tokio::main]
7async fn main() -> Result<()> {
8 let mut args = env::args_os().skip(1);
9 let program = args
10 .next()
11 .context("usage: lsp_workspace_symbols <SERVER> <QUERY> [WORKSPACE]")?;
12 let query = args
13 .next()
14 .context("usage: lsp_workspace_symbols <SERVER> <QUERY> [WORKSPACE]")?
15 .into_string()
16 .map_err(|_| anyhow!("query must be valid UTF-8"))?;
17 let workspace_root = match args.next() {
18 Some(path) => PathBuf::from(path),
19 None => env::current_dir().context("failed to determine current directory")?,
20 };
21
22 let lsp = LspProvider::start(LspConfig::for_server(program, workspace_root)).await?;
23 tokio::time::sleep(Duration::from_secs(2)).await;
24 let symbols = lsp.workspace_symbols(&query).await?;
25
26 for symbol in symbols {
27 let line = symbol
28 .range
29 .map(|range| (range.start.line + 1).to_string())
30 .unwrap_or_else(|| "?".to_owned());
31 println!("{}\t{}:{line}", symbol.name, symbol.uri);
32 }
33
34 lsp.shutdown().await
35}