csvenum/types/containers/
tupletype.rs

1use super::{RType, RTypeTrait, NestedValueParser};
2
3pub struct TupleType {
4
5}
6
7impl TupleType {
8    /// Wrap type, depending on the passed function, references to the type and or lifetimes will be ignored.
9    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 { //  v &RType    v String.as_ref()
15            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        // we expect as many values as there are elements in our vector 
27        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};//, NumericType, StringType, Reference};
58
59    #[test]
60    fn test_wrap_tuple() {
61        //let tupletypes = vec![Box::new(RType::Numeric(Reference::None, NumericType::u8)), Box::new(RType::String(Reference::Naked, StringType::str))];
62        //let typestr = tupletypes
63
64
65    }
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, ArrayType::value_is_valid(values, &Box::new(RType::Container(Reference::None, result)), &3));
77        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}