krata: reconcile improvements and better kratactl error experience

This commit is contained in:
Alex Zenla
2024-03-23 07:00:12 +00:00
parent df90a4d03f
commit 3d5095c78b
12 changed files with 119 additions and 62 deletions

View File

@ -1,11 +1,27 @@
use anyhow::Result;
use clap::Parser;
use krata::control::watch_events_reply::Event;
use clap::{Parser, ValueEnum};
use krata::{common::Guest, control::watch_events_reply::Event};
use prost_reflect::ReflectMessage;
use serde_json::Value;
use crate::{cli::pretty::guest_status_text, events::EventStream};
use crate::{
cli::pretty::guest_state_text,
events::EventStream,
format::{kv2line, proto2dynamic, proto2kv},
};
#[derive(ValueEnum, Clone, Debug, PartialEq, Eq)]
enum WatchFormat {
Simple,
Json,
KeyValue,
}
#[derive(Parser)]
pub struct WatchCommand {}
pub struct WatchCommand {
#[arg(short, long, default_value = "simple")]
format: WatchFormat,
}
impl WatchCommand {
pub async fn run(self, events: EventStream) -> Result<()> {
@ -14,15 +30,46 @@ impl WatchCommand {
let event = stream.recv().await?;
match event {
Event::GuestChanged(changed) => {
if let Some(guest) = changed.guest {
println!(
"event=guest.changed guest={} status={}",
guest.id,
guest_status_text(guest.state.unwrap_or_default().status())
);
}
let guest = changed.guest.clone();
self.print_event("guest.changed", changed, guest)?;
}
}
}
}
fn print_event(
&self,
typ: &str,
event: impl ReflectMessage,
guest: Option<Guest>,
) -> Result<()> {
match self.format {
WatchFormat::Simple => {
if let Some(guest) = guest {
println!(
"{} guest={} status=\"{}\"",
typ,
guest.id,
guest_state_text(guest.state.as_ref()).replace('"', "\\\"")
);
}
}
WatchFormat::Json => {
let message = proto2dynamic(event)?;
let mut value = serde_json::to_value(&message)?;
if let Value::Object(ref mut map) = value {
map.insert("event.type".to_string(), Value::String(typ.to_string()));
}
println!("{}", serde_json::to_string(&value)?);
}
WatchFormat::KeyValue => {
let mut map = proto2kv(event)?;
map.insert("event.type".to_string(), typ.to_string());
println!("{}", kv2line(map),);
}
}
Ok(())
}
}