use clap::Parser;
use std::path::PathBuf;
#[derive(Debug, Parser, Clone)]
#[command(
name = "grafatui",
version,
about = "Grafana-like Prometheus charts in your terminal"
)]
pub(crate) struct Args {
#[arg(long)]
pub(crate) prometheus_url: Option<String>,
#[arg(long, value_name = "DURATION")]
pub(crate) range: Option<String>,
#[arg(long, value_name = "DURATION")]
pub(crate) step: Option<String>,
#[arg(long, value_name = "FILE")]
pub(crate) grafana_json: Option<PathBuf>,
#[arg(long, default_value = "250")]
pub(crate) tick_rate: u64,
#[arg(long, value_name = "MS")]
pub(crate) refresh_rate: Option<u64>,
#[arg(long, value_name = "EXPR")]
pub(crate) query: Vec<String>,
#[arg(long, value_parser = parse_key_val::<String, String>, value_name = "KEY=VALUE")]
pub(crate) var: Vec<(String, String)>,
#[arg(long, value_name = "NAME")]
pub(crate) theme: Option<String>,
#[arg(long, value_name = "MARKER")]
pub(crate) threshold_marker: Option<String>,
#[arg(long, value_name = "COLOR")]
pub(crate) autogrid_color: Option<String>,
#[arg(long, value_name = "DIR")]
pub(crate) export_dir: Option<PathBuf>,
#[arg(long, value_enum, value_name = "FORMAT")]
pub(crate) export_format: Option<crate::export::ExportFormat>,
#[arg(long, value_name = "COUNT")]
pub(crate) record_max_frames: Option<usize>,
#[arg(long, value_name = "FILE")]
pub(crate) config: Option<PathBuf>,
#[command(subcommand)]
pub(crate) command: Option<Commands>,
}
#[derive(Debug, clap::Subcommand, Clone)]
pub(crate) enum Commands {
Completions {
shell: clap_complete::Shell,
},
Man,
}
pub(crate) 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()?))
}