diff options
| author | El-BG-1970 <elouan.gros.fr@gmail.com> | 2022-04-29 19:34:07 +0200 |
|---|---|---|
| committer | El-BG-1970 <elouan.gros.fr@gmail.com> | 2022-04-29 19:34:07 +0200 |
| commit | 48bd6085d67e6b702932e468ce5e44156a663060 (patch) | |
| tree | ad156705063e902597007227622a20d67e0194b5 | |
| parent | 90cf1fff49dbbf12bf4151878674ad3ff567dcaf (diff) | |
| download | rush-48bd6085d67e6b702932e468ce5e44156a663060.tar.gz | |
parser
| -rw-r--r-- | Cargo.lock | 25 | ||||
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | src/main.rs | 2 | ||||
| -rw-r--r-- | src/parser.rs | 49 |
4 files changed, 77 insertions, 0 deletions
@@ -3,5 +3,30 @@ version = 3 [[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "nom" +version = "7.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] name = "rush" version = "0.1.0" +dependencies = [ + "nom", +] @@ -6,3 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +nom = "7.1.1"
\ No newline at end of file diff --git a/src/main.rs b/src/main.rs index b1fb7b7..b202f39 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,6 +4,8 @@ use std::process::{Command}; use std::env; use std::path::Path; +mod parser; + fn substitute_vars(word: &str) -> String { match word { "~" => env::var("HOME").unwrap(), diff --git a/src/parser.rs b/src/parser.rs new file mode 100644 index 0000000..4b78944 --- /dev/null +++ b/src/parser.rs @@ -0,0 +1,49 @@ +use nom::{ + IResult, + character::complete::alphanumeric0, + character::complete::alphanumeric1, + character::complete::anychar, + bytes::complete::tag, + multi::many1, + multi::many0, + //branch::alt, + //combinator::opt, + sequence::tuple +}; + +fn command(i: &str) -> IResult<&str, String> { + match tuple((anychar,alphanumeric0))(i) { + Ok((rest, (c, s))) => { + let tmp = format!("{}{}", c, s); + Ok((rest, tmp)) + }, + Err(e) => Err(e) + } +} + +fn parameter(i: &str) -> IResult<&str, &str> { + alphanumeric1(i) +} + +fn ligature(i: &str) -> IResult<&str, char> { + match tag(";")(i) { + Ok((rest, c)) => + Ok((rest, c.chars().nth(0).unwrap())), + Err(e) => Err(e) + } +} + +fn command_line(i: &str) -> IResult<&str, Vec<String>> { + match tuple((command, many0(parameter)))(i) { + Ok((rest, (com, params))) => { + let mut cmd = vec!(com); + params.iter().for_each(|p| cmd.push(String::from(*p))); + Ok((rest, cmd)) + }, + Err(e) => Err(e) + } +} + +fn command_string(i: &str) -> IResult<&str, Vec<(Vec<String>,char)>> { + many1(tuple((command_line, ligature)))(i) +} |
