serde_valid_literal/
literal.rs

1#[derive(Debug, Clone, PartialEq, PartialOrd)]
2pub enum Literal {
3    Bool(bool),
4    Number(crate::Number),
5    String(&'static str),
6    Char(char),
7    Null,
8}
9
10impl std::convert::From<bool> for Literal {
11    fn from(item: bool) -> Self {
12        Literal::Bool(item)
13    }
14}
15
16impl<T> std::convert::From<T> for Literal
17where
18    T: Into<crate::Number>,
19{
20    fn from(item: T) -> Self {
21        Literal::Number(item.into())
22    }
23}
24
25impl std::convert::From<&'static str> for Literal {
26    fn from(item: &'static str) -> Self {
27        Literal::String(item)
28    }
29}
30
31impl std::convert::From<char> for Literal {
32    fn from(item: char) -> Self {
33        Literal::Char(item)
34    }
35}
36
37impl<T> std::convert::From<Option<T>> for Literal
38where
39    Literal: From<T>,
40{
41    fn from(item: Option<T>) -> Self {
42        match item {
43            Some(value) => std::convert::From::from(value),
44            None => Literal::Null,
45        }
46    }
47}
48
49impl std::fmt::Display for Literal {
50    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
51        match self {
52            Literal::Bool(value) => write!(f, "{value}"),
53            Literal::Number(value) => write!(f, "{value}"),
54            Literal::String(value) => write!(f, "{value}"),
55            Literal::Char(value) => write!(f, "{value}"),
56            Literal::Null => write!(f, "null"),
57        }
58    }
59}