From 41b25cd9845007a08547d18f1afd60236de564a6 Mon Sep 17 00:00:00 2001 From: primardj Date: Fri, 5 Apr 2024 20:12:55 +0100 Subject: [PATCH] make a parser for sv --- 01_phase_rust_src/sv/src/main.rs | 12 ++- 01_phase_rust_src/sv/src/parser.rs | 118 ++++++++++++++++++++++++ 01_phase_rust_src/sv/src/parser/misc.rs | 5 + 3 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 01_phase_rust_src/sv/src/parser.rs create mode 100644 01_phase_rust_src/sv/src/parser/misc.rs diff --git a/01_phase_rust_src/sv/src/main.rs b/01_phase_rust_src/sv/src/main.rs index 2d4c1e6..20097a0 100644 --- a/01_phase_rust_src/sv/src/main.rs +++ b/01_phase_rust_src/sv/src/main.rs @@ -1,7 +1,17 @@ +//mod misc; +mod parser; + use std::env; fn main() { let args: Vec = env::args().collect(); - dbg!(args); + + // args + let arg_parser: Vec = parser::parse_args(args); + + dbg!(arg_parser); + + + //dbg!(args); } diff --git a/01_phase_rust_src/sv/src/parser.rs b/01_phase_rust_src/sv/src/parser.rs new file mode 100644 index 0000000..aa2a608 --- /dev/null +++ b/01_phase_rust_src/sv/src/parser.rs @@ -0,0 +1,118 @@ + + +mod misc; + +use std::process::exit; + +pub fn parse_args(args: Vec) -> Vec{ + let mut i: i8 = 0; + + let mut parser: Vec = Vec::new(); + let mut tmpstr: String; + + for arg in args.iter() { + if i == 0 { + i += 1; + } + else if i == 1 { + tmpstr = parse_args_1(arg); + + if tmpstr == "--" { + i += 1; + } + if tmpstr == "-w" { + // i = 4 signifie, take next word, and return to i = 1. + i = 4; + } + + if tmpstr != "--" && tmpstr != "" { + parser.push(tmpstr); + } + else if tmpstr == "" { + // We are actually in phase II. Do exactly the same if it was phase II. + parser.push(phase2(arg)); + i = 3; + } + } + else if i == 2 { + parser.push(phase2(arg)); + i += 1; + } + else if i == 3 { + // phase 3, everything is a service name. + parser.push(arg.to_string()); + } + else if i == 4 { + // 4. push arg and return to stage 1. + parser.push(arg.to_string()); + i = 1; + + } + } + + return parser; +} + +fn phase2(arg: &String) -> String { + let tmpstr: String; + tmpstr = parse_args_2(arg); + + if tmpstr == "INVALID" { + misc::usage(); + exit(100); + + } + + return tmpstr + +} + +pub fn parse_args_1(arg: &String) -> String{ + // Get a string + // Return a vect ('first_char', 'length', 'entry_necessary') + + + let ch1 = arg.chars().next().unwrap(); + + //println!("{}", ch1); + + if ch1 == '-' && arg.len() >= 2{ + return (&arg[..2]).to_string() + } else if ch1 == '-' { + return ch1.to_string() + } + + println!("{}",arg); + return "".to_string() + + +} + + +pub fn parse_args_2(arg: &String) -> String{ + let possible: Vec<&str> = vec!["start", "stop", "reload", "restart", "shutdown", "force-stop", "force-reload", "force-restart", "force-shutdown", "try-restart"]; + let cpossible: Vec = vec!['s', 'u', 'd', 'o', 'p', 'c', 'h', 'a', 'i', 'q', '1', '2', 't', 'k']; + + + + for var in possible.iter() { + if arg == var { + return var.to_string() + } + } + + + let ch1 = arg.chars().next().unwrap(); + + + for var in cpossible.iter() { + if ch1 == *var { + return ch1.to_string() + } + } + + + return "INVALID".to_string() + + +} diff --git a/01_phase_rust_src/sv/src/parser/misc.rs b/01_phase_rust_src/sv/src/parser/misc.rs new file mode 100644 index 0000000..9fcd81d --- /dev/null +++ b/01_phase_rust_src/sv/src/parser/misc.rs @@ -0,0 +1,5 @@ + + +pub fn usage() { + println!("usage: sv [-v] [-w sec] command service ...\n") +}