valence_command/parsers/
column_pos.rs

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