use clap::Subcommand;
use comfy_table::Table;
use ordinary_monitor::LogFileMetadata;
use std::collections::BTreeMap;
#[derive(Clone, Debug)]
pub enum LogFormat {
All,
Top,
Count,
}
impl LogFormat {
pub fn as_str(&self) -> &'static str {
match self {
Self::All => "all",
Self::Top => "top",
Self::Count => "count",
}
}
}
impl clap::ValueEnum for LogFormat {
fn value_variants<'a>() -> &'a [Self] {
&[Self::All, Self::Top, Self::Count]
}
fn to_possible_value(&self) -> Option<clap::builder::PossibleValue> {
match self {
Self::All => Some(clap::builder::PossibleValue::new("all")),
Self::Top => Some(clap::builder::PossibleValue::new("top")),
Self::Count => Some(clap::builder::PossibleValue::new("count")),
}
}
}
#[derive(Subcommand, Debug)]
pub enum Logs {
Sync {
#[command(subcommand)]
sync: Sync,
},
#[clap(visible_aliases(["ls"]))]
List,
Read {
#[arg(short, long)]
name: Option<String>,
},
Query {
query: String,
#[arg(short, long, value_delimiter = ',')]
json_columns: Option<Vec<String>>,
#[arg(short, long)]
sync: Option<bool>,
},
Search {
format: LogFormat,
query: String,
#[arg(long)]
limit: Option<usize>,
#[arg(short, long)]
sync: Option<bool>,
},
}
#[derive(Subcommand, Debug)]
pub enum Sync {
Info,
File {
name: String,
},
All {
#[arg(short, long)]
force: Option<bool>,
},
}
pub fn print_logs_metadata_table(
remote_metadata_vec: Vec<LogFileMetadata>,
local_metadata_vec: Vec<LogFileMetadata>,
) {
let mut table = Table::new();
table.set_header(vec!["file", "size", "remote", "local"]);
let mut rows_map = BTreeMap::new();
for metadata in remote_metadata_vec {
rows_map.insert(
metadata.name.clone(),
vec![
metadata.name.clone(),
format!("{}", bytesize::ByteSize(metadata.size).display().si_short()),
"✅".to_string(),
"❌".to_string(),
],
);
}
for metadata in local_metadata_vec {
if let Some(row) = rows_map.get_mut(&metadata.name) {
let local_size = format!("{}", bytesize::ByteSize(metadata.size).display().si_short());
if row[1] == local_size {
row[3] = "✅".to_string();
} else {
row[3] = "⚠️".to_string();
}
row[1] = format!("{local_size}/{}", row[1]);
} else {
rows_map.insert(
metadata.name.clone(),
vec![
metadata.name.clone(),
format!("{}", bytesize::ByteSize(metadata.size).display().si_short()),
"❌".to_string(),
"✅".to_string(),
],
);
}
}
for (_, row) in rows_map {
table.add_row(row);
}
println!("\n{table}\n");
}