1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
use std::collections::HashMap;

use crate::providers::C5RawValue;
use crate::value::C5DataValue;

pub fn deserialize_json(raw_value: C5RawValue) -> C5DataValue {

  let value_result: Result<serde_json::Value, serde_json::Error>;

  match raw_value {
    C5RawValue::Bytes(data) => {

      value_result = serde_json::from_slice(data.as_slice());
    },
    C5RawValue::String(data) => {
      value_result = serde_json::from_str(&data);
    }
  }

  if value_result.is_err() {
    return C5DataValue::Null;
  }

  let value = value_result.unwrap();

  return serde_json_val_to_c5_value(value);
}

pub fn deserialize_yaml(raw_value: C5RawValue) -> C5DataValue {

  let value_result: Result<serde_yaml::Value, serde_yaml::Error>;

  match raw_value {
    C5RawValue::Bytes(data) => {

      value_result = serde_yaml::from_slice(data.as_slice());
    },
    C5RawValue::String(data) => {
      value_result = serde_yaml::from_str(&data);
    }
  }

  if value_result.is_err() {
    return C5DataValue::Null;
  }

  let value = value_result.unwrap();

  return serde_yaml_val_to_c5_value(value);
}

pub fn serde_yaml_val_to_c5_value(raw_value: serde_yaml::Value) -> C5DataValue {

  return match raw_value.clone() {
    serde_yaml::Value::Null => C5DataValue::Null,
    serde_yaml::Value::Bool(value) => C5DataValue::Boolean(value),
    serde_yaml::Value::String(value) => C5DataValue::String(value),
    serde_yaml::Value::Number(value) => {
      if value.is_f64() {
        C5DataValue::Float(value.as_f64().unwrap())
      } else if value.is_i64() {
        C5DataValue::Integer(value.as_i64().unwrap())
      } else {
        C5DataValue::UInteger(value.as_u64().unwrap())
      }
    },
    serde_yaml::Value::Sequence(value) => C5DataValue::Array(value.into_iter().map(|item| serde_yaml_val_to_c5_value(item)).collect()),
    serde_yaml::Value::Mapping(_value) => {
      let map_result: Result<HashMap<String, serde_yaml::Value>, serde_yaml::Error> = serde_yaml::from_value(raw_value);

      if map_result.is_err() {
        C5DataValue::Null
      } else {
        let mut new_map = HashMap::new();
        for (key, value) in map_result.unwrap() {
          new_map.insert(key, serde_yaml_val_to_c5_value(value));
        }

        C5DataValue::Map(new_map)
      }
    },
  };
}

pub fn serde_json_val_to_c5_value(raw_value: serde_json::Value) -> C5DataValue {

  return match raw_value.clone() {
    serde_json::Value::Null => C5DataValue::Null,
    serde_json::Value::Bool(value) => C5DataValue::Boolean(value),
    serde_json::Value::String(value) => C5DataValue::String(value),
    serde_json::Value::Number(value) => {
      if value.is_f64() {
        C5DataValue::Float(value.as_f64().unwrap())
      } else if value.is_i64() {
        C5DataValue::Integer(value.as_i64().unwrap())
      } else {
        C5DataValue::UInteger(value.as_u64().unwrap())
      }
    },
    serde_json::Value::Array(value) => C5DataValue::Array(value.into_iter().map(serde_json_val_to_c5_value).collect()),
    serde_json::Value::Object(_value) => {

      let map_result: Result<HashMap<String, serde_json::Value>, serde_json::Error> = serde_json::from_value(raw_value);

      if map_result.is_err() {
        C5DataValue::Null
      } else {
        let mut new_map = HashMap::new();
        for (key, value) in map_result.unwrap() {
          new_map.insert(key, serde_json_val_to_c5_value(value));
        }

        C5DataValue::Map(new_map)
      }
    },
  };
}