lsmem: Add option json
This commit is contained in:
@@ -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),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user