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}