diff --git a/Cargo.lock b/Cargo.lock index c8dfbbf..1a3fc8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1971,11 +1971,13 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tmf-cli" -version = "0.1.1" +version = "0.1.2" dependencies = [ "clap", "env_logger", "log", + "serde", + "serde_json", "tmf-client", "tmflib", ] diff --git a/Cargo.toml b/Cargo.toml index 9d474fc..35a3429 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tmf-cli" -version = "0.1.1" +version = "0.1.2" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -9,6 +9,8 @@ edition = "2021" clap = { version = "4.5.27", features = ["derive"]} env_logger = "0.11.6" log = "0.4.25" +serde = "1.0.217" +serde_json = "1.0.137" tmf-client = "0.1.5" # tmf-client = { git = "https://github.com/rruckley/tmf-client.git" } tmflib = "0.1.25" diff --git a/src/main.rs b/src/main.rs index a9684db..1d74f8c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -34,6 +34,11 @@ use tmf::tmf674::{ handle_tmf674, }; +pub enum Output { + Text, + Json, +} + #[derive(Parser,Debug)] #[command(version, about = "CLI tool for interacting with TMF APIs", author = "Ryan Ruckley")] struct Args { @@ -54,6 +59,10 @@ struct Args { #[clap(global = true)] #[arg(short = 'n', long)] name: Option, + + #[clap(global = true)] + #[arg(short = 'j', long)] + json: Option, } #[derive(Subcommand,Debug)] @@ -108,6 +117,16 @@ fn main() -> Result<(),TMFError> { opts = opts.name(n); } + let output = match args.json { + Some(j) => { + match j { + true => Output::Json, + false => Output::Text, + } + }, + None => Output::Text, + }; + // Find a host let host = match args.hostname { Some(h) => h, @@ -120,25 +139,25 @@ fn main() -> Result<(),TMFError> { match args.tmf { TMFModules::TMF620 { module } => { - handle_tmf620(&mut client, module, Some(opts)) + handle_tmf620(&mut client, module, Some(opts),output) }, TMFModules::TMF622 { module } => { handle_tmf622(&mut client, module, Some(opts)) }, TMFModules::TMF629 { module } => { - handle_tmf629(&mut client, module, Some(opts)) + handle_tmf629(&mut client, module, Some(opts),output) }, TMFModules::TMF632 { module } => { - handle_tmf632(&mut client, module, Some(opts)) + handle_tmf632(&mut client, module, Some(opts),output) }, TMFModules::TMF633 { module } => { - handle_tmf633(&mut client, module, Some(opts)) + handle_tmf633(&mut client, module, Some(opts),output) }, TMFModules::TMF648 { module } => { - handle_tmf648(&mut client, module, Some(opts)) + handle_tmf648(&mut client, module, Some(opts),output) }, TMFModules::TMF674 { module } => { - handle_tmf674(&mut client, module, Some(opts)) + handle_tmf674(&mut client, module, Some(opts),output) } } } \ No newline at end of file diff --git a/src/tmf/mod.rs b/src/tmf/mod.rs index 44bb94f..5732513 100644 --- a/src/tmf/mod.rs +++ b/src/tmf/mod.rs @@ -5,6 +5,9 @@ use tmflib::{ HasName, HasDescription, }; +use serde::Serialize; + +use crate::Output; pub mod tmf620; pub mod tmf622; @@ -25,10 +28,18 @@ pub enum TMFOperation { Delete } -pub fn iterate_name(items : &Vec) { - items.iter().for_each(|i| { - println!("Item: [{}] {} [{}]",T::get_class(),i.get_name(),i.get_id()); - }); +pub fn iterate_name(items : &Vec,output : Output) { + match output { + Output::Text => { + items.iter().for_each(|i| { + println!("Item: [{}] {} [{}]",T::get_class(),i.get_name(),i.get_id()); + }); + }, + Output::Json => { + display_json(items); + } + } + } pub fn iterate_desc(items : &Vec) { @@ -42,10 +53,9 @@ pub fn display_id(item : &T) { println!("Href:\t{}",item.get_href()); } -pub fn display_name(item : &T) { +pub fn display_name(item : &T) { display_id(item); println!("Name:\t{}",item.get_name()); - } pub fn display_desc(item : &T) { @@ -58,4 +68,9 @@ pub fn display_opt(label : &str, field : &Option) { Some(v) => println!("{}:\t{}",label,v), None => println!("{}:\tNot Set",label), } +} + +pub fn display_json(item : T) { + let json = serde_json::to_string(&item).expect("Could not create JSON"); + println!("{}",json); } \ No newline at end of file diff --git a/src/tmf/tmf620.rs b/src/tmf/tmf620.rs index ee298ef..a3671db 100644 --- a/src/tmf/tmf620.rs +++ b/src/tmf/tmf620.rs @@ -2,8 +2,14 @@ use clap::Subcommand; +use crate::Output; + use super::{ - display_desc, display_name, iterate_name, TMFOperation + display_desc, + display_name, + display_json, + iterate_name, + TMFOperation }; use tmf_client::common::tmf_error::TMFError; @@ -36,19 +42,22 @@ pub enum TMF620Modules { }, } -pub fn handle_tmf620(client : &mut TMFClient, module : TMF620Modules, opts : Option) -> Result<(),TMFError> { +pub fn handle_tmf620(client : &mut TMFClient, module : TMF620Modules, opts : Option, output : Output) -> Result<(),TMFError> { match module { TMF620Modules::Catalog { op } => { match op { TMFOperation::List => { let catalogs = client.tmf620().catalog().list(opts)?; - iterate_name(&catalogs); + iterate_name(&catalogs,output); Ok(()) }, TMFOperation::Get { id } => { let catalog = client.tmf620().catalog().get(id)?; let the_first = catalog.first().unwrap(); - display_name(the_first); + match output { + Output::Json => display_json(the_first), + Output::Text => display_name(the_first), + } Ok(()) } _ => { @@ -60,7 +69,7 @@ pub fn handle_tmf620(client : &mut TMFClient, module : TMF620Modules, opts : Opt match op { TMFOperation::List => { let categories = client.tmf620().category().list(opts)?; - iterate_name(&categories); + iterate_name(&categories,output); Ok(()) }, _ => { @@ -72,7 +81,7 @@ pub fn handle_tmf620(client : &mut TMFClient, module : TMF620Modules, opts : Opt match op { TMFOperation::List => { let offerings = client.tmf620().product_offering().list(opts)?; - iterate_name(&offerings); + iterate_name(&offerings,output); Ok(()) }, TMFOperation::Get { id } => { @@ -90,7 +99,7 @@ pub fn handle_tmf620(client : &mut TMFClient, module : TMF620Modules, opts : Opt match op { TMFOperation::List => { let specifications = client.tmf620().product_specification().list(opts)?; - iterate_name(&specifications); + iterate_name(&specifications,output); Ok(()) }, _ => { @@ -103,7 +112,7 @@ pub fn handle_tmf620(client : &mut TMFClient, module : TMF620Modules, opts : Opt match op { TMFOperation::List => { let prices = client.tmf620().product_offering_price().list(opts)?; - iterate_name(&prices); + iterate_name(&prices,output); Ok(()) }, _ => { diff --git a/src/tmf/tmf629.rs b/src/tmf/tmf629.rs index 763eaf1..28f5447 100644 --- a/src/tmf/tmf629.rs +++ b/src/tmf/tmf629.rs @@ -2,6 +2,8 @@ use clap::Subcommand; +use crate::Output; + use super::{ display_name, display_opt, @@ -20,13 +22,13 @@ pub enum TMF629Modules { }, } -pub fn handle_tmf629(client : &mut TMFClient, module : TMF629Modules, opts : Option) -> Result<(),TMFError> { +pub fn handle_tmf629(client : &mut TMFClient, module : TMF629Modules, opts : Option,output : Output) -> Result<(),TMFError> { match module { TMF629Modules::Customer { op } => { match op { TMFOperation::List => { let customers = client.tmf629().customer().list(opts)?; - iterate_name(&customers); + iterate_name(&customers,output); Ok(()) }, TMFOperation::Get { id } => { diff --git a/src/tmf/tmf632.rs b/src/tmf/tmf632.rs index e36a9a3..9a49051 100644 --- a/src/tmf/tmf632.rs +++ b/src/tmf/tmf632.rs @@ -2,6 +2,8 @@ use clap::Subcommand; +use crate::Output; + use super::{ display_name, display_opt, iterate_name, TMFOperation }; @@ -21,13 +23,13 @@ pub enum TMF632Modules { }, } -pub fn handle_tmf632(client : &mut TMFClient, module : TMF632Modules, opts : Option) -> Result<(),TMFError> { +pub fn handle_tmf632(client : &mut TMFClient, module : TMF632Modules, opts : Option,output : Output) -> Result<(),TMFError> { match module { TMF632Modules::Individual { op } => { match op { TMFOperation::List => { let individuals = client.tmf632().individual().list(opts)?; - iterate_name(&individuals); + iterate_name(&individuals,output); Ok(()) }, TMFOperation::Get { id } => { @@ -51,7 +53,7 @@ pub fn handle_tmf632(client : &mut TMFClient, module : TMF632Modules, opts : Opt match op { TMFOperation::List => { let organization = client.tmf632().organization().list(opts)?; - iterate_name(&organization); + iterate_name(&organization,output); Ok(()) }, TMFOperation::Get { id } => { diff --git a/src/tmf/tmf633.rs b/src/tmf/tmf633.rs index e7153e0..eb6e702 100644 --- a/src/tmf/tmf633.rs +++ b/src/tmf/tmf633.rs @@ -4,6 +4,8 @@ use clap::Subcommand; +use crate::Output; + use super::{ display_desc, display_name, iterate_name, TMFOperation }; @@ -33,13 +35,13 @@ pub enum TMF633Modules { }, } -pub fn handle_tmf633(client : &mut TMFClient, module : TMF633Modules, opts : Option) -> Result<(),TMFError> { +pub fn handle_tmf633(client : &mut TMFClient, module : TMF633Modules, opts : Option, output : Output) -> Result<(),TMFError> { match module { TMF633Modules::Catalog { op } => { match op { TMFOperation::List => { let catalogs = client.tmf633().catalog().list(opts)?; - iterate_name(&catalogs); + iterate_name(&catalogs,output); Ok(()) }, TMFOperation::Get { id } => { @@ -57,7 +59,7 @@ pub fn handle_tmf633(client : &mut TMFClient, module : TMF633Modules, opts : Opt match op { TMFOperation::List => { let categories = client.tmf633().category().list(opts)?; - iterate_name(&categories); + iterate_name(&categories,output); Ok(()) }, TMFOperation::Get { id } => { @@ -75,7 +77,7 @@ pub fn handle_tmf633(client : &mut TMFClient, module : TMF633Modules, opts : Opt match op { TMFOperation::List => { let candidates = client.tmf633().candidate().list(opts)?; - iterate_name(&candidates); + iterate_name(&candidates,output); Ok(()) }, TMFOperation::Get { id } => { @@ -93,7 +95,7 @@ pub fn handle_tmf633(client : &mut TMFClient, module : TMF633Modules, opts : Opt match op { TMFOperation::List => { let specifications = client.tmf633().specification().list(opts)?; - iterate_name(&specifications); + iterate_name(&specifications,output); Ok(()) }, TMFOperation::Get { id } => { diff --git a/src/tmf/tmf648.rs b/src/tmf/tmf648.rs index a63eeb9..22f0df8 100644 --- a/src/tmf/tmf648.rs +++ b/src/tmf/tmf648.rs @@ -4,6 +4,8 @@ use clap::Subcommand; +use crate::Output; + use super::{ display_desc, display_opt, @@ -22,13 +24,13 @@ pub enum TMF648Modules { }, } -pub fn handle_tmf648(client : &mut TMFClient, module : TMF648Modules, opts : Option) -> Result<(),TMFError> { +pub fn handle_tmf648(client : &mut TMFClient, module : TMF648Modules, opts : Option,output : Output) -> Result<(),TMFError> { match module { TMF648Modules::Quote { op } => { match op { TMFOperation::List => { let quotes = client.tmf648().quote().list(opts)?; - iterate_name("es); + iterate_name("es,output); Ok(()) }, TMFOperation::Get { id } => { diff --git a/src/tmf/tmf674.rs b/src/tmf/tmf674.rs index 0c0be2e..d042af6 100644 --- a/src/tmf/tmf674.rs +++ b/src/tmf/tmf674.rs @@ -2,6 +2,8 @@ use clap::Subcommand; +use crate::Output; + use super::{ display_name, display_opt, @@ -20,13 +22,13 @@ pub enum TMF674Modules { }, } -pub fn handle_tmf674(client : &mut TMFClient, module : TMF674Modules, opts : Option) -> Result<(),TMFError> { +pub fn handle_tmf674(client : &mut TMFClient, module : TMF674Modules, opts : Option,output : Output) -> Result<(),TMFError> { match module { TMF674Modules::Site { op } => { match op { TMFOperation::List => { let sites = client.tmf674().site().list(opts)?; - iterate_name(&sites); + iterate_name(&sites,output); Ok(()) }, TMFOperation::Get { id } => {