use std::rc::Rc;
use super::constants::*;
use super::nodes::*;
pub struct CommandTree<'a> {
commands: Vec<Command<'a>>,
}
impl<'a> Default for CommandTree<'a> {
fn default() -> Self {
CommandTree { commands: vec![] }
}
}
impl<'a> CommandTree<'a> {
pub fn new() -> Self {
Default::default()
}
pub fn command(&mut self, command: Command<'a>) {
self.commands.push(command);
}
pub fn finalize(&self) -> Rc<Node> {
let mut successors: Vec<Rc<Node>> = vec![];
for c in &self.commands {
successors.push(Rc::new(Node::Command(self.build_command(c))));
}
Rc::new(Node::Root(RootNode::new(successors)))
}
fn build_command(&self, command: &Command) -> CommandNode {
let mut parameters: Vec<Rc<Node>> = vec![];
let mut successors: Vec<Rc<Node>> = vec![];
for parameter in &command.parameters {
match parameter.kind {
ParameterKind::Flag => {
self.build_flag_parameter(parameter, &mut parameters, &mut successors);
}
ParameterKind::Named => {
self.build_named_parameter(parameter, &mut parameters, &mut successors);
}
ParameterKind::Simple => {
self.build_simple_parameter(parameter, &mut parameters, &mut successors);
}
};
}
CommandNode::new(command.name,
command.help_text,
command.hidden,
command.priority,
successors,
None,
parameters)
}
fn build_flag_parameter(&self,
parameter: &Parameter,
parameters: &mut Vec<Rc<Node>>,
successors: &mut Vec<Rc<Node>>) {
let p = ParameterNode::new(parameter.name,
parameter.help_text,
parameter.hidden,
parameter.priority.unwrap_or(PRIORITY_DEFAULT),
vec![],
parameter.repeatable,
None,
parameter.kind,
parameter.required);
let p = Rc::new(Node::Parameter(p));
parameters.push(p.clone());
successors.push(p);
}
fn build_named_parameter(&self,
parameter: &Parameter,
parameters: &mut Vec<Rc<Node>>,
successors: &mut Vec<Rc<Node>>) {
let p = ParameterNode::new(parameter.name,
parameter.help_text,
parameter.hidden,
parameter.priority.unwrap_or(PRIORITY_PARAMETER),
vec![],
parameter.repeatable,
None,
parameter.kind,
parameter.required);
let p = Rc::new(Node::Parameter(p));
parameters.push(p.clone());
let n = ParameterNameNode::new(parameter.name,
parameter.hidden,
PRIORITY_DEFAULT,
vec![p.clone()],
parameter.repeatable,
Some(p.clone()),
p.clone());
successors.push(Rc::new(Node::ParameterName(n)));
for alias in ¶meter.aliases {
let a = ParameterNameNode::new(alias,
parameter.hidden,
PRIORITY_DEFAULT,
vec![p.clone()],
parameter.repeatable,
Some(p.clone()),
p.clone());
successors.push(Rc::new(Node::ParameterName(a)));
}
}
fn build_simple_parameter(&self,
parameter: &Parameter,
parameters: &mut Vec<Rc<Node>>,
successors: &mut Vec<Rc<Node>>) {
let p = ParameterNode::new(parameter.name,
parameter.help_text,
parameter.hidden,
parameter.priority.unwrap_or(PRIORITY_PARAMETER),
vec![],
parameter.repeatable,
None,
parameter.kind,
parameter.required);
let p = Rc::new(Node::Parameter(p));
parameters.push(p.clone());
successors.push(p.clone());
}
}
pub struct Command<'a> {
hidden: bool,
priority: i32,
name: &'a str,
help_text: Option<&'a str>,
parameters: Vec<Parameter<'a>>,
wrapped_root: Option<String>,
}
impl<'a> Command<'a> {
pub fn new(name: &'a str) -> Self {
Command {
hidden: false,
priority: PRIORITY_DEFAULT,
name: name,
help_text: None,
parameters: vec![],
wrapped_root: None,
}
}
pub fn hidden(mut self, hidden: bool) -> Self {
self.hidden = hidden;
self
}
pub fn priority(mut self, priority: i32) -> Self {
self.priority = priority;
self
}
pub fn help(mut self, help_text: &'a str) -> Self {
self.help_text = Some(help_text);
self
}
pub fn parameter(mut self, parameter: Parameter<'a>) -> Self {
self.parameters.push(parameter);
self
}
pub fn wraps(mut self, wrapped_root: String) -> Self {
self.wrapped_root = Some(wrapped_root);
self
}
}
pub struct Parameter<'a> {
hidden: bool,
priority: Option<i32>,
name: &'a str,
repeatable: bool,
aliases: Vec<&'a str>,
help_text: Option<&'a str>,
kind: ParameterKind,
required: bool,
}
impl<'a> Parameter<'a> {
pub fn new(name: &'a str) -> Self {
Parameter {
hidden: false,
priority: None,
name: name,
repeatable: false,
aliases: vec![],
help_text: None,
kind: ParameterKind::Simple,
required: false,
}
}
pub fn hidden(mut self, hidden: bool) -> Self {
self.hidden = hidden;
self
}
pub fn priority(mut self, priority: i32) -> Self {
self.priority = Some(priority);
self
}
pub fn repeatable(mut self, repeatable: bool) -> Self {
self.repeatable = repeatable;
self
}
pub fn alias(mut self, alias: &'a str) -> Self {
self.aliases.push(alias);
self
}
pub fn help(mut self, help_text: &'a str) -> Self {
self.help_text = Some(help_text);
self
}
pub fn required(mut self, required: bool) -> Self {
self.required = required;
self
}
pub fn kind(mut self, kind: ParameterKind) -> Self {
self.kind = kind;
self
}
}