valence_command/parsers/
vec2.rs

1use super::Parser;
2use crate::parsers::{AbsoluteOrRelative, CommandArg, CommandArgParseError, ParseInput};
3
4#[derive(Debug, Clone, Copy, PartialEq, Default)]
5pub struct Vec2 {
6    pub x: AbsoluteOrRelative<f32>,
7    pub y: AbsoluteOrRelative<f32>,
8}
9
10impl CommandArg for Vec2 {
11    fn parse_arg(input: &mut ParseInput) -> Result<Self, CommandArgParseError> {
12        input.skip_whitespace();
13        let x = AbsoluteOrRelative::<f32>::parse_arg(input)?;
14        input.skip_whitespace();
15        let y = AbsoluteOrRelative::<f32>::parse_arg(input)?;
16
17        Ok(Vec2 { x, y })
18    }
19
20    fn display() -> Parser {
21        Parser::Vec2
22    }
23}
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28
29    #[test]
30    fn test_vec2() {
31        let mut input = ParseInput::new("~-1.5 2.5");
32        assert_eq!(
33            Vec2::parse_arg(&mut input).unwrap(),
34            Vec2 {
35                x: AbsoluteOrRelative::Relative(-1.5),
36                y: AbsoluteOrRelative::Absolute(2.5),
37            }
38        );
39        assert!(input.is_done());
40
41        let mut input = ParseInput::new("-1.5 ~2.5 ");
42        assert_eq!(
43            Vec2::parse_arg(&mut input).unwrap(),
44            Vec2 {
45                x: AbsoluteOrRelative::Absolute(-1.5),
46                y: AbsoluteOrRelative::Relative(2.5),
47            }
48        );
49        assert!(!input.is_done());
50
51        let mut input = ParseInput::new("-1.5 2.5 3.5");
52        assert_eq!(
53            Vec2::parse_arg(&mut input).unwrap(),
54            Vec2 {
55                x: AbsoluteOrRelative::Absolute(-1.5),
56                y: AbsoluteOrRelative::Absolute(2.5),
57            }
58        );
59        assert!(!input.is_done());
60    }
61}