mod format_test;
use std::io;
use std::sync::Arc;
use linefeed::{Interface, ReadResult};
use marin::Marin;
use pest::error::{Error, ErrorVariant, InputLocation};
use std::collections::HashMap;
fn main() -> io::Result<()> {
let interface = Arc::new(Interface::new(env!("CARGO_PKG_NAME"))?);
println!("Enter \"help\" for examples.");
println!("Press Ctrl-D or enter \"exit\" to exit.");
println!("(Parsing errors are not formatted nicely right now)");
println!();
interface.set_prompt("marin> ")?;
while let ReadResult::Input(line) = interface.read_line()? {
let (cmd, _) = split_first_word(&line);
match cmd {
"h" | "help" => {
println!("Examples:");
println!(" Positonal Arguments");
println!(" 1 2 3");
println!(" arg1 arg2 arg3");
println!(" Keyword Arguments");
println!(" kw: 1");
println!(" keywordarg: True");
println!(" Flags");
println!(" -flag1 -flag2");
println!(" Quoted Strings");
println!(" kw: \"string with spaces\"");
println!(" \"positional argument with spaces\"");
println!(" Ranges");
println!(" range: 1..10");
println!(" 1..10");
println!(" ..10");
println!(" ids: -10..20");
println!(" Lists");
println!(" vals: [\"val1\", \"val2\"]");
println!(" vals: [1, 2, 3]");
println!(" [1,2,3]");
println!();
}
"q" | "exit" => break,
_ => {
if !line.trim().is_empty() {
match Marin::parse(&line) {
Ok(r) => {
println!("{}", r);
println!()
}
Err(e) => println!("{}", e),
}
}
}
}
}
Ok(())
}
fn split_first_word(s: &str) -> (&str, &str) {
let s = s.trim();
match s.find(|ch: char| ch.is_whitespace()) {
Some(pos) => (&s[..pos], s[pos..].trim_start()),
None => (s, ""),
}
}