Skip to content

Commit e803a18

Browse files
authored
add json output (#7)
1 parent 5ad5f24 commit e803a18

4 files changed

Lines changed: 79 additions & 4 deletions

File tree

Cargo.lock

Lines changed: 40 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ categories = ["command-line-utilities", "network-programming"]
1515
ratatui = "0.26"
1616
crossterm = "0.27"
1717
rand = "0.9.2"
18+
serde = { version = "1.0", features = ["derive"] }
19+
serde_json = "1.0"
1820

1921
[lints.clippy]
2022
pedantic = "deny"

src/main.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,45 @@ use crossterm::{
99
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
1010
};
1111
use ratatui::{backend::CrosstermBackend, Terminal};
12+
use std::env;
1213
use std::io;
1314
use std::time::{Duration, Instant};
1415

1516
const UI_REFRESH_INTERVAL_MS: u64 = 33;
1617
const METRICS_UPDATE_INTERVAL_MS: u64 = 250;
1718

1819
fn main() -> Result<(), io::Error> {
20+
let args: Vec<String> = env::args().collect();
21+
let json_mode = args.contains(&String::from("--json"));
22+
23+
if json_mode {
24+
run_json_mode()
25+
} else {
26+
run_interactive_mode()
27+
}
28+
}
29+
30+
fn run_json_mode() -> Result<(), io::Error> {
31+
let use_fake_data = std::env::var("IBTOP_FAKE_DATA").is_ok();
32+
33+
let adapters = if use_fake_data {
34+
discovery::fake::generate_fake_adapters()
35+
} else {
36+
let real_adapters = discovery::discover_adapters();
37+
if real_adapters.is_empty() && std::env::var("IBTOP_DEMO").is_ok() {
38+
discovery::fake::generate_fake_adapters()
39+
} else {
40+
real_adapters
41+
}
42+
};
43+
44+
let json_output = serde_json::to_string_pretty(&adapters)?;
45+
println!("{json_output}");
46+
47+
Ok(())
48+
}
49+
50+
fn run_interactive_mode() -> Result<(), io::Error> {
1951
enable_raw_mode()?;
2052
let mut stdout = io::stdout();
2153
execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;

src/types.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
use serde::{Deserialize, Serialize};
12
use std::fmt::Display;
23
use std::str::FromStr;
34

4-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
5+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
56
pub(crate) enum PortState {
67
Active,
78
Down,
@@ -29,21 +30,21 @@ impl FromStr for PortState {
2930
}
3031
}
3132

32-
#[derive(Debug)]
33+
#[derive(Debug, Serialize, Deserialize)]
3334
pub(crate) struct AdapterInfo {
3435
pub(crate) name: String,
3536
pub(crate) ports: Vec<PortInfo>,
3637
}
3738

38-
#[derive(Debug, Default)]
39+
#[derive(Debug, Default, Serialize, Deserialize)]
3940
pub(crate) struct PortInfo {
4041
pub(crate) port_number: u16,
4142
pub(crate) state: PortState,
4243
pub(crate) rate: String,
4344
pub(crate) counters: PortCounters,
4445
}
4546

46-
#[derive(Debug, Default, Clone)]
47+
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
4748
pub(crate) struct PortCounters {
4849
pub(crate) rx_bytes: u64,
4950
pub(crate) tx_bytes: u64,

0 commit comments

Comments
 (0)