Convert rmpv::Value back to serde_json::Value.
(val: &rmpv::Value)
| 127 | |
| 128 | /// Convert rmpv::Value back to serde_json::Value. |
| 129 | pub(crate) fn rmpv_to_json(val: &rmpv::Value) -> serde_json::Value { |
| 130 | match val { |
| 131 | rmpv::Value::Nil => serde_json::Value::Null, |
| 132 | rmpv::Value::Boolean(b) => serde_json::Value::Bool(*b), |
| 133 | rmpv::Value::Integer(i) => { |
| 134 | if let Some(n) = i.as_i64() { |
| 135 | serde_json::json!(n) |
| 136 | } else if let Some(n) = i.as_u64() { |
| 137 | serde_json::json!(n) |
| 138 | } else { |
| 139 | serde_json::Value::Null |
| 140 | } |
| 141 | } |
| 142 | rmpv::Value::F32(f) => serde_json::json!(*f), |
| 143 | rmpv::Value::F64(f) => serde_json::json!(*f), |
| 144 | rmpv::Value::String(s) => serde_json::Value::String(s.as_str().unwrap_or("").to_string()), |
| 145 | rmpv::Value::Binary(b) => serde_json::Value::String(base64_encode(b)), |
| 146 | rmpv::Value::Array(arr) => serde_json::Value::Array(arr.iter().map(rmpv_to_json).collect()), |
| 147 | rmpv::Value::Map(entries) => { |
| 148 | let mut obj = serde_json::Map::new(); |
| 149 | for (k, v) in entries { |
| 150 | let key = match k { |
| 151 | rmpv::Value::String(s) => s.as_str().unwrap_or("").to_string(), |
| 152 | other => format!("{other}"), |
| 153 | }; |
| 154 | obj.insert(key, rmpv_to_json(v)); |
| 155 | } |
| 156 | serde_json::Value::Object(obj) |
| 157 | } |
| 158 | rmpv::Value::Ext(_, _) => serde_json::Value::Null, |
| 159 | } |
| 160 | } |
| 161 | |
| 162 | fn base64_encode(data: &[u8]) -> String { |
| 163 | const CHARS: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |