diff --git a/Cargo.lock b/Cargo.lock index 74ec1d4f..8c26f680 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2268,6 +2268,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml 0.9.34+deprecated", + "tabwriter", "termcolor", "tokio", "tokio-stream", @@ -9088,6 +9089,15 @@ dependencies = [ "windows 0.52.0", ] +[[package]] +name = "tabwriter" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a327282c4f64f6dc37e3bba4c2b6842cc3a992f204fa58d917696a89f691e5f6" +dependencies = [ + "unicode-width", +] + [[package]] name = "tap" version = "1.0.1" @@ -9604,7 +9614,7 @@ version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "static_assertions", ] diff --git a/binaries/cli/Cargo.toml b/binaries/cli/Cargo.toml index 15ee0424..cc910b39 100644 --- a/binaries/cli/Cargo.toml +++ b/binaries/cli/Cargo.toml @@ -42,3 +42,4 @@ tokio = { version = "1.20.1", features = ["full"] } tokio-stream = { version = "0.1.8", features = ["io-util", "net"] } futures = "0.3.21" duration-str = "0.5" +tabwriter = "1.4.0" diff --git a/binaries/cli/src/main.rs b/binaries/cli/src/main.rs index 290a0cc9..1dcc33f9 100644 --- a/binaries/cli/src/main.rs +++ b/binaries/cli/src/main.rs @@ -15,12 +15,13 @@ use dora_tracing::set_up_tracing; use dora_tracing::set_up_tracing_opts; use duration_str::parse; use eyre::{bail, Context}; -use std::net::SocketAddr; +use std::{io::Write, net::SocketAddr}; use std::{ net::{IpAddr, Ipv4Addr}, path::PathBuf, time::Duration, }; +use tabwriter::TabWriter; use tokio::runtime::Builder; use uuid::Uuid; @@ -574,29 +575,46 @@ fn stop_dataflow_by_name( fn list(session: &mut TcpRequestReplyConnection) -> Result<(), eyre::ErrReport> { let list = query_running_dataflows(session)?; - if list.active.is_empty() { - eprintln!("No dataflows are running"); - } else { - println!("Running dataflows:"); - for id in list.active { - println!("- {id}"); - } + let mut tw = TabWriter::new(vec![]); + tw.write_all(b"UUID\tName\tStatus\n")?; + + for id in list.active { + tw.write_all( + format!( + "{}\t{}\trunning\n", + id.uuid, + id.name.as_deref().unwrap_or_default() + ) + .as_bytes(), + )?; } - if !list.failed.is_empty() { - println!("Failed dataflows:"); - for id in list.failed { - println!("- {id}"); - } + for id in list.failed { + tw.write_all( + format!( + "{}\t{}\tFAILED\n", + id.uuid, + id.name.as_deref().unwrap_or_default() + ) + .as_bytes(), + )?; } - if !list.finished.is_empty() { - println!("Finished dataflows:"); - for id in list.finished { - println!("- {id}"); - } + for id in list.finished { + tw.write_all( + format!( + "{}\t{}\tfinished\n", + id.uuid, + id.name.as_deref().unwrap_or_default() + ) + .as_bytes(), + )?; } + tw.flush()?; + let formatted = String::from_utf8(tw.into_inner()?)?; + println!("{formatted}"); + Ok(()) }