nushell/src/parser/parse2/token_tree.rs

94 lines
2.5 KiB
Rust
Raw Normal View History

2019-06-22 03:36:57 +02:00
use crate::errors::ShellError;
2019-06-23 19:35:43 +02:00
use crate::parser::parse2::{call_node::*, flag::*, operator::*, pipeline::*, span::*, tokens::*};
2019-06-22 22:46:16 +02:00
use crate::Text;
use derive_new::new;
use enum_utils::FromStr;
2019-06-11 07:53:04 +02:00
#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd)]
2019-06-11 07:53:04 +02:00
pub enum TokenNode {
Token(Token),
2019-06-22 03:36:57 +02:00
#[allow(unused)]
2019-06-15 04:59:35 +02:00
Call(Spanned<CallNode>),
Delimited(Spanned<DelimitedNode>),
2019-06-23 19:35:43 +02:00
Pipeline(Spanned<Pipeline>),
2019-06-22 03:36:57 +02:00
Operator(Spanned<Operator>),
Flag(Spanned<Flag>),
Identifier(Span),
Whitespace(Span),
#[allow(unused)]
Error(Spanned<Box<ShellError>>),
2019-06-13 07:33:38 +02:00
Path(Spanned<PathNode>),
}
2019-06-15 04:59:35 +02:00
impl TokenNode {
pub fn span(&self) -> Span {
match self {
TokenNode::Token(t) => t.span,
TokenNode::Call(s) => s.span,
TokenNode::Delimited(s) => s.span,
TokenNode::Pipeline(s) => s.span,
2019-06-22 03:36:57 +02:00
TokenNode::Operator(s) => s.span,
TokenNode::Flag(s) => s.span,
TokenNode::Identifier(s) => *s,
TokenNode::Whitespace(s) => *s,
TokenNode::Error(s) => s.span,
2019-06-15 04:59:35 +02:00
TokenNode::Path(s) => s.span,
}
}
2019-06-22 03:36:57 +02:00
2019-06-22 22:46:16 +02:00
pub fn as_external_arg(&self, source: &Text) -> String {
2019-06-22 03:36:57 +02:00
self.span().slice(source).to_string()
}
2019-06-22 22:46:16 +02:00
pub fn source(&self, source: &'a Text) -> &'a str {
2019-06-22 03:36:57 +02:00
self.span().slice(source)
}
pub fn is_bare(&self) -> bool {
match self {
TokenNode::Token(Spanned {
item: RawToken::Bare,
..
}) => true,
_ => false,
}
}
2019-06-22 22:46:16 +02:00
crate fn as_flag(&self, value: &str, source: &Text) -> Option<Spanned<Flag>> {
2019-06-22 03:36:57 +02:00
match self {
TokenNode::Flag(
flag @ Spanned {
item: Flag { .. }, ..
},
) if value == flag.name().slice(source) => Some(*flag),
_ => None,
}
}
2019-06-23 19:35:43 +02:00
pub fn as_pipeline(&self) -> Result<Pipeline, ShellError> {
2019-06-22 03:36:57 +02:00
match self {
TokenNode::Pipeline(Spanned { item, .. }) => Ok(item.clone()),
_ => Err(ShellError::string("unimplemented")),
}
}
2019-06-15 04:59:35 +02:00
}
#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, new)]
pub struct DelimitedNode {
delimiter: Delimiter,
children: Vec<TokenNode>,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, FromStr)]
pub enum Delimiter {
Paren,
Brace,
Square,
2019-06-11 07:53:04 +02:00
}
2019-06-13 07:33:38 +02:00
#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, new)]
pub struct PathNode {
head: Box<TokenNode>,
2019-06-14 22:55:05 +02:00
tail: Vec<TokenNode>,
2019-06-13 07:33:38 +02:00
}