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}