use clap::Parser;
use std::path::PathBuf;
#[derive(Debug, Parser, Clone)]
#[command(
name = "grafatui",
version,
about = "Grafana-like Prometheus charts in your terminal"
)]
pub struct Args {
#[arg(long)]
pub prometheus_url: Option<String>,
#[arg(long, value_name = "DURATION")]
pub range: Option<String>,
#[arg(long, value_name = "DURATION")]
pub step: Option<String>,
#[arg(long, value_name = "FILE")]
pub grafana_json: Option<PathBuf>,
#[arg(long, default_value = "250")]
pub tick_rate: u64,
#[arg(long, value_name = "MS")]
pub refresh_rate: Option<u64>,
#[arg(long, value_name = "EXPR")]
pub query: Vec<String>,
#[arg(long, value_parser = parse_key_val::<String, String>, value_name = "KEY=VALUE")]
pub var: Vec<(String, String)>,
#[arg(long, value_name = "NAME")]
pub theme: Option<String>,
#[arg(long, value_name = "MARKER")]
pub threshold_marker: Option<String>,
#[arg(long, value_name = "COLOR")]
pub autogrid_color: Option<String>,
#[arg(long, value_name = "FILE")]
pub config: Option<PathBuf>,
#[command(subcommand)]
pub command: Option<Commands>,
}
#[derive(Debug, clap::Subcommand, Clone)]
pub enum Commands {
Completions {
shell: clap_complete::Shell,
},
Man,
}
pub fn parse_key_val<T, U>(
s: &str,
) -> Result<(T, U), Box<dyn std::error::Error + Send + Sync + 'static>>
where
T: std::str::FromStr,
T::Err: std::error::Error + Send + Sync + 'static,
U: std::str::FromStr,
U::Err: std::error::Error + Send + Sync + 'static,
{
let pos = s
.find('=')
.ok_or_else(|| format!("invalid KEY=value: no `=` found in `{}`", s))?;
Ok((s[..pos].parse()?, s[pos + 1..].parse()?))
}