use std::io::Write;
use anyhow::{Context, bail};
use clap::Args;
use crate::http::{DEFAULT_ADMIN_PASSWORD, DEFAULT_ADMIN_USER};
#[derive(Debug, Args)]
pub(crate) struct ConnectArgs {
#[arg(long, env = "FLUSSO_SERVER", default_value = "127.0.0.1:9465")]
server: String,
#[arg(long, env = "FLUSSO_ADMIN_USER", default_value = DEFAULT_ADMIN_USER)]
admin_user: String,
#[arg(long, env = "FLUSSO_ADMIN_PASSWORD", default_value = DEFAULT_ADMIN_PASSWORD)]
admin_password: String,
}
impl ConnectArgs {
fn base_url(&self) -> String {
let server = self.server.trim_end_matches('/');
if server.starts_with("http://") || server.starts_with("https://") {
server.to_owned()
} else {
format!("http://{server}")
}
}
fn request(&self, method: reqwest::Method, path: &str) -> reqwest::RequestBuilder {
reqwest::Client::new()
.request(method, format!("{}{path}", self.base_url()))
.basic_auth(&self.admin_user, Some(&self.admin_password))
}
}
#[derive(Debug, Args)]
pub(crate) struct IndexesArgs {
#[command(flatten)]
connect: ConnectArgs,
}
#[derive(Debug, Args)]
pub(crate) struct ReindexArgs {
index: String,
#[command(flatten)]
connect: ConnectArgs,
}
pub(crate) async fn indexes(args: IndexesArgs) -> anyhow::Result<()> {
let resp = args
.connect
.request(reqwest::Method::GET, "/indexes")
.send()
.await
.context("requesting /indexes")?;
let status = resp.status();
let body = resp.text().await.unwrap_or_default();
if !status.is_success() {
bail!("server returned {status}: {}", body.trim());
}
let mut out = std::io::stdout().lock();
match serde_json::from_str::<serde_json::Value>(&body) {
Ok(value) => writeln!(out, "{}", serde_json::to_string_pretty(&value)?)?,
Err(_) => writeln!(out, "{}", body.trim())?,
}
Ok(())
}
pub(crate) async fn reindex(args: ReindexArgs) -> anyhow::Result<()> {
let resp = args
.connect
.request(reqwest::Method::POST, "/reindex")
.query(&[("index", &args.index)])
.send()
.await
.context("requesting /reindex")?;
let status = resp.status();
let body = resp.text().await.unwrap_or_default();
if !status.is_success() {
bail!("server returned {status}: {}", body.trim());
}
let mut out = std::io::stdout().lock();
writeln!(out, "{}", body.trim())?;
Ok(())
}
#[cfg(test)]
mod tests;