valence_command/parsers/
swizzle.rs

1use super::Parser;
2use crate::parsers::{CommandArg, CommandArgParseError, ParseInput};
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
5pub struct Swizzle {
6    pub x: bool,
7    pub y: bool,
8    pub z: bool,
9}
10
11impl CommandArg for Swizzle {
12    fn parse_arg(input: &mut ParseInput) -> Result<Self, CommandArgParseError> {
13        input.skip_whitespace();
14        let mut swizzle = Swizzle::default();
15        while let Some(c) = input.peek() {
16            match c {
17                'x' => swizzle.x = true,
18                'y' => swizzle.y = true,
19                'z' => swizzle.z = true,
20                _ => break,
21            }
22            input.pop();
23        }
24
25        Ok(swizzle)
26    }
27
28    fn display() -> Parser {
29        Parser::Swizzle
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn test_swizzle() {
39        let mut input = ParseInput::new("xyzzzz");
40        let swizzle = Swizzle::parse_arg(&mut input).unwrap();
41        assert_eq!(
42            swizzle,
43            Swizzle {
44                x: true,
45                y: true,
46                z: true
47            }
48        );
49        assert!(input.is_done());
50
51        let mut input = ParseInput::new("xzy");
52        let swizzle = Swizzle::parse_arg(&mut input).unwrap();
53        assert_eq!(
54            swizzle,
55            Swizzle {
56                x: true,
57                y: true,
58                z: true
59            }
60        );
61        assert!(input.is_done());
62
63        let mut input = ParseInput::new("x");
64        let swizzle = Swizzle::parse_arg(&mut input).unwrap();
65        assert_eq!(
66            swizzle,
67            Swizzle {
68                x: true,
69                y: false,
70                z: false
71            }
72        );
73        assert!(input.is_done());
74
75        let mut input = ParseInput::new("x y z zy xyz");
76        let swizzle_a = Swizzle::parse_arg(&mut input).unwrap();
77        let swizzle_b = Swizzle::parse_arg(&mut input).unwrap();
78        let swizzle_c = Swizzle::parse_arg(&mut input).unwrap();
79        let swizzle_d = Swizzle::parse_arg(&mut input).unwrap();
80        let swizzle_e = Swizzle::parse_arg(&mut input).unwrap();
81        assert_eq!(
82            swizzle_a,
83            Swizzle {
84                x: true,
85                y: false,
86                z: false
87            }
88        );
89        assert_eq!(
90            swizzle_b,
91            Swizzle {
92                x: false,
93                y: true,
94                z: false
95            }
96        );
97        assert_eq!(
98            swizzle_c,
99            Swizzle {
100                x: false,
101                y: false,
102                z: true
103            }
104        );
105        assert_eq!(
106            swizzle_d,
107            Swizzle {
108                x: false,
109                y: true,
110                z: true
111            }
112        );
113        assert_eq!(
114            swizzle_e,
115            Swizzle {
116                x: true,
117                y: true,
118                z: true
119            }
120        );
121    }
122}