From ea0b8b6ec010c3d7611f8d7e07cdeb0a0cb4f741 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Sun, 9 Dec 2018 11:59:32 +0100 Subject: [PATCH] bin/pbs-datastore.rs: start implementing cli commands --- src/api3.rs | 2 +- src/api3/config.rs | 2 +- src/api3/config/datastore.rs | 32 +++++++++++--- src/bin/pbs-datastore.rs | 81 ++++++++++++++++++++++++++++++++++++ 4 files changed, 109 insertions(+), 8 deletions(-) create mode 100644 src/bin/pbs-datastore.rs diff --git a/src/api3.rs b/src/api3.rs index f74fcf64..6753615b 100644 --- a/src/api3.rs +++ b/src/api3.rs @@ -6,7 +6,7 @@ use crate::api::schema::*; use crate::api::router::*; use serde_json::{json, Value}; -mod config; +pub mod config; mod version; fn test_sync_api_handler(param: Value, _info: &ApiMethod) -> Result { diff --git a/src/api3/config.rs b/src/api3/config.rs index 6d51f05f..ccdd2784 100644 --- a/src/api3/config.rs +++ b/src/api3/config.rs @@ -5,7 +5,7 @@ use crate::api::schema::*; use crate::api::router::*; use serde_json::{json}; -mod datastore; +pub mod datastore; pub fn router() -> Router { diff --git a/src/api3/config/datastore.rs b/src/api3/config/datastore.rs index 63a8a4e7..29da88b3 100644 --- a/src/api3/config/datastore.rs +++ b/src/api3/config/datastore.rs @@ -7,20 +7,40 @@ use serde_json::{json, Value}; use crate::config::datastore; -fn datastore_list(param: Value, _info: &ApiMethod) -> Result { - println!("This is a test {}", param); +pub fn get() -> ApiMethod { + ApiMethod::new( + get_datastore_list, + ObjectSchema::new("Directory index.")) +} + +fn get_datastore_list(param: Value, _info: &ApiMethod) -> Result { let config = datastore::config()?; - Ok(config.convert_to_array("id")) + Ok(config.convert_to_array("name")) +} + +pub fn post() -> ApiMethod { + ApiMethod::new( + create_datastore, + ObjectSchema::new("Create new datastore.") + .required("name", StringSchema::new("Datastore name.")) + .required("path", StringSchema::new("Directory path (must exist).")) + ) +} + +fn create_datastore(param: Value, _info: &ApiMethod) -> Result { + println!("This is a test {}", param); + + Ok(json!({})) } pub fn router() -> Router { let route = Router::new() - .get(ApiMethod::new( - datastore_list, - ObjectSchema::new("Directory index."))); + .get(get()) + .post(post()); + route } diff --git a/src/bin/pbs-datastore.rs b/src/bin/pbs-datastore.rs new file mode 100644 index 00000000..2b140aca --- /dev/null +++ b/src/bin/pbs-datastore.rs @@ -0,0 +1,81 @@ +extern crate apitest; + +use failure::*; +use std::collections::HashMap; + +//use std::sync::Arc; + +use apitest::api::schema::*; +use apitest::api::router::*; +use apitest::api::config::*; +use apitest::getopts; + +use apitest::api3; + +fn print_cli_usage() { + + eprintln!("Usage: TODO"); +} + +type CliCommandDefinition = HashMap; + +fn run_cli_command(def: &CliCommandDefinition) -> Result<(), Error> { + + let mut args: Vec = std::env::args().skip(1).collect(); + + if args.len() < 1 { + bail!("no command specified."); + } + + let command = args.remove(0); + + let cli_cmd = match def.get(&command) { + Some(cmd) => cmd, + None => { + bail!("no such command '{}'", command); + } + }; + + let (params, rest) = getopts::parse_arguments( + &args, &cli_cmd.arg_param, &cli_cmd.info.parameters)?; + + if !rest.is_empty() { + bail!("got additional arguments: {:?}", rest); + } + + let res = (cli_cmd.info.handler)(params, &cli_cmd.info)?; + + println!("Result: {}", serde_json::to_string_pretty(&res).unwrap()); + + Ok(()) +} + +struct CliCommand { + info: ApiMethod, + arg_param: Vec<&'static str>, + fixed_param: Vec<&'static str>, +} + +fn main() { + + let mut cmd_def = HashMap::new(); + + cmd_def.insert("list".to_owned(), CliCommand { + info: api3::config::datastore::get(), + arg_param: vec![], + fixed_param: vec![], + }); + + cmd_def.insert("create".to_owned(), CliCommand { + info: api3::config::datastore::post(), + arg_param: vec!["name", "path"], + fixed_param: vec![], + }); + + if let Err(err) = run_cli_command(&cmd_def) { + eprintln!("Error: {}", err); + print_cli_usage(); + std::process::exit(-1); + } + +}