rust_dynamic 0.49.0

Support for dynamically-typed values in run-time
Documentation
use crate::value::Value;
use crate::types::*;

impl Iterator for Value {
    type Item = Value;
    fn next(&mut self) -> Option<Value> {
         if self.curr == -1 && ( self.dt == LIST || self.dt == RESULT ) {
            match &self.data {
                Val::List(v) => {
                    if v.len() > 0 {
                        self.curr = 1;
                        return Some(v[0].clone());
                    } else {
                        return None;
                    }
                }
                _ => return None,
            }
        } else if self.curr >= 0 && ( self.dt == LIST || self.dt == RESULT ) {
            match &self.data {
                Val::List(v) => {
                    if v.len() > self.curr as usize {
                        let ret = v[self.curr as usize].clone();
                        self.curr += 1;
                        return Some(ret);
                    } else {
                        self.curr = -1;
                        return None;
                    }
                }
                _ => return None,
            }
        } else if self.curr == -1 && self.dt == MATRIX  {
           match &self.data {
               Val::Matrix(v) => {
                   if v.len() > 0 {
                       self.curr = 1;
                       return Some(Value::from_list(v[0].clone()));
                   } else {
                       return None;
                   }
               }
               _ => return None,
           }
       } else if self.curr >= 0 && self.dt == MATRIX {
            match &self.data {
                Val::Matrix(v) => {
                    if v.len() > self.curr as usize {
                        let ret = v[self.curr as usize].clone();
                        self.curr += 1;
                        return Some(Value::from_list(ret));
                    } else {
                        self.curr = -1;
                        return None;
                    }
                }
                _ => return None,
            }
        } else if self.curr == -1 && self.dt == METRICS {
            match &self.data {
                Val::Metrics(v) => {
                    if v.len() > 0 {
                        self.curr = 1;
                        let m = &v[0];
                        let mut res = Value::dict();
                        res = res.set("value", Value::from_float(m.data as f64));
                        res = res.set("ts", Value::from_stamp(m.stamp as u128));
                        return Some(res);
                    } else {
                        return None;
                    }
                }
                _ => return None,
            }
        } else if self.curr >= 0 && self.dt == METRICS {
            match &self.data {
                Val::Metrics(v) => {
                    if v.len() > self.curr as usize {
                        let m = &v[self.curr as usize];
                        let mut res = Value::dict();
                        res = res.set("value", Value::from_float(m.data as f64));
                        res = res.set("ts", Value::from_stamp(m.stamp as u128));
                        self.curr += 1;
                        return Some(res);
                    } else {
                        self.curr = -1;
                        return None;
                    }
                }
                _ => return None,
            }
        } else if self.curr == -1 {
            self.curr = 0;
            return Some(self.clone());
        } else if self.curr == 0 {
            self.curr = -1;
            return None;
        } else {
            return None;
        }
    }
}