diff options
-rw-r--r-- | Cargo.lock | 6 | ||||
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | src/main.rs | 2 | ||||
-rw-r--r-- | src/socket/parser.rs | 36 |
4 files changed, 43 insertions, 2 deletions
@@ -3,6 +3,7 @@ name = "dotwm" version = "0.1.0" dependencies = [ "libc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "nom 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "unix_socket 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "x11 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -23,6 +24,11 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] +name = "nom" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] name = "pkg-config" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -6,6 +6,7 @@ authors = ["Matias Linares <matiaslina@openmailbox.org>"] [dependencies] libc = "0.2.*" unix_socket = "*" +nom = "~1.0.0" [dependencies.x11] version = "*" 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"])); +} |