use crate::commands::daemon_utils::daemon_base_url;
use anyhow::Result;
use colored::Colorize;
pub async fn index_single_file(
client: &reqwest::Client,
base: &str,
index_id: &str,
file: &std::path::Path,
) -> Result<()> {
let content = tokio::fs::read_to_string(file)
.await
.map_err(|e| anyhow::anyhow!("read {}: {e}", file.display()))?;
let url = format!("{}/indexes/{}/index-file", base, index_id);
let body = serde_json::json!({
"path": file.display().to_string(),
"content": content,
});
let resp = client.post(&url).json(&body).send().await?;
if !resp.status().is_success() {
anyhow::bail!("daemon returned {} for {}", resp.status(), url);
}
Ok(())
}
pub async fn add_path(index_id: &str, path: &std::path::Path) -> Result<()> {
let base = daemon_base_url();
let client = trusty_common::server::daemon_http_client()?;
if path.is_dir() {
let walk = crate::service::walker::walk_source_files(path);
println!(
"{} [{}] indexing {} files under {}",
"\u{2192}".cyan(),
index_id,
walk.files.len(),
path.display()
);
let mut ok = 0usize;
let mut err = 0usize;
for f in &walk.files {
match index_single_file(&client, &base, index_id, f).await {
Ok(()) => ok += 1,
Err(e) => {
eprintln!(" {} {}: {e}", "\u{26a0}".yellow(), f.display());
err += 1;
}
}
}
println!(
"{} indexed {} files ({} errors)",
"\u{2713}".green(),
ok,
err
);
Ok(())
} else {
index_single_file(&client, &base, index_id, path).await?;
println!("{} [{}] {}", "\u{2192}".cyan(), index_id, path.display());
Ok(())
}
}