use crate::error::*;
pub fn parse_expressions(input: &str) -> Result<Vec<String>> {
let separator = match input.chars().next() {
Some(ch) => ch,
None => return Ok(Vec::new()),
};
let mut expressions = Vec::new();
let mut partial: Option<String> = None;
for chunk in input[separator.len_utf8()..].split(separator) {
let last_non_escape = chunk
.rfind(|c| c!= '\\')
.map(|last_i|
last_i +
chunk[last_i..].chars().next().unwrap().len_utf8() - 1
)
;
let nr_of_escapes = match last_non_escape {
None => chunk.len(),
Some(x) => chunk.len() - x - 1,
};
if nr_of_escapes % 2 == 1 {
let mut tmp = match partial {
Some(mut x) => { x.push_str(&chunk[..chunk.len() - 1]); x },
None => chunk[..chunk.len() - 1].to_string(),
};
tmp.push(separator);
partial = Some(tmp);
}
else {
match partial {
None => {
expressions.push(chunk.to_string());
},
Some(mut x) => {
x.push_str(chunk);
expressions.push(x);
partial = None;
},
}
}
}
if partial.is_some() {
Err(EdError::ArgumentListEscapedEnd(input.to_owned()))
}
else {
Ok(expressions)
}
}