1use std::collections::HashMap;
2
3use crate::{Number, Value};
4
5pub trait Serialize {
6 fn serialize(&self) -> Value;
7}
8
9pub fn to_string<S: Serialize>(value: &S) -> String {
10 value.serialize().to_string()
11}
12
13impl Serialize for String {
14 fn serialize(&self) -> Value {
15 Value::String(self.clone())
16 }
17}
18
19impl<S: Serialize> Serialize for Option<S> {
20 fn serialize(&self) -> Value {
21 match self {
22 Some(value) => value.serialize(),
23 None => Value::Null,
24 }
25 }
26}
27
28impl Serialize for bool {
29 fn serialize(&self) -> Value {
30 Value::Boolean(*self)
31 }
32}
33
34impl Serialize for f64 {
35 fn serialize(&self) -> Value {
36 Value::Number(Number::Decimal(*self))
37 }
38}
39
40impl Serialize for u128 {
41 fn serialize(&self) -> Value {
42 Value::Number(Number::Integer(*self))
43 }
44}
45
46impl Serialize for i128 {
47 fn serialize(&self) -> Value {
48 Value::Number(Number::SignedInteger(*self))
49 }
50}
51
52impl Serialize for Vec<Value> {
53 fn serialize(&self) -> Value {
54 Value::Array(self.clone())
55 }
56}
57
58impl Serialize for HashMap<String, Value> {
59 fn serialize(&self) -> Value {
60 Value::Object(self.clone())
61 }
62}