use serde_json::map::Map;
use serde_json::to_string_pretty;
use serde_json::value::{Value, to_value, Number};
#[derive(PartialEq, Debug)]
pub enum ForLoopKind {
Value,
KeyValue,
}
#[derive(Debug)]
pub struct ForLoop {
pub key_name: Option<String>,
pub value_name: String,
pub current: usize,
pub values: Vec<(Option<String>, Value)>,
pub kind: ForLoopKind,
pub extra_values: Map<String, Value>,
}
impl ForLoop {
pub fn new(value_name: &str, values: Value) -> ForLoop {
let mut for_values = vec![];
for val in values.as_array().unwrap() {
for_values.push((None, val.clone()));
}
ForLoop {
key_name: None,
value_name: value_name.to_string(),
current: 0,
values: for_values,
kind: ForLoopKind::Value,
extra_values: Map::new(),
}
}
pub fn new_key_value(key_name: &str, value_name: &str, values: Value) -> ForLoop {
let mut for_values = vec![];
for (key, val) in values.as_object().unwrap() {
for_values.push((Some(key.clone()), val.clone()));
}
ForLoop {
key_name: Some(key_name.to_string()),
value_name: value_name.to_string(),
current: 0,
values: for_values,
kind: ForLoopKind::KeyValue,
extra_values: Map::new(),
}
}
#[inline]
pub fn increment(&mut self) {
self.current += 1;
}
#[inline]
pub fn get_current_value(&self) -> Option<&Value> {
if let Some(v) = self.values.get(self.current) {
return Some(&v.1);
}
None
}
#[inline]
pub fn get_current_key(&self) -> String {
if let Some(v) = self.values.get(self.current) {
if let Some(ref k) = v.0 {
return k.clone();
}
}
unreachable!();
}
pub fn is_key(&self, name: &str) -> bool {
if self.kind == ForLoopKind::Value {
return false;
}
if let Some(ref key_name) = self.key_name {
return key_name == name;
}
false
}
#[inline]
pub fn len(&self) -> usize {
self.values.len()
}
}