aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs2
-rw-r--r--src/socket/parser.rs36
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"]));
+}