summaryrefslogtreecommitdiff
path: root/src/socket/parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/socket/parser.rs')
-rw-r--r--src/socket/parser.rs36
1 files changed, 34 insertions, 2 deletions
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"]));
+}