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}