diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 2 | ||||
-rw-r--r-- | src/socket/parser.rs | 36 |
2 files changed, 36 insertions, 2 deletions
diff --git a/src/main.rs b/src/main.rs index 27c1a46..21133ef 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,8 @@ extern crate libc; extern crate x11; extern crate unix_socket; +#[macro_use] +extern crate nom; pub mod safe_x11; pub mod command; diff --git a/src/socket/parser.rs b/src/socket/parser.rs index 3cfc15d..e8dd9ec 100644 --- a/src/socket/parser.rs +++ b/src/socket/parser.rs @@ -11,7 +11,28 @@ use x11::keysym; use command::*; use dotwm::DotWM; -fn str_to_modifier<'a>(s: &'a str) -> Result<u32, ()> { +use nom::{IResult,alpha,multispace}; +use nom::IResult::*; +use std::str; + +named!(token<&str>, + map_res!( + alpha, str::from_utf8)); + +fn slice2str(input: Vec<&[u8]>) -> Vec<&str> { + let res: Vec<&str> = input.iter() + .map(|x| str::from_utf8(x).unwrap()) + .collect(); + res +} + +named!(args<Vec<&str> >, + map!( + separated_list!( + multispace, alpha), + slice2str)); + +fn modifier<'a>(s: &'a str) -> Result<u32, ()> { match s { "Mod1Mask" => Ok(xlib::Mod4Mask), "Mod2Mask" => Ok(xlib::Mod4Mask), @@ -53,7 +74,7 @@ pub fn parse<'a>(dotwm: &mut DotWM, bindings: &mut BindingHash, input: &'a str) Some(cmd) => { match cmd { &"add-binding" => { - let modifier = str_to_modifier(args[1]).unwrap(); + let modifier = modifier(args[1]).unwrap(); let key = str_to_key(args[2]).unwrap(); let func = str_to_func(args[3]).unwrap(); let arguments = &args[4..]; @@ -68,3 +89,14 @@ pub fn parse<'a>(dotwm: &mut DotWM, bindings: &mut BindingHash, input: &'a str) } "ok" } + +#[test] +fn parse_test() { + assert_eq!(token(&b"exec"[..]), IResult::Done(&b""[..], "exec")); +} + +#[test] +fn parse_args() { + assert_eq!(args(&b"hola chau"[..]), + IResult::Done(&b""[..], vec!["hola", "chau"])); +} |