Skip to main content

rust_dynamic/
len.rs

1use crate::value::Value;
2use crate::types::*;
3
4impl Value {
5    pub fn len(&self) -> usize {
6        match self.dt {
7            JSON => {
8                match self.cast_json() {
9                    Ok(j_value) => {
10                        if j_value.is_array() {
11                            return j_value.as_array().unwrap().len();
12                        } else {
13                            return 1;
14                        }
15                    }
16                    Err(_) => {
17                        return 0;
18                    }
19                }
20            }
21            STRING | TEXTBUFFER => {
22                match &self.data {
23                    Val::String(v) => return v.len(),
24                    _ => return 0,
25                }
26            }
27            LIST | RESULT => {
28                match &self.data {
29                    Val::List(v) => return v.len(),
30                    _ => return 0,
31                }
32            }
33            MATRIX => {
34                match &self.data {
35                    Val::Matrix(v) => {
36                        let mut c: usize = 0;
37                        for r in v.iter() {
38                            c = c + r.len();
39                        }
40                        return c;
41                    }
42                    _ => return 0,
43                }
44            }
45            QUEUE | FIFO => {
46                match &self.data {
47                    Val::Queue(v) => return v.len(),
48                    _ => return 0,
49                }
50            }
51            LAMBDA => {
52                match &self.data {
53                    Val::Lambda(v) => return v.len(),
54                    _ => return 0,
55                }
56            }
57            BIN | ENVELOPE => {
58                match &self.data {
59                    Val::Binary(v) => return v.len(),
60                    _ => return 0,
61                }
62            }
63            MAP | CURRY | CONDITIONAL | CLASS | OBJECT => {
64                match &self.data {
65                    Val::Map(v) => return v.len(),
66                    _ => return 0,
67                }
68            }
69            VALUEMAP => {
70                match &self.data {
71                    Val::ValueMap(v) => return v.len(),
72                    _ => return 0,
73                }
74            }
75            MESSAGE => {
76                let _ = match self.get("payload") {
77                    Ok(res) => {
78                        return res.len();
79                    }
80                    Err(_) => return 0,
81                };
82            }
83            METRICS => {
84                match &self.data {
85                    Val::Metrics(v) => return v.len(),
86                    _ => return 0,
87                }
88            }
89            EMBEDDING => {
90                match &self.data {
91                    Val::Embedding(v) => return v.len(),
92                    _ => return 0,
93                }
94            }
95            NODATA => return 0,
96            _ => {
97                let str_val = match self.conv(STRING) {
98                    Ok(str_val) => str_val,
99                    Err(_) => {
100                        return 1;
101                    }
102                };
103                return str_val.len();
104            }
105        }
106    }
107}