Fix parsing of AttrValues (fixes #37)

This commit is contained in:
elkowar 2020-10-21 19:14:17 +02:00
parent 7f39205c92
commit 5f3e16e70c
2 changed files with 47 additions and 15 deletions

View file

@ -96,6 +96,10 @@ impl AttrValue {
cur_varref = Some(String::new()) cur_varref = Some(String::new())
} }
} else { } else {
if curly_count == 1 {
cur_word.push('{');
}
curly_count = 0;
cur_word.push(c); cur_word.push(c);
} }
} }
@ -144,23 +148,24 @@ impl AttrValueElement {
} }
} }
#[cfg(Test)] #[cfg(test)]
mod test { mod test {
use super::*;
use pretty_assertions::assert_eq; use pretty_assertions::assert_eq;
#[test] #[test]
fn test_parse_string_or_var_ref_list() { fn test_parse_string_or_var_ref_list() {
let input = "{{foo}}{{bar}}baz{{bat}}quok{{test}}"; let input = "{{foo}}{{bar}}b{}az{{bat}}{}quok{{test}}";
let output = parse_string_with_var_refs(input); let output = AttrValue::parse_string(input);
assert_eq!( assert_eq!(
output, output,
vec![ AttrValue(vec![
StringOrVarRef::VarRef("foo".to_owned()), AttrValueElement::VarRef(VarName("foo".to_owned())),
StringOrVarRef::VarRef("bar".to_owned()), AttrValueElement::VarRef(VarName("bar".to_owned())),
StringOrVarRef::String("baz".to_owned()), AttrValueElement::primitive("b{}az".to_owned()),
StringOrVarRef::VarRef("bat".to_owned()), AttrValueElement::VarRef(VarName("bat".to_owned())),
StringOrVarRef::String("quok".to_owned()), AttrValueElement::primitive("{}quok".to_owned()),
StringOrVarRef::VarRef("test".to_owned()), AttrValueElement::VarRef(VarName("test".to_owned())),
], ]),
) )
} }
#[test] #[test]
@ -168,8 +173,8 @@ mod test {
assert_eq!( assert_eq!(
AttrValue( AttrValue(
vec![ vec![
StringOrVarRef::VarRef(VarName("var".to_owned())), AttrValueElement::VarRef(VarName("var".to_owned())),
StringOrVarRef::primitive("something".to_owned()) AttrValueElement::primitive("something".to_owned())
] ]
.into() .into()
), ),

View file

@ -72,10 +72,37 @@ impl fmt::Debug for Coords {
} }
impl Coords { impl Coords {
/// parse a string for x and a string for y into a [`Coords`] object.
pub fn from_strs(x: &str, y: &str) -> Result<Coords> { pub fn from_strs(x: &str, y: &str) -> Result<Coords> {
Ok(Coords { Ok(Coords {
x: x.parse()?, x: x.parse().with_context(|| format!("Failed to parse '{}'", x))?,
y: y.parse()?, y: y.parse().with_context(|| format!("Failed to parse '{}'", y))?,
}) })
} }
} }
#[cfg(test)]
mod test {
use super::*;
use pretty_assertions::assert_eq;
#[test]
fn test_parse_num_with_unit() {
assert_eq!(NumWithUnit::Pixels(55), NumWithUnit::from_str("55").unwrap());
assert_eq!(NumWithUnit::Pixels(55), NumWithUnit::from_str("55px").unwrap());
assert_eq!(NumWithUnit::Percent(55), NumWithUnit::from_str("55%").unwrap());
assert!(NumWithUnit::from_str("55pp").is_err());
}
#[test]
fn test_parse_coords() {
assert_eq!(
Coords {
x: NumWithUnit::Pixels(50),
y: NumWithUnit::Pixels(60)
},
Coords::from_str("50x60").unwrap()
);
assert!(Coords::from_str("5060").is_err());
}
}