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