Skip to main content

rivet_logger/logger/
value.rs

1use std::collections::BTreeMap;
2use std::fmt::{Debug, Formatter};
3use std::sync::Arc;
4
5use time::OffsetDateTime;
6
7use super::BoxError;
8
9pub trait DeferredValue: Send + Sync {
10    fn resolve(&self) -> Result<LogValue, BoxError>;
11}
12
13impl<F> DeferredValue for F
14where
15    F: Fn() -> Result<LogValue, BoxError> + Send + Sync,
16{
17    fn resolve(&self) -> Result<LogValue, BoxError> {
18        (self)()
19    }
20}
21
22#[derive(Clone)]
23pub enum LogValue {
24    Null,
25    Bool(bool),
26    I64(i64),
27    U64(u64),
28    F64(f64),
29    String(String),
30    Array(Vec<LogValue>),
31    Map(BTreeMap<String, LogValue>),
32    DateTime(OffsetDateTime),
33    Deferred(Arc<dyn DeferredValue>),
34}
35
36impl Debug for LogValue {
37    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
38        match self {
39            Self::Null => f.write_str("Null"),
40            Self::Bool(value) => f.debug_tuple("Bool").field(value).finish(),
41            Self::I64(value) => f.debug_tuple("I64").field(value).finish(),
42            Self::U64(value) => f.debug_tuple("U64").field(value).finish(),
43            Self::F64(value) => f.debug_tuple("F64").field(value).finish(),
44            Self::String(value) => f.debug_tuple("String").field(value).finish(),
45            Self::Array(value) => f.debug_tuple("Array").field(value).finish(),
46            Self::Map(value) => f.debug_tuple("Map").field(value).finish(),
47            Self::DateTime(value) => f.debug_tuple("DateTime").field(value).finish(),
48            Self::Deferred(_) => f.write_str("Deferred(..)"),
49        }
50    }
51}
52
53impl From<()> for LogValue {
54    fn from(_: ()) -> Self {
55        Self::Null
56    }
57}
58
59impl From<bool> for LogValue {
60    fn from(value: bool) -> Self {
61        Self::Bool(value)
62    }
63}
64
65impl From<i64> for LogValue {
66    fn from(value: i64) -> Self {
67        Self::I64(value)
68    }
69}
70
71impl From<u64> for LogValue {
72    fn from(value: u64) -> Self {
73        Self::U64(value)
74    }
75}
76
77impl From<i32> for LogValue {
78    fn from(value: i32) -> Self {
79        Self::I64(i64::from(value))
80    }
81}
82
83impl From<u32> for LogValue {
84    fn from(value: u32) -> Self {
85        Self::U64(u64::from(value))
86    }
87}
88
89impl From<usize> for LogValue {
90    fn from(value: usize) -> Self {
91        Self::U64(value as u64)
92    }
93}
94
95impl From<f64> for LogValue {
96    fn from(value: f64) -> Self {
97        Self::F64(value)
98    }
99}
100
101impl From<String> for LogValue {
102    fn from(value: String) -> Self {
103        Self::String(value)
104    }
105}
106
107impl From<&str> for LogValue {
108    fn from(value: &str) -> Self {
109        Self::String(value.to_string())
110    }
111}
112
113impl From<Vec<LogValue>> for LogValue {
114    fn from(value: Vec<LogValue>) -> Self {
115        Self::Array(value)
116    }
117}
118
119impl From<BTreeMap<String, LogValue>> for LogValue {
120    fn from(value: BTreeMap<String, LogValue>) -> Self {
121        Self::Map(value)
122    }
123}
124
125impl From<OffsetDateTime> for LogValue {
126    fn from(value: OffsetDateTime) -> Self {
127        Self::DateTime(value)
128    }
129}