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}