summaryrefslogtreecommitdiff
path: root/src/commands/parser.rs
diff options
context:
space:
mode:
authorJulian T. <julian@jtle.dk>2024-04-28 00:05:33 +0200
committerJulian T. <julian@jtle.dk>2024-04-28 00:05:33 +0200
commit0b29e9b14607f3226c46f75a20f11abd49c8f4a6 (patch)
treef35d4d8021fc018e7e04c4268b543b1971a9af66 /src/commands/parser.rs
parentb27e72f5ac588506941b74c1f421235eb59e69d5 (diff)
Start with tui instead
Diffstat (limited to 'src/commands/parser.rs')
-rw-r--r--src/commands/parser.rs77
1 files changed, 0 insertions, 77 deletions
diff --git a/src/commands/parser.rs b/src/commands/parser.rs
deleted file mode 100644
index e75840c..0000000
--- a/src/commands/parser.rs
+++ /dev/null
@@ -1,77 +0,0 @@
-
-pub enum ParseResult<'a, T> {
- Success(T, &'a str),
- Failure(String),
-}
-
-pub trait Parse<'a> {
- type Res;
-
- fn parse(self, input: &'a str) -> ParseResult<'a, Self::Res>;
-}
-
-pub struct Text(String);
-
-impl<'a> Parse<'a> for Text {
- type Res = Text;
-
- fn parse(self, input: &'a str) -> ParseResult<'a, Text> {
- let mut value = String::new();
-
- let mut it = input.chars();
- let mut escape_next = false;
- while let Some(c) = it.next() {
- if c == '\\' && !escape_next {
- escape_next = true;
- continue;
- } else if c == ';' {
- break;
- }
- value.push(c);
-
- escape_next = false;
- }
-
- ParseResult::Success(Text(value), it.as_str())
- }
-}
-
-pub struct Branch<T> {
- choices: Vec<(&'static str, Option<char>, T)>,
-}
-
-impl<'a, T> Parse<'a> for Branch<T> {
- type Res = T;
-
- fn parse(self, input: &'a str) -> ParseResult<'a, T> {
- let choices: Vec<&'static str> = self.choices.iter().map(|x| x.0).collect();
-
- for (long, short_op, res) in self.choices {
- let rest = if input.starts_with(long) {
- Some(&input[long.len()..])
- } else if let Some(short) = short_op {
- if input.starts_with(short) {
- Some(&input[1..])
- } else {
- None
- }
- } else { None };
-
- if let Some(rest) = rest {
- return ParseResult::Success(res, rest);
- }
- }
-
- return ParseResult::Failure(format!("Expected one of [{}]", choices.join(", ")));
- }
-}
-
-impl<T> Branch<T> {
- pub fn new() -> Branch<T> {
- Branch { choices: Vec::new() }
- }
-
- pub fn add(&mut self, long: &'static str, short: Option<char>, res: T) {
- self.choices.push((long, short, res));
- }
-}