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
use std::borrow::Cow;

/// A specializable version of `std::string::ToString`.
pub trait Stringify {
    /// Returns the string representation of the give value as a byte vector.
    ///
    /// # Example
    ///
    /// ```
    /// # extern crate json_api;
    /// #
    /// # use json_api::value::Stringify;
    /// #
    /// # fn main() {
    /// use json_api::value::Stringify;
    /// assert_eq!(25.to_bytes(), vec![50, 53]);
    /// #
    /// # }
    /// ```
    fn to_bytes(&self) -> Vec<u8>;

    /// Returns the string representation of the given value.
    ///
    /// # Example
    ///
    /// ```
    /// # extern crate json_api;
    /// #
    /// # use json_api::value::Stringify;
    /// #
    /// # fn main() {
    /// use json_api::value::Stringify;
    /// assert_eq!(25.stringify(), "25");
    /// #
    /// # }
    /// ```
    fn stringify(&self) -> String {
        let bytes = self.to_bytes();
        unsafe { String::from_utf8_unchecked(bytes) }
    }
}

impl Stringify for String {
    fn to_bytes(&self) -> Vec<u8> {
        self.as_bytes().into()
    }

    fn stringify(&self) -> String {
        self.to_owned()
    }
}

impl<'a> Stringify for Cow<'a, str> {
    fn to_bytes(&self) -> Vec<u8> {
        self.as_bytes().into()
    }

    fn stringify(&self) -> String {
        self[..].to_owned()
    }
}

impl Stringify for str {
    fn to_bytes(&self) -> Vec<u8> {
        self.as_bytes().into()
    }

    fn stringify(&self) -> String {
        self.to_owned()
    }
}

macro_rules! impl_stringify_for_display {
    { $($ty:ty),* $(,)* } => {
        $(impl Stringify for $ty {
            fn to_bytes(&self) -> Vec<u8> {
                self.to_string().into_bytes()
            }

            fn stringify(&self) -> String {
                self.to_string()
            }
        })*
    }
}

impl_stringify_for_display!{
    f32, f64,
    i8, i16, i32, i64,
    u8, u16, u32, u64,
}