src/cli/command.rs: move doc generator code to src/api_schema/format.rs
This commit is contained in:
		@ -20,7 +20,7 @@ use crate::server::WorkerTask;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
mod pxar;
 | 
					mod pxar;
 | 
				
			||||||
mod upload;
 | 
					mod upload;
 | 
				
			||||||
mod backup;
 | 
					pub mod backup;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn group_backups(backup_list: Vec<BackupInfo>) -> HashMap<String, Vec<BackupInfo>> {
 | 
					fn group_backups(backup_list: Vec<BackupInfo>) -> HashMap<String, Vec<BackupInfo>> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -147,7 +147,7 @@ fn upgrade_to_backup_protocol(
 | 
				
			|||||||
    Ok(Box::new(futures::future::ok(response)))
 | 
					    Ok(Box::new(futures::future::ok(response)))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn backup_api() -> Router {
 | 
					pub fn backup_api() -> Router {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let router = Router::new()
 | 
					    let router = Router::new()
 | 
				
			||||||
        .subdir(
 | 
					        .subdir(
 | 
				
			||||||
 | 
				
			|||||||
@ -17,3 +17,4 @@ pub mod registry;
 | 
				
			|||||||
#[macro_use]
 | 
					#[macro_use]
 | 
				
			||||||
pub mod router;
 | 
					pub mod router;
 | 
				
			||||||
pub mod config;
 | 
					pub mod config;
 | 
				
			||||||
 | 
					pub mod format;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										113
									
								
								src/api_schema/format.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								src/api_schema/format.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,113 @@
 | 
				
			|||||||
 | 
					use crate::api_schema::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Copy, Clone)]
 | 
				
			||||||
 | 
					pub enum ParameterDisplayStyle {
 | 
				
			||||||
 | 
					    Config,
 | 
				
			||||||
 | 
					    //SonfigSub,
 | 
				
			||||||
 | 
					    Arg,
 | 
				
			||||||
 | 
					    Fixed,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// CLI usage information format
 | 
				
			||||||
 | 
					#[derive(Copy, Clone, PartialEq)]
 | 
				
			||||||
 | 
					pub enum DocumentationFormat {
 | 
				
			||||||
 | 
					    /// text, command line only (one line)
 | 
				
			||||||
 | 
					    Short,
 | 
				
			||||||
 | 
					    /// text, list all options
 | 
				
			||||||
 | 
					    Long,
 | 
				
			||||||
 | 
					    /// text, include description
 | 
				
			||||||
 | 
					    Full,
 | 
				
			||||||
 | 
					    /// like full, but in reStructuredText format
 | 
				
			||||||
 | 
					    ReST,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn get_schema_type_text(schema: &Schema, _style: ParameterDisplayStyle) -> String {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let type_text = match schema {
 | 
				
			||||||
 | 
					        Schema::Null => String::from("<null>"), // should not happen
 | 
				
			||||||
 | 
					        Schema::String(_) => String::from("<string>"),
 | 
				
			||||||
 | 
					        Schema::Boolean(_) => String::from("<boolean>"),
 | 
				
			||||||
 | 
					        Schema::Integer(integer_schema) => {
 | 
				
			||||||
 | 
						    match (integer_schema.minimum, integer_schema.maximum) {
 | 
				
			||||||
 | 
							(Some(min), Some(max)) => format!("<integer> ({} - {})", min, max),
 | 
				
			||||||
 | 
							(Some(min), None) => format!("<integer> ({} - N)", min),
 | 
				
			||||||
 | 
							(None, Some(max)) => format!("<integer> (-N - {})", max),
 | 
				
			||||||
 | 
							_ => String::from("<integer>"),
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					        Schema::Object(_) => String::from("<object>"),
 | 
				
			||||||
 | 
					        Schema::Array(_) => String::from("<array>"),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    type_text
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn get_property_description(
 | 
				
			||||||
 | 
					    name: &str,
 | 
				
			||||||
 | 
					    schema: &Schema,
 | 
				
			||||||
 | 
					    style: ParameterDisplayStyle,
 | 
				
			||||||
 | 
					    format: DocumentationFormat,
 | 
				
			||||||
 | 
					) -> String {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let type_text = get_schema_type_text(schema, style);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let (descr, default) = match schema {
 | 
				
			||||||
 | 
					        Schema::Null => ("null", None),
 | 
				
			||||||
 | 
					        Schema::String(ref schema) => (schema.description, schema.default.map(|v| v.to_owned())),
 | 
				
			||||||
 | 
					        Schema::Boolean(ref schema) => (schema.description, schema.default.map(|v| v.to_string())),
 | 
				
			||||||
 | 
					        Schema::Integer(ref schema) => (schema.description, schema.default.map(|v| v.to_string())),
 | 
				
			||||||
 | 
					        Schema::Object(ref schema) => (schema.description, None),
 | 
				
			||||||
 | 
					        Schema::Array(ref schema) => (schema.description, None),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let default_text = match default {
 | 
				
			||||||
 | 
					        Some(text) =>  format!("   (default={})", text),
 | 
				
			||||||
 | 
					        None => String::new(),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if format == DocumentationFormat::ReST {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let mut text = match style {
 | 
				
			||||||
 | 
					            ParameterDisplayStyle::Config => {
 | 
				
			||||||
 | 
					                format!(":``{} {}{}``:  ", name, type_text, default_text)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            ParameterDisplayStyle::Arg => {
 | 
				
			||||||
 | 
					                format!(":``--{} {}{}``:  ", name, type_text, default_text)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            ParameterDisplayStyle::Fixed => {
 | 
				
			||||||
 | 
					                format!(":``<{}> {}{}``:  ", name, type_text, default_text)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        text.push_str(descr);
 | 
				
			||||||
 | 
					        text.push('\n');
 | 
				
			||||||
 | 
					        text.push('\n');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let display_name = match style {
 | 
				
			||||||
 | 
					            ParameterDisplayStyle::Config => {
 | 
				
			||||||
 | 
					                format!("{}:", name)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            ParameterDisplayStyle::Arg => {
 | 
				
			||||||
 | 
					                format!("--{}", name)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            ParameterDisplayStyle::Fixed => {
 | 
				
			||||||
 | 
					                format!("<{}>", name)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // fixme: wrap text
 | 
				
			||||||
 | 
					        let mut text = format!(" {:-10} {}{}", display_name, type_text, default_text);
 | 
				
			||||||
 | 
					        let indent = "             ";
 | 
				
			||||||
 | 
					        text.push('\n');
 | 
				
			||||||
 | 
					        text.push_str(indent);
 | 
				
			||||||
 | 
					        text.push_str(descr);
 | 
				
			||||||
 | 
					        text.push('\n');
 | 
				
			||||||
 | 
					        text.push('\n');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        text
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -4,116 +4,12 @@ use std::collections::HashSet;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use crate::api_schema::*;
 | 
					use crate::api_schema::*;
 | 
				
			||||||
use crate::api_schema::router::*;
 | 
					use crate::api_schema::router::*;
 | 
				
			||||||
 | 
					use crate::api_schema::format::*;
 | 
				
			||||||
//use crate::api_schema::config::*;
 | 
					//use crate::api_schema::config::*;
 | 
				
			||||||
use super::environment::CliEnvironment;
 | 
					use super::environment::CliEnvironment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use super::getopts;
 | 
					use super::getopts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Copy, Clone)]
 | 
					 | 
				
			||||||
enum ParameterDisplayStyle {
 | 
					 | 
				
			||||||
    //Config,
 | 
					 | 
				
			||||||
    //SonfigSub,
 | 
					 | 
				
			||||||
    Arg,
 | 
					 | 
				
			||||||
    Fixed,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/// CLI usage information format
 | 
					 | 
				
			||||||
#[derive(Copy, Clone, PartialEq)]
 | 
					 | 
				
			||||||
enum DocumentationFormat {
 | 
					 | 
				
			||||||
    /// text, command line only (one line)
 | 
					 | 
				
			||||||
    Short,
 | 
					 | 
				
			||||||
    /// text, list all options
 | 
					 | 
				
			||||||
    Long,
 | 
					 | 
				
			||||||
    /// text, include description
 | 
					 | 
				
			||||||
    Full,
 | 
					 | 
				
			||||||
    /// like full, but in reStructuredText format
 | 
					 | 
				
			||||||
    ReST,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
fn get_schema_type_text(schema: &Schema, _style: ParameterDisplayStyle) -> String {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let type_text = match schema {
 | 
					 | 
				
			||||||
        Schema::Null => String::from("<null>"), // should not happen
 | 
					 | 
				
			||||||
        Schema::String(_) => String::from("<string>"),
 | 
					 | 
				
			||||||
        Schema::Boolean(_) => String::from("<boolean>"),
 | 
					 | 
				
			||||||
        Schema::Integer(integer_schema) => {
 | 
					 | 
				
			||||||
	    match (integer_schema.minimum, integer_schema.maximum) {
 | 
					 | 
				
			||||||
		(Some(min), Some(max)) => format!("<integer> ({} - {})", min, max),
 | 
					 | 
				
			||||||
		(Some(min), None) => format!("<integer> ({} - N)", min),
 | 
					 | 
				
			||||||
		(None, Some(max)) => format!("<integer> (-N - {})", max),
 | 
					 | 
				
			||||||
		_ => String::from("<integer>"),
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
        Schema::Object(_) => String::from("<object>"),
 | 
					 | 
				
			||||||
        Schema::Array(_) => String::from("<array>"),
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    type_text
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
fn get_property_description(
 | 
					 | 
				
			||||||
    name: &str,
 | 
					 | 
				
			||||||
    schema: &Schema,
 | 
					 | 
				
			||||||
    style: ParameterDisplayStyle,
 | 
					 | 
				
			||||||
    format: DocumentationFormat,
 | 
					 | 
				
			||||||
) -> String {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let type_text = get_schema_type_text(schema, style);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let (descr, default) = match schema {
 | 
					 | 
				
			||||||
        Schema::Null => ("null", None),
 | 
					 | 
				
			||||||
        Schema::String(ref schema) => (schema.description, schema.default.map(|v| v.to_owned())),
 | 
					 | 
				
			||||||
        Schema::Boolean(ref schema) => (schema.description, schema.default.map(|v| v.to_string())),
 | 
					 | 
				
			||||||
        Schema::Integer(ref schema) => (schema.description, schema.default.map(|v| v.to_string())),
 | 
					 | 
				
			||||||
        Schema::Object(ref schema) => (schema.description, None),
 | 
					 | 
				
			||||||
        Schema::Array(ref schema) => (schema.description, None),
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let default_text = match default {
 | 
					 | 
				
			||||||
        Some(text) =>  format!("   (default={})", text),
 | 
					 | 
				
			||||||
        None => String::new(),
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if format == DocumentationFormat::ReST {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        let mut text = match style {
 | 
					 | 
				
			||||||
           ParameterDisplayStyle::Arg => {
 | 
					 | 
				
			||||||
                format!(":``--{} {}{}``:  ", name, type_text, default_text)
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            ParameterDisplayStyle::Fixed => {
 | 
					 | 
				
			||||||
                format!(":``<{}> {}{}``:  ", name, type_text, default_text)
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        text.push_str(descr);
 | 
					 | 
				
			||||||
        text.push('\n');
 | 
					 | 
				
			||||||
        text.push('\n');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        text
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        let display_name = match style {
 | 
					 | 
				
			||||||
            ParameterDisplayStyle::Arg => {
 | 
					 | 
				
			||||||
                format!("--{}", name)
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            ParameterDisplayStyle::Fixed => {
 | 
					 | 
				
			||||||
                format!("<{}>", name)
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // fixme: wrap text
 | 
					 | 
				
			||||||
        let mut text = format!(" {:-10} {}{}", display_name, type_text, default_text);
 | 
					 | 
				
			||||||
        let indent = "             ";
 | 
					 | 
				
			||||||
        text.push('\n');
 | 
					 | 
				
			||||||
        text.push_str(indent);
 | 
					 | 
				
			||||||
        text.push_str(descr);
 | 
					 | 
				
			||||||
        text.push('\n');
 | 
					 | 
				
			||||||
        text.push('\n');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        text
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn generate_usage_str(
 | 
					fn generate_usage_str(
 | 
				
			||||||
    prefix: &str,
 | 
					    prefix: &str,
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user