rivet_logger/logger/
value.rs1use 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}