1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
4#[serde(rename_all = "lowercase")]
5pub enum Level {
6 Info,
7 Warn,
8 Error,
9}
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
12#[serde(rename_all = "lowercase")]
13pub enum Kind {
14 Step,
16 Done,
18 Note,
20 Warning,
21 Error,
22 Progress,
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct Event {
28 pub timestamp: String,
29 pub level: Level,
30 pub kind: Kind,
31 pub message: String,
32 #[serde(skip_serializing_if = "Option::is_none")]
33 pub step: Option<String>,
34 #[serde(skip_serializing_if = "Option::is_none")]
36 pub job_id: Option<String>,
37 #[serde(skip_serializing_if = "Option::is_none")]
38 pub done: Option<u64>,
39 #[serde(skip_serializing_if = "Option::is_none")]
40 pub total: Option<u64>,
41 #[serde(skip_serializing_if = "Option::is_none")]
42 pub tokens_in: Option<u64>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub tokens_out: Option<u64>,
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub usd: Option<f64>,
47}
48
49impl Event {
50 pub fn new(level: Level, kind: Kind, message: impl Into<String>) -> Self {
51 Event {
52 timestamp: chrono::Utc::now().to_rfc3339_opts(chrono::SecondsFormat::Millis, true),
53 level,
54 kind,
55 message: message.into(),
56 step: None,
57 job_id: None,
58 done: None,
59 total: None,
60 tokens_in: None,
61 tokens_out: None,
62 usd: None,
63 }
64 }
65}