lsmem: Add option json

This commit is contained in:
Yang Hau
2024-08-26 01:23:42 +08:00
parent f83d22b3ea
commit 3aef200dc1

View File

@@ -7,7 +7,7 @@ mod utils;
use clap::{crate_version, Command}; use clap::{crate_version, Command};
use clap::{Arg, ArgAction}; use clap::{Arg, ArgAction};
use serde::Deserialize; use serde::{Deserialize, Serialize};
use std::borrow::Borrow; use std::borrow::Borrow;
use std::fs; use std::fs;
use std::io::{self, BufRead, BufReader}; use std::io::{self, BufRead, BufReader};
@@ -30,6 +30,7 @@ const USAGE: &str = help_usage!("lsmem.md");
mod options { mod options {
pub const BYTES: &str = "bytes"; pub const BYTES: &str = "bytes";
pub const NOHEADINGS: &str = "noheadings"; pub const NOHEADINGS: &str = "noheadings";
pub const JSON: &str = "json";
} }
// const BUFSIZ: usize = 1024; // const BUFSIZ: usize = 1024;
@@ -191,7 +192,7 @@ impl MemoryBlock {
} }
} }
#[derive(Tabled, Default)] #[derive(Tabled, Default, Serialize)]
struct TableRow { struct TableRow {
#[tabled(rename = "RANGE")] #[tabled(rename = "RANGE")]
range: String, range: String,
@@ -204,16 +205,23 @@ struct TableRow {
#[tabled(rename = "BLOCK")] #[tabled(rename = "BLOCK")]
block: String, block: String,
#[tabled(rename = "NODE")] #[tabled(rename = "NODE")]
#[serde(skip_serializing)]
node: String, node: String,
#[tabled(rename = "ZONES")] #[tabled(rename = "ZONES")]
#[serde(skip_serializing)]
zones: String, zones: String,
} }
#[derive(Serialize)]
struct TableRowJson {
memory: Vec<TableRow>,
}
struct Options { struct Options {
have_nodes: bool, have_nodes: bool,
// raw: bool, // raw: bool,
// export: bool, // export: bool,
// json: bool, json: bool,
noheadings: bool, noheadings: bool,
// summary: bool, // summary: bool,
list_all: bool, list_all: bool,
@@ -257,7 +265,7 @@ impl Options {
have_nodes: false, have_nodes: false,
// raw: false, // raw: false,
// export: false, // export: false,
// json: false, json: false,
noheadings: false, noheadings: false,
// summary: false, // summary: false,
list_all: false, list_all: false,
@@ -418,8 +426,8 @@ fn memory_block_read_attrs(opts: &Options, path: &PathBuf) -> MemoryBlock {
blk blk
} }
fn create_table(lsmem: &Lsmem, opts: &Options) -> tabled::Table { fn create_table_rows(lsmem: &Lsmem, opts: &Options) -> Vec<TableRow> {
let mut table = Vec::<TableRow>::new(); let mut table_rows = Vec::<TableRow>::new();
for i in 0..lsmem.nblocks { for i in 0..lsmem.nblocks {
let mut row = TableRow::default(); let mut row = TableRow::default();
@@ -465,13 +473,13 @@ fn create_table(lsmem: &Lsmem, opts: &Options) -> tabled::Table {
row.node = format!("{}", blk.node); row.node = format!("{}", blk.node);
} }
table.push(row); table_rows.push(row);
} }
Table::new(table) table_rows
} }
fn print_table(lsmem: &Lsmem, opts: &Options) { fn print_table(lsmem: &Lsmem, opts: &Options) {
let mut table = create_table(lsmem, opts); let mut table = Table::new(create_table_rows(lsmem, opts));
table table
.with(Style::blank()) .with(Style::blank())
.with(Modify::new(object::Columns::new(1..)).with(Alignment::right())); .with(Modify::new(object::Columns::new(1..)).with(Alignment::right()));
@@ -487,6 +495,15 @@ fn print_table(lsmem: &Lsmem, opts: &Options) {
println!("{table}"); println!("{table}");
} }
fn print_json(lsmem: &Lsmem, opts: &Options) {
let table_json = TableRowJson {
memory: create_table_rows(lsmem, opts),
};
let table_json_string = serde_json::to_string_pretty(&table_json).unwrap();
println!("{table_json_string}");
}
fn print_summary(lsmem: &Lsmem, opts: &Options) { fn print_summary(lsmem: &Lsmem, opts: &Options) {
if opts.bytes { if opts.bytes {
println!("{:<23} {:>15}", "Memory block size:", lsmem.block_size); println!("{:<23} {:>15}", "Memory block size:", lsmem.block_size);
@@ -530,14 +547,19 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
let mut opts = Options::new(); let mut opts = Options::new();
opts.bytes = matches.get_flag(options::BYTES); opts.bytes = matches.get_flag(options::BYTES);
opts.noheadings = matches.get_flag(options::NOHEADINGS); opts.noheadings = matches.get_flag(options::NOHEADINGS);
opts.json = matches.get_flag(options::JSON);
read_info(&mut lsmem, &mut opts); read_info(&mut lsmem, &mut opts);
if opts.want_table { if opts.want_table {
if opts.json {
print_json(&lsmem, &opts);
} else {
print_table(&lsmem, &opts); print_table(&lsmem, &opts);
} }
}
if opts.want_summary { if opts.want_summary && !opts.json {
print_summary(&lsmem, &opts); print_summary(&lsmem, &opts);
} }
@@ -564,4 +586,11 @@ pub fn uu_app() -> Command {
.help("don't print headings") .help("don't print headings")
.action(ArgAction::SetTrue), .action(ArgAction::SetTrue),
) )
.arg(
Arg::new(options::JSON)
.short('J')
.long("json")
.help("use JSON output format")
.action(ArgAction::SetTrue),
)
} }