summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEl-BG-1970 <elouan.gros.fr@gmail.com>2022-04-29 19:34:07 +0200
committerEl-BG-1970 <elouan.gros.fr@gmail.com>2022-04-29 19:34:07 +0200
commit48bd6085d67e6b702932e468ce5e44156a663060 (patch)
treead156705063e902597007227622a20d67e0194b5
parent90cf1fff49dbbf12bf4151878674ad3ff567dcaf (diff)
downloadrush-48bd6085d67e6b702932e468ce5e44156a663060.tar.gz
parser
-rw-r--r--Cargo.lock25
-rw-r--r--Cargo.toml1
-rw-r--r--src/main.rs2
-rw-r--r--src/parser.rs49
4 files changed, 77 insertions, 0 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 71f3fed..c2f1ecd 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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",
+]
diff --git a/Cargo.toml b/Cargo.toml
index dee5fca..db513c9 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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)
+}