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}