style: Parse any order of number and angle for Rotate.

Rotate accepts rotate axis and angle in any order
(i.e. <number>{3} <angle> or <angle> <number>{3}), so we rewrite the
parser.

Differential Revision: https://phabricator.services.mozilla.com/D11417
This commit is contained in:
Boris Chiou 2018-11-12 19:21:32 +00:00 committed by Emilio Cobos Álvarez
parent 0b9ecbccfe
commit d8bd29292e
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C

View file

@ -357,17 +357,28 @@ impl Parse for Rotate {
return Ok(generic::Rotate::None);
}
if let Ok(rx) = input.try(|i| Number::parse(context, i)) {
// 'rotate: <number>{3} <angle>'
let ry = Number::parse(context, input)?;
let rz = Number::parse(context, input)?;
let angle = specified::Angle::parse(context, input)?;
return Ok(generic::Rotate::Rotate3D(rx, ry, rz, angle));
}
// Parse <angle> or [ x | y | z | <number>{3} ] && <angle>.
// TODO: Bug 1504327: Parse [x|y|z] keywords.
//
// The rotate axis and angle could be in any order, so we parse angle twice to cover
// two cases. i.e. `<number>{3} <angle>` or `<angle> <number>{3}`
let angle = input.try(|i| specified::Angle::parse(context, i)).ok();
let axis = input.try(|i| -> Result<_, ParseError> {
Ok((
Number::parse(context, i)?,
Number::parse(context, i)?,
Number::parse(context, i)?,
))
}).ok();
let angle = match angle {
Some(a) => a,
None => specified::Angle::parse(context, input)?,
};
// 'rotate: <angle>'
let angle = specified::Angle::parse(context, input)?;
Ok(generic::Rotate::Rotate(angle))
Ok(match axis {
Some((x, y, z)) => generic::Rotate::Rotate3D(x, y, z, angle),
None => generic::Rotate::Rotate(angle),
})
}
}