csvenum/types/containers/
tupletype.rs1use super::{RType, RTypeTrait, NestedValueParser};
2
3pub struct TupleType {
4
5}
6
7impl TupleType {
8 pub fn wrap_types_with_typefn<T: RTypeTrait, R>(rtypes: &Vec<Box<T>>, func: fn(&T) -> R) -> String
10 where
11 R: AsRef<str>,
12 {
13 let mut tuplestr = String::from("(");
14 for x in rtypes { tuplestr = tuplestr + func(x.as_ref()).as_ref() + ", ";
16 }
17 tuplestr.pop();
18 tuplestr.pop();
19 tuplestr.push(')');
20 tuplestr
21 }
22
23 pub fn value_is_valid(valuestr: &str, rtypes: &Vec<Box<RType>>) -> bool {
24 let values = NestedValueParser::parse_nested_str(valuestr, '(', true);
25
26 let tuple_size = rtypes.len();
28 if values.len() != tuple_size {return false}
29 for i in 0..tuple_size {
30 if !rtypes[i].value_is_valid(&values[i]) {return false}
31 }
32 true
33 }
34
35 pub fn wrap_valuestr(valuestr: &str, rtypes: &Vec<Box<RType>>) -> String {
36 let values = NestedValueParser::parse_nested_str(valuestr, '(', true);
37 let mut wrapped_str = String::from("(");
38 let tuple_size = rtypes.len();
39 for i in 0..tuple_size {
40 let valstr = rtypes[i].wrap_valuestr(&values[i]);
41 wrapped_str = format!("{}{}, ", wrapped_str, valstr);
42 }
43 wrapped_str.pop(); wrapped_str.pop();
44 wrapped_str += ")";
45 wrapped_str
46
47
48 }
49}
50
51
52
53
54#[cfg(test)]
55mod tests {
56
57 use crate::{RType, RTypeTrait};#[test]
60 fn test_wrap_tuple() {
61 }
66
67 #[test]
68 fn test_tupletype_valid_values() {
69 let input = "(usize, usize, usize)";
70 let rtype = RType::from_typestr(input).unwrap();
71 let values = "(3,3,3)";
72 assert_eq!(true, rtype.value_is_valid(values));
73 let values = "[3,3,3]";
74 assert_eq!(false, rtype.value_is_valid(values));
75 let values = "(art,5.43,3)";
76 assert_eq!(false, rtype.value_is_valid(values));
78 }
79
80 #[test]
81 fn test_tupletype_valid_values_complex() {
82 let input = "((usize, usize), usize, [usize; 3])";
83 let rtype = RType::from_typestr(input).unwrap();
84 let values = "((2,2),3,[5,5,5])";
85 assert_eq!(true, rtype.value_is_valid(values));
86 let values = "((2,2)3,[5,5,5])";
87 assert_eq!(false, rtype.value_is_valid(values));
88 let values = "(art,5.43,3)";
89 assert_eq!(false, rtype.value_is_valid(values));
90 }
91
92 #[test]
93 fn test_tupletype_wrap_values() {
94 let input = "((usize, usize), usize, [usize; 3])";
95 let rtype = RType::from_typestr(input).unwrap();
96 let values = "((2,2),3,[5,5,5])";
97 let expected = "((2, 2), 3, [5, 5, 5])".to_string();
98 assert_eq!(expected, rtype.wrap_valuestr(values));
99
100 let input = "((usize, usize), &str, [usize; 3])";
101 let rtype = RType::from_typestr(input).unwrap();
102 let values = "((2,2),3,[5,5,5])";
103 let expected = "((2, 2), \"3\", [5, 5, 5])".to_string();
104 assert_eq!(expected, rtype.wrap_valuestr(values));
105 }
106
107}