valence_command/parsers/
block_pos.rs

1use super::Parser;
2use crate::parsers::{AbsoluteOrRelative, CommandArg, CommandArgParseError, ParseInput};
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
5pub struct BlockPos {
6    pub x: AbsoluteOrRelative<i32>,
7    pub y: AbsoluteOrRelative<i32>,
8    pub z: AbsoluteOrRelative<i32>,
9}
10
11impl CommandArg for BlockPos {
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(BlockPos { x, y, z })
21    }
22
23    fn display() -> Parser {
24        Parser::BlockPos
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn test_block_pos() {
34        let mut input = ParseInput::new("~-1 2 3");
35        assert_eq!(
36            BlockPos::parse_arg(&mut input).unwrap(),
37            BlockPos {
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 ");
46        assert_eq!(
47            BlockPos::parse_arg(&mut input).unwrap(),
48            BlockPos {
49                x: AbsoluteOrRelative::Absolute(-1),
50                y: AbsoluteOrRelative::Relative(2),
51                z: AbsoluteOrRelative::Absolute(3)
52            }
53        );
54        assert!(!input.is_done());
55
56        let mut input = ParseInput::new("-1 2 ~3 4");
57        assert_eq!(
58            BlockPos::parse_arg(&mut input).unwrap(),
59            BlockPos {
60                x: AbsoluteOrRelative::Absolute(-1),
61                y: AbsoluteOrRelative::Absolute(2),
62                z: AbsoluteOrRelative::Relative(3)
63            }
64        );
65        assert!(!input.is_done());
66    }
67}