From 13f1cc17ea9de142a5b2fd2f792a719bc7ca7206 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Tue, 16 Apr 2019 12:07:02 +0200 Subject: [PATCH] src/api_schema/router.rs: implement list_subdirs() helper --- src/api2.rs | 13 ++----------- src/api2/access.rs | 8 ++------ src/api2/admin.rs | 8 ++------ src/api2/admin/datastore.rs | 17 +++-------------- src/api2/config.rs | 10 +++------- src/api2/node.rs | 12 ++---------- src/api2/node/services.rs | 14 +------------- src/api2/node/tasks.rs | 15 ++------------- src/api_schema/router.rs | 20 +++++++++++++++++++- 9 files changed, 36 insertions(+), 81 deletions(-) diff --git a/src/api2.rs b/src/api2.rs index 93816602..71cd3067 100644 --- a/src/api2.rs +++ b/src/api2.rs @@ -34,22 +34,13 @@ pub fn router() -> Router { .match_all("node", node::router()); let route = Router::new() - .get(ApiMethod::new( - || Ok(json!([ - {"subdir": "access"}, - {"subdir": "admin"}, - {"subdir": "config"}, - {"subdir": "nodes"}, - {"subdir": "subscription"}, - {"subdir": "version"}, - ])), - ObjectSchema::new("Directory index."))) .subdir("access", access::router()) .subdir("admin", admin::router()) .subdir("config", config::router()) .subdir("nodes", nodes) .subdir("subscription", subscription::router()) - .subdir("version", version::router()); + .subdir("version", version::router()) + .list_subdirs(); route } diff --git a/src/api2/access.rs b/src/api2/access.rs index f7e2b5e9..a3099083 100644 --- a/src/api2/access.rs +++ b/src/api2/access.rs @@ -69,11 +69,6 @@ fn create_ticket( pub fn router() -> Router { let route = Router::new() - .get(ApiMethod::new( - || Ok(json!([ - {"subdir": "ticket"} - ])), - ObjectSchema::new("Directory index."))) .subdir( "ticket", Router::new() @@ -97,7 +92,8 @@ pub fn router() -> Router { .required("CSRFPreventionToken", StringSchema::new("Cross Site Request Forgery Prevention Token.")) ).protected(true) ) - ); + ) + .list_subdirs(); route } diff --git a/src/api2/admin.rs b/src/api2/admin.rs index 4efce8a9..8463124c 100644 --- a/src/api2/admin.rs +++ b/src/api2/admin.rs @@ -7,12 +7,8 @@ pub mod datastore; pub fn router() -> Router { let route = Router::new() - .get(ApiMethod::new( - || Ok(json!([ - {"subdir": "datastore"} - ])), - ObjectSchema::new("Directory index."))) - .subdir("datastore", datastore::router()); + .subdir("datastore", datastore::router()) + .list_subdirs(); route } diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs index 8f2a4719..d7f067aa 100644 --- a/src/api2/admin/datastore.rs +++ b/src/api2/admin/datastore.rs @@ -387,19 +387,6 @@ pub fn router() -> Router { ); let datastore_info = Router::new() - .get(ApiMethod::new( - || Ok(json!([ - {"subdir": "backups" }, - {"subdir": "pxar" }, - {"subdir": "gc" }, - {"subdir": "groups" }, - {"subdir": "snapshots" }, - //{"subdir": "status" }, - {"subdir": "prune" }, - ])), - ObjectSchema::new("Directory index.") - .required("store", store_schema.clone())) - ) .subdir( "backups", Router::new() @@ -470,7 +457,9 @@ pub fn router() -> Router { .subdir( "prune", Router::new() - .post(api_method_prune())); + .post(api_method_prune()) + ) + .list_subdirs(); diff --git a/src/api2/config.rs b/src/api2/config.rs index 36c6103d..8b3f5121 100644 --- a/src/api2/config.rs +++ b/src/api2/config.rs @@ -1,7 +1,7 @@ //use failure::*; //use std::collections::HashMap; -use crate::api_schema::*; +//use crate::api_schema; use crate::api_schema::router::*; use serde_json::{json}; @@ -10,12 +10,8 @@ pub mod datastore; pub fn router() -> Router { let route = Router::new() - .get(ApiMethod::new( - || Ok(json!([ - {"subdir": "datastore"}, - ])), - ObjectSchema::new("Directory index."))) - .subdir("datastore", datastore::router()); + .subdir("datastore", datastore::router()) + .list_subdirs(); route diff --git a/src/api2/node.rs b/src/api2/node.rs index 5f1005dd..5b2d8b24 100644 --- a/src/api2/node.rs +++ b/src/api2/node.rs @@ -34,21 +34,13 @@ lazy_static!{ pub fn router() -> Router { let route = Router::new() - .get(ApiMethod::new( - || Ok(json!([ - {"subdir": "dns"}, - {"subdir": "network"}, - {"subdir": "services"}, - {"subdir": "syslog"}, - {"subdir": "time"}, - ])), - ObjectSchema::new("Directory index."))) .subdir("dns", dns::router()) .subdir("network", network::router()) .subdir("services", services::router()) .subdir("syslog", syslog::router()) .subdir("tasks", tasks::router()) - .subdir("time", time::router()); + .subdir("time", time::router()) + .list_subdirs(); route } diff --git a/src/api2/node/services.rs b/src/api2/node/services.rs index 91f6b660..135eb9c6 100644 --- a/src/api2/node/services.rs +++ b/src/api2/node/services.rs @@ -223,18 +223,6 @@ pub fn router() -> Router { ); let service_api = Router::new() - .get(ApiMethod::new( - || { - let mut result = vec![]; - for cmd in &["state", "start", "stop", "restart", "reload"] { - result.push(json!({"subdir": cmd })); - } - Ok(Value::from(result)) - }, - ObjectSchema::new("Directory index.") - .required("node", crate::api2::node::NODE_SCHEMA.clone()) - .required("service", service_id_schema.clone())) - ) .subdir( "state", Router::new() @@ -293,7 +281,7 @@ pub fn router() -> Router { ).protected(true) ) ) - ; + .list_subdirs(); let route = Router::new() .get( diff --git a/src/api2/node/tasks.rs b/src/api2/node/tasks.rs index d8f62f98..0c299dde 100644 --- a/src/api2/node/tasks.rs +++ b/src/api2/node/tasks.rs @@ -174,18 +174,6 @@ pub fn router() -> Router { ); let upid_api = Router::new() - .get(ApiMethod::new( - || { - let mut result = vec![]; - for cmd in &["log", "status"] { - result.push(json!({"subdir": cmd })); - } - Ok(Value::from(result)) - }, - ObjectSchema::new("Directory index.") - .required("node", crate::api2::node::NODE_SCHEMA.clone()) - .required("upid", upid_schema.clone())) - ) .delete(ApiMethod::new( stop_task, ObjectSchema::new("Try to stop a task.") @@ -225,7 +213,8 @@ pub fn router() -> Router { .required("node", crate::api2::node::NODE_SCHEMA.clone()) .required("upid", upid_schema.clone())) ) - ); + ) + .list_subdirs(); let route = Router::new() diff --git a/src/api_schema/router.rs b/src/api_schema/router.rs index 2c2e0dc6..3ff80882 100644 --- a/src/api_schema/router.rs +++ b/src/api_schema/router.rs @@ -1,7 +1,7 @@ use failure::*; use crate::api_schema::*; -use serde_json::{Value}; +use serde_json::{json, Value}; use std::collections::HashMap; use std::sync::Arc; use std::fmt; @@ -229,6 +229,24 @@ impl Router { self } + pub fn list_subdirs(self) -> Self { + match self.get { + MethodDefinition::None => {}, + _ => panic!("cannot create directory index - method get already in use"), + } + match self.subroute { + SubRoute::Hash(ref map) => { + let index = json!(map.keys().map(|s| json!({ "subdira": s})) + .collect::>()); + self.get(ApiMethod::new( + move || { Ok(index.clone()) }, + ObjectSchema::new("Directory index.").additional_properties(true)) + ) + } + _ => panic!("cannot create directory index (no SubRoute::Hash)"), + } + } + pub fn get(mut self, m: ApiMethod) -> Self { self.get = MethodDefinition::Simple(m); self