1use super::dynamic::Dynamic;
2use rune::{ToValue, Value};
3
4use std::sync::{Arc, RwLock};
6use smol_str::SmolStr;
7use std::collections::BTreeMap;
8
9impl From<Value> for Dynamic {
10 fn from(value: Value)-> Self {
11 match value {
12 Value::EmptyTuple | Value::EmptyStruct(_)=> Self::Null,
13 Value::Bool(b)=> Self::Bool(b),
14 Value::Byte(b)=> Self::Byte(b),
15 Value::Integer(i)=> Self::Int(i),
16 Value::Float(f)=> Self::Double(f),
17 Value::String(s)=> Self::String(Arc::new(SmolStr::new(s.borrow_ref().unwrap().as_str()))),
18 Value::Vec(v)=> {
19 let array: Vec<Dynamic> = v.borrow_ref().unwrap().iter().map(|v| Self::from(v.clone()) ).collect(); Self::Array(Arc::new(RwLock::new(array)))
21 },
22 Value::Object(o)=> {
23 let mut objec = BTreeMap::new();
24 o.borrow_ref().unwrap().iter().for_each(|(k, v)| {
25 objec.insert(SmolStr::from(k.as_str()), Self::from(v.clone()) );
26 });
27 Self::Object(Arc::new(RwLock::new(objec)))
28 },
29 Value::Bytes(b)=> Self::Bytes(Arc::new(b.borrow_ref().unwrap().to_vec())),
30 Value::Any(any_obj)=> if let Ok(obj) = any_obj.take_downcast::<Dynamic>() { obj } else { Dynamic::Null} _=> {
32 Self::Null
33 }
34 }
35 }
36}
37
38pub fn str_to_rune(s: &str)-> rune::alloc::String {
39 let mut v = rune::alloc::Vec::try_with_capacity(s.len()).unwrap();
40 v.try_extend_from_slice(s.as_bytes()).unwrap();
41 unsafe {rune::alloc::String::from_utf8_unchecked(v) }
42}
43
44pub fn bytes_to_rune(bytes: &[u8])-> rune::alloc::String {
45 unsafe {rune::alloc::String::from_utf8_unchecked(rune::alloc::Vec::try_from(bytes).unwrap()) }
46}
47
48impl From<Dynamic> for Value {
49 fn from(d: Dynamic) -> Self {
50 match d {
51 Dynamic::Null=> Value::EmptyTuple,
52 Dynamic::Bool(b)=> Value::Bool(b),
53 Dynamic::Byte(b)=> Value::Byte(b),
54 Dynamic::Int(i)=> Value::Integer(i),
55 Dynamic::UInt(u)=> Value::Integer(u as i64),
56 Dynamic::Float(f)=> Value::Float(f as f64),
57 Dynamic::Double(f)=> Value::Float(f),
58 Dynamic::String(s)=> str_to_rune(s.as_str()).to_value().unwrap(),
59 Dynamic::Array(array)=> {
60 let mut vec = rune::alloc::Vec::new();
61 while let Some(item) = array.read().unwrap().iter().next() {
62 vec.try_push(Self::from(item.clone())).unwrap();
63 }
64 vec.to_value().unwrap()
65 },
66 Dynamic::Object(object)=> {
67 let mut objs = rune::runtime::Object::default();
68 while let Some((k, v)) = object.read().unwrap().iter().next() {
69 objs.insert(str_to_rune(k.as_str()), Self::from(v.clone())).unwrap();
70 }
71 objs.to_value().unwrap()
72 },
73 Dynamic::Bytes(b)=> {
74 b.to_vec().to_value().unwrap()
75 },
76 }
77 }
78}
79
80use super::msgpack::MsgPack;
81use byteorder::{BigEndian, WriteBytesExt};
82
83impl MsgPack for Value {
84 fn encode(&self, buf: &mut Vec<u8>) {
85 match self {
86 Value::EmptyTuple | Value::EmptyStruct(_) => buf.push(0xc0),
87 Value::Bool(v) => buf.push(if *v { 0xc3 } else { 0xc2 }),
88 Value::Byte(b) => {
89 buf.push(0xcc);
90 buf.push(*b as u8);
91 }
92 Value::Integer(v) => v.encode(buf),
93 Value::Float(v) => {
94 buf.push(0xcb);
95 let int_value = unsafe { std::mem::transmute::<f64, u64>(*v) };
96 buf.write_u64::<BigEndian>(int_value).unwrap();
97 }
98 Value::String(s) => s.borrow_ref().unwrap().as_str().encode(buf),
99 Value::Bytes(v) => {
100 v.borrow_ref()
101 .map(|raw| {
102 let length = raw.len();
103 if length < 0x100 {
104 buf.push(0xc4);
105 buf.push(length as u8);
106 } else if length < 0x10000 {
107 buf.push(0xc5);
108 buf.write_u16::<BigEndian>(length as u16).unwrap();
109 } else {
110 buf.push(0xc6);
111 buf.write_u32::<BigEndian>(length as u32).unwrap();
112 }
113 buf.extend_from_slice(raw.as_slice());
114 })
115 .unwrap();
116 }
117 Value::Vec(v) => {
118 v.borrow_ref()
119 .map(|raw| {
120 let length = raw.len();
121 if length < 0x10 {
122 buf.push(0x90 | length as u8);
123 } else if length < 0x10000 {
124 buf.push(0xdc);
125 buf.write_u16::<BigEndian>(length as u16).unwrap();
126 } else {
127 buf.push(0xdd);
128 buf.write_u32::<BigEndian>(length as u32).unwrap();
129 }
130 raw.iter().for_each(|item| item.encode(buf));
131 })
132 .unwrap();
133 }
134 Value::Object(v) => {
135 v.borrow_ref()
136 .map(|raw| {
137 let length = raw.len();
138 if length < 16 {
139 buf.push(0x80 | length as u8);
140 } else if length <= 0x10000 {
141 buf.push(0xde);
142 buf.write_u16::<BigEndian>(length as u16).unwrap();
143 } else {
144 buf.push(0xdf);
145 buf.write_u32::<BigEndian>(length as u32).unwrap();
146 }
147 raw.iter().for_each(|(k, v)| {
148 k.as_str().encode(buf);
149 v.encode(buf);
150 });
151 })
152 .unwrap();
153 }
154 _ => {}
155 }
156 }
157}
158
159#[macro_export]
160macro_rules! object {
161 ($($k:expr => $v:expr), *) => {{
162 let mut obj = rune::runtime::Object::default();
163 $( let _ = obj.insert(rune::alloc::String::try_from($k).unwrap(), rune::runtime::Value::try_from($v)?); )*
164 obj.try_into().unwrap()
165 }};
166}
167
168use super::json::{FromJson, ToJson};
169use super::skip_white;
170impl FromJson for Value {
171 fn from_json(buf: &[u8])-> Result<(Self, usize)> {
172 let mut pos = skip_white(buf)?;
173 if buf[pos] == b'[' { pos += 1;
175 pos += skip_white(&buf[pos..])?;
176 let mut vec = rune::alloc::Vec::<Self>::new();
177 while buf[pos] != b']' {
178 let (item, size) = Self::from_json(&buf[pos..])?;
179 vec.try_push(item)?;
180 pos += size;
181 pos += skip_white(&buf[pos..])?;
182 if buf[pos] == b',' {
183 pos += 1;
184 pos += skip_white(&buf[pos..])?;
185 }
186 };
187 Ok((vec.to_value().unwrap(), pos + 1))
188 } else if buf[pos] == b'{' { pos += 1;
190 pos += skip_white(&buf[pos..])?;
191 let mut obj = rune::runtime::Object::new();
192 while buf[pos] != b'}' {
193 assert_err!(buf[pos] != b'"', anyhow!("need a string key"));
194 let (key, size) = Self::get_string(&buf[pos..])?;
195 pos += size;
196 pos += skip_white(&buf[pos..])?;
197 assert_err!(buf[pos] != b':', anyhow!("need a :"));
198 pos += 1;
199 pos += skip_white(&buf[pos..])?;
200 let (item, size) = Self::from_json(&buf[pos..])?;
201 obj.insert(str_to_rune(key.as_str()), item)?;
202 pos += size;
203 pos += skip_white(&buf[pos..])?;
204 if buf[pos] == b',' {
205 pos += 1;
206 pos += skip_white(&buf[pos..])?;
207 }
208 }
209 Ok((obj.to_value().unwrap(), pos + 1))
210 } else if buf[pos] == b'"' {
211 let (s, size) = Self::get_string(&buf[pos..])?;
212 Ok((str_to_rune(s.as_str()).to_value().into_result()?, size))
213 } else {
214 let (token, size) = Self::get_token(&buf[pos..])?;
215 if token == "true" {
216 Ok((Value::from(true), size))
217 } else if token == "false" {
218 Ok((Value::from(false), size))
219 } else if token == "null" {
220 Ok((Value::from(()), size))
221 } else if token.contains('.') {
222 let v = token.parse::<f64>()?;
223 Ok((Value::from(v), size))
224 } else {
225 let v = token.parse::<i64>()?;
226 Ok((Value::from(v), size))
227 }
228 }
229 }
230}
231
232use rune::runtime::{Bytes, Object};
233impl ToJson for Object {
234 fn to_json(&self, buf: &mut String) {
235 buf.push('{');
236 let mut once = super::ZOnce::new("", ",\n");
237 self.iter().for_each(|item| {
238 buf.push_str(once.take());
239 item.0.as_str().to_json(buf);
240 buf.push_str(": ");
241 item.1.to_json(buf);
242 });
243 buf.push('}');
244 }
245}
246
247impl ToJson for Value {
248 fn to_json(&self, buf: &mut String) {
249 match self {
250 Self::Bool(b) => if *b { buf.push_str("true") } else { buf.push_str("false") }
251 Self::Float(f) => buf.push_str(&f.to_string()),
252 Self::Integer(i) => i.to_json(buf),
253 Self::EmptyTuple | Value::EmptyStruct(_) => buf.push_str("null"),
254 Self::String(s) =>s.borrow_ref().unwrap().as_str().to_json(buf),
255 Self::Vec(v) => {
256 buf.push('[');
257 let mut once = super::ZOnce::new("", ",\n");
258 v.borrow_ref().map(|raw| raw.iter().for_each(|item| {
259 buf.push_str(once.take());
260 item.to_json(buf);
261 })).unwrap();
262 buf.push(']');
263 }
264 Self::Object(m) => m.borrow_ref().map(|o| o.to_json(buf)).unwrap(),
265 _ => {
266 buf.push_str("null");
267 }
268 }
269 }
270}
271
272use super::msgpack::MsgUnpack;
273use super::{assert_err, assert_ok};
274use anyhow::{Result, anyhow};
275
276fn slice_to_string(slice: &[u8]) -> Result<Value> {
277 let buf: rune::alloc::Vec<u8> = slice.try_into()?;
278 let s = rune::alloc::String::from_utf8(buf)?;
279 Ok(s.try_into()?)
280}
281
282fn slice_to_bytes(slice: &[u8]) -> Result<Value> {
283 Ok(Value::try_from(rune::runtime::Bytes::from_slice(slice)?)?)
284}
285
286fn vec_to_object(kvs: Vec<Value>) -> Result<Value> {
287 let mut obj = rune::runtime::Object::with_capacity(kvs.len())?;
288 let mut k: Option<Value> = None;
289 for kv in kvs {
290 if let Some(k) = k.take() {
291 obj.insert(k.into_string().unwrap().take()?, kv)?;
292 } else {
293 k = Some(kv);
294 }
295 }
296 Ok(obj.try_into()?)
297}
298
299use super::msgpack::{read_8, read_16, read_32, read_64};
300impl MsgUnpack for Value {
301 fn decode(buf: &[u8]) -> Result<(Self, usize)> {
302 assert_err!(buf.len() < 1, anyhow!("no data"));
303 let first_byte = buf[0];
304 assert_ok!(first_byte <= 0x7f, (Value::from(first_byte as i64), 1));
305 assert_ok!(first_byte >= 0xe0, (Value::from(first_byte as i64 - 256), 1));
306 if first_byte >= 0x80 && first_byte <= 0x8f {
307 let len = (first_byte & 0x0f) as usize;
308 let (value, size) = Self::decode_array(&buf[1..], len * 2)?;
309 return vec_to_object(value).map(|r| (r, 1 + size));
310 }
311 if first_byte >= 0x90 && first_byte <= 0x9f {
312 let len = (first_byte & 0x0f) as usize;
313 let (value, size) = Self::decode_array(&buf[1..], len)?;
314 return Ok((value.to_value().unwrap(), 1 + size));
315 }
316
317 if first_byte >= 0xa0 && first_byte <= 0xbf {
318 let len = (first_byte & 0x1f) as usize;
319 assert_err!(buf.len() < 1 + len, anyhow!("no data"));
320 return slice_to_string(&buf[1..1 + len]).map(|r| (r, 1 + len));
321 }
322
323 assert_ok!(first_byte == 0xc0, (().into(), 1));
324 assert_err!(first_byte == 0xc1, anyhow!("0xc1 never used"));
325 assert_ok!(first_byte == 0xc2, (false.into(), 1));
326 assert_ok!(first_byte == 0xc3, (true.into(), 1));
327
328 if first_byte == 0xc4 {
329 assert_err!(buf.len() < 2, anyhow!("no data"));
330 let len = read_8(&buf[1..]) as usize;
331 assert_err!(buf.len() < 2 + len, anyhow!("no data"));
332 return slice_to_bytes(&buf[2..2 + len]).map(|r| (r, 2 + len));
333 }
334
335 if first_byte == 0xc5 {
336 assert_err!(buf.len() < 3, anyhow!("no data"));
337 let len = read_16(&buf[1..]) as usize;
338 assert_err!(buf.len() < 2 + len, anyhow!("no data"));
339 return slice_to_bytes(&buf[3..3 + len]).map(|r| (r, 3 + len));
340 }
341
342 if first_byte == 0xc6 {
343 assert_err!(buf.len() < 5, anyhow!("no data"));
344 let len = read_32(&buf[1..]) as usize;
345 assert_err!(buf.len() < 5 + len, anyhow!("no data"));
346 return slice_to_bytes(&buf[5..5 + len]).map(|r| (r, 5 + len));
347 }
348
349 if first_byte == 0xc7 {
350 assert_err!(buf.len() < 3, anyhow!("no data"));
351 let len = read_8(&buf[1..]) as usize;
352 let _type_id = unsafe { std::mem::transmute::<u8, i8>(buf[2]) };
353 assert_err!(buf.len() < 3 + len, anyhow!("no data"));
354 return Ok((().into(), 3 + len)); }
357
358 if first_byte == 0xc8 {
359 assert_err!(buf.len() < 4, anyhow!("no data"));
360 let len = read_16(&buf[1..]) as usize;
361 let _type_id = unsafe { std::mem::transmute::<u8, i8>(buf[3]) };
362 assert_err!(buf.len() < 4 + len, anyhow!("no data"));
363 return Ok((().into(), 4 + len)); }
366
367 if first_byte == 0xc9 {
368 assert_err!(buf.len() < 6, anyhow!("no data"));
369 let len = read_32(&buf[1..]) as usize;
370 let _type_id = unsafe { std::mem::transmute::<u8, i8>(buf[5]) };
371 assert_err!(buf.len() < 6 + len, anyhow!("no data"));
372 return Ok((().into(), 6 + len)); }
375
376 if first_byte == 0xca {
377 assert_err!(buf.len() < 5, anyhow!("no data"));
378 let raw_value = read_32(&buf[1..]) as u32;
379 let value = unsafe { std::mem::transmute::<u32, f32>(raw_value) };
380 return Ok((Value::from(value as f64), 5));
381 }
382
383 if first_byte == 0xcb {
384 assert_err!(buf.len() < 9, anyhow!("no data"));
385 let raw_value = read_64(&buf[1..]);
386 let value = unsafe { std::mem::transmute::<u64, f64>(raw_value) };
387 return Ok((Value::from(value), 9));
388 }
389
390 if first_byte == 0xcc {
391 assert_err!(buf.len() < 2, anyhow!("no data"));
392 let value = read_8(&buf[1..]);
393 return Ok((Value::from(value as i64), 2));
394 }
395
396 if first_byte == 0xcd {
397 assert_err!(buf.len() < 3, anyhow!("no data"));
398 let value = read_16(&buf[1..]);
399 return Ok((Value::from(value as i64), 3));
400 }
401
402 if first_byte == 0xce {
403 assert_err!(buf.len() < 5, anyhow!("no data"));
404 let value = read_32(&buf[1..]);
405 return Ok((Value::from(value as i64), 5));
406 }
407
408 if first_byte == 0xcf {
409 assert_err!(buf.len() < 9, anyhow!("no data"));
410 let value = read_64(&buf[1..]);
411 return Ok((Value::from(value as i64), 9));
412 }
413
414 if first_byte == 0xd0 {
415 assert_err!(buf.len() < 2, anyhow!("no data"));
416 let raw_value = read_8(&buf[1..]) as i8;
417 let value = raw_value as i64; return Ok((Value::from(value), 2));
419 }
420
421 if first_byte == 0xd1 {
422 assert_err!(buf.len() < 3, anyhow!("no data"));
423 let raw_value = read_16(&buf[1..]);
424 let value = unsafe { std::mem::transmute::<u16, i16>(raw_value) } as i64;
425 return Ok((Value::from(value), 3));
426 }
427
428 if first_byte == 0xd2 {
429 assert_err!(buf.len() < 5, anyhow!("no data"));
430 let raw_value = read_32(&buf[1..]);
431 let value = unsafe { std::mem::transmute::<u32, i32>(raw_value) } as i64;
432 return Ok((Value::from(value), 5));
433 }
434
435 if first_byte == 0xd3 {
436 assert_err!(buf.len() < 9, anyhow!("no data"));
437 let raw_value = read_64(&buf[1..]);
438 let value = unsafe { std::mem::transmute::<u64, i64>(raw_value) };
439 return Ok((Value::from(value), 9));
440 }
441
442 if first_byte == 0xd4 {
443 assert_err!(buf.len() < 3, anyhow!("no data"));
444 let _type_id = unsafe { std::mem::transmute::<u8, i8>(buf[1]) };
445 return Ok((().into(), 3));
447 }
448
449 if first_byte == 0xd5 {
450 assert_err!(buf.len() < 4, anyhow!("no data"));
451 let _type_id = unsafe { std::mem::transmute::<u8, i8>(buf[1]) };
452 return Ok((().into(), 4));
454 }
455
456 if first_byte == 0xd6 {
457 assert_err!(buf.len() < 6, anyhow!("no data"));
458 let _type_id = unsafe { std::mem::transmute::<u8, i8>(buf[1]) };
459 return Ok((().into(), 6));
461 }
462
463 if first_byte == 0xd7 {
464 assert_err!(buf.len() < 10, anyhow!("no data"));
465 let _type_id = unsafe { std::mem::transmute::<u8, i8>(buf[1]) };
466 return Ok((().into(), 10));
468 }
469
470 if first_byte == 0xd8 {
471 assert_err!(buf.len() < 18, anyhow!("no data"));
472 let _type_id = unsafe { std::mem::transmute::<u8, i8>(buf[1]) };
473 return Ok((().into(), 18));
475 }
476
477 if first_byte == 0xd9 {
478 assert_err!(buf.len() < 2, anyhow!("no data"));
479 let len = read_8(&buf[1..]) as usize;
480 assert_err!(buf.len() < 2 + len, anyhow!("no data"));
481 return slice_to_string(&buf[2..2 + len]).map(|r| (r, 2 + len));
482 }
483
484 if first_byte == 0xda {
485 assert_err!(buf.len() < 3, anyhow!("no data"));
486 let len = read_16(&buf[1..]) as usize;
487 assert_err!(buf.len() < 3 + len, anyhow!("no data"));
488 return slice_to_string(&buf[3..3 + len]).map(|r| (r, 3 + len));
489 }
490
491 if first_byte == 0xdb {
492 assert_err!(buf.len() < 5, anyhow!("no data"));
493 let len = read_32(&buf[1..]) as usize;
494 assert_err!(buf.len() < 5 + len, anyhow!("no data"));
495 return slice_to_string(&buf[5..5 + len]).map(|r| (r, 5 + len));
496 }
497
498 if first_byte == 0xdc {
499 assert_err!(buf.len() < 3, anyhow!("no data"));
500 let len = read_16(&buf[1..]) as usize;
501 let (value, size) = Self::decode_array(&buf[3..], len)?;
502 return Ok((value.to_value().unwrap(), 3 + size));
503 }
504
505 if first_byte == 0xdd {
506 assert_err!(buf.len() < 5, anyhow!("no data"));
507 let len = read_32(&buf[1..]) as usize;
508 let (value, size) = Self::decode_array(&buf[5..], len)?;
509 return Ok((value.to_value().unwrap(), 5 + size));
510 }
511
512 if first_byte == 0xde {
513 assert_err!(buf.len() < 3, anyhow!("no data"));
514 let len = read_16(&buf[1..]) as usize;
515 let (value, size) = Self::decode_array(&buf[3..], len * 2)?;
516 return vec_to_object(value).map(|r| (r, 3 + size));
517 }
518
519 if first_byte == 0xdf {
520 assert_err!(buf.len() < 5, anyhow!("no data"));
521 let len = read_32(&buf[1..]) as usize;
522 let (value, size) = Self::decode_array(&buf[5..], len * 2)?;
523 return vec_to_object(value).map(|r| (r, 5 + size));
524 }
525 Err(anyhow!("error code {}", first_byte))
526 }
527}