// Copyright (c) 2021 Soni L. // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. // Documentation and comments licensed under CC BY-SA 4.0. //! Command syntax tree. use ::std::borrow::Cow; use crate::Command; use crate::args::{ArgumentType, ArgumentTypeAny}; use crate::strcursor::StringReader; // FIXME use crate::args::CommandContext; /// The kind of node. enum NodeKind { /// Root node. Root, /// Literal node. Literal { /// The literal of the node. literal: Cow<'static, str>, }, /// Argument node. Argument { /// The label of the node. label: Cow<'static, str>, /// The argument type. arg: Box>, }, } /// A node in the syntax tree. pub struct CommandNode { /// The command to run for this node. command: Option>, /// Nodes. nodes: (), /// Literal nodes. literals: (), /// Argument nodes. arguments: (), /// The kind of node. kind: NodeKind, } impl CommandNode { /// Creates a new root node. pub fn root() -> Self { CommandNode { command: None, nodes: (), literals: (), arguments: (), kind: NodeKind::Root, } } /// Creates a new literal node. pub fn literal( word: Cow<'static, str>, command: Option>, ) -> Self { CommandNode { command: command, nodes: (), literals: (), arguments: (), kind: NodeKind::Literal { literal: word, }, } } /// Creates a new argument node. pub fn argument + 'static + Send + Sync>( name: Cow<'static, str>, command: Option>, argument: A, ) -> Self { CommandNode { command: command, nodes: (), literals: (), arguments: (), kind: NodeKind::Argument { label: name, arg: Box::new(argument), }, } } /// Returns the name of this node. /// /// For literal nodes, this is the literal itself. For argument nodes, this /// is the name of the argument. pub fn get_name(&self) -> &str { match self.kind { NodeKind::Root => "", NodeKind::Literal { ref literal, .. } => literal, NodeKind::Argument { ref label, .. } => label, } } }