X-Git-Url: https://harishankar.org/repos/?p=evpf.git;a=blobdiff_plain;f=src%2Fmain.rs;h=98532ff4f10a7fdc12d5668af895c7ad083e863c;hp=bab1e521d17a5e4f2e794d645f851c2b448c0d01;hb=a550442ff655e75c85edc1d0d591c34a1cc4380c;hpb=ac6c2056e35e042ada5f88580329bc2ca51e72ff diff --git a/src/main.rs b/src/main.rs index bab1e52..98532ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,8 @@ use std::io; use std::io::Write; use regex::Regex; -use ansi_term::Colour; -use ansi_term::Style; +use colored::*; +use std::env; const ILLEGAL_EXP : &'static str = "Illegal Expression"; const ERR_PARSING_NOT_MATCH : &'static str = "Error parsing expression! \ @@ -134,49 +134,86 @@ fn evaluate (expr : &str, match_num : ®ex::Regex) -> Result { } fn main() { - // get a line from input and evaluate it - let mut expr = String::new (); + + let args : Vec = env::args().collect (); // regular expression to match a number let match_num = Regex::new (r"^\d+?\.*?\d*?$").unwrap (); - // loop until a blank line is received - loop { - expr.clear (); - print!("{}", Style::new().bold().paint("evpf>")); - io::stdout().flush ().expect (ERR_FLUSHING); - // read a line of text - io::stdin().read_line (&mut expr).expect (ERR_READING_LINE); - // trim the text - let expr = expr.trim (); - - if expr == "q" || expr == "Q" { - // quit if the expression is q or Qs - break; - } else if expr == "?" || expr == "h" || expr == "H" { - // display help text - for text in HELP_TEXT.iter() { - println! ("{}", Colour::Cyan.paint(*text)); + + if args.len () > 1 { + // if arguments are provided run in command line mode - i.e. print the + // result and exit + let mut expr = String::new (); + let mut i = 0; + // create the expression string to evaluate + for arg in args.iter() { + if i > 0 { + expr.push_str (&arg); + expr.push_str (" "); } - - continue; - } else if expr == "" { - // continue without proceeding - continue; + i += 1; } - - // Evaluate result + // evaluate the result let res = evaluate (&expr, &match_num); - // if Result is OK then print the result in green if res.is_ok () { let restxt = format! ("{}: {}", RESULT, res.unwrap()); - println! ("{}", Colour::Green.paint (restxt)); + println! ("{}", restxt.green ()); } else { // print the error in purple let errtxt = format! ("{}: {}", ERROR, res.unwrap_err()); - eprintln! ("{}", Colour::Purple.paint (errtxt)); - eprintln! ("{}", Colour::Purple.paint (ERROR_HELP)); + eprintln! ("{}", errtxt.purple ()); + } + + } else { + // if arguments are not provided run in interactive mode - + // display a prompt and get the expression + // repeat until the user quits + + // get a line from input and evaluate it + let mut expr = String::new (); + + // loop until a blank line is received + loop { + expr.clear (); + print!("{}", "evpf>".bold() ); + io::stdout().flush ().expect (ERR_FLUSHING); + // read a line of text + io::stdin().read_line (&mut expr).expect (ERR_READING_LINE); + // trim the text + let expr = expr.trim (); + + if expr == "q" || expr == "Q" { + // quit if the expression is q or Qs + break; + } else if expr == "?" || expr == "h" || expr == "H" { + // display help text + for text in HELP_TEXT.iter() { + println! ("{}", text.cyan() ); + } + + continue; + } else if expr == "" { + // continue without proceeding + continue; + } + + // Evaluate result + let res = evaluate (&expr, &match_num); + + // if Result is OK then print the result in green + if res.is_ok () { + let restxt = format! ("{}: {}", RESULT, + res.unwrap()); + println! ("{}", restxt.green ()); + } else { + // print the error in purple + let errtxt = format! ("{}: {}", ERROR, + res.unwrap_err()); + eprintln! ("{}", errtxt.purple()); + eprintln! ("{}", ERROR_HELP.purple()); + } } } }