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