Skip to content

Commit 2a68955

Browse files
committed
feat: make log a separate event
1 parent 166226f commit 2a68955

File tree

9 files changed

+518
-184
lines changed

9 files changed

+518
-184
lines changed

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"rust-analyzer.cargo.allTargets": true,
3030
"rust-analyzer.check.features": "all",
3131
"rust-analyzer.check.allTargets": true,
32+
"rust-analyzer.cachePriming.enable": false,
3233
"editor.wordWrap": "on",
3334
"[python]": {
3435
"editor.defaultFormatter": "ms-python.black-formatter",
@@ -38,7 +39,7 @@
3839
}
3940
},
4041
"[typescript]": {
41-
"editor.defaultFormatter": "esbenp.prettier-vscode"
42+
"editor.defaultFormatter": "denoland.vscode-deno"
4243
},
4344
"languageToolLinter.languageTool.ignoredWordsInWorkspace": [
4445
"cockroachdb",

src/substantial/protocol/events.proto

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ message Save {
3131
}
3232
}
3333

34+
message Log {
35+
uint32 id = 1;
36+
string json_payload = 2;
37+
uint32 level = 3;
38+
}
39+
3440
message Sleep {
3541
uint32 id = 1;
3642
google.protobuf.Timestamp start = 2;
@@ -57,6 +63,7 @@ message Event {
5763
Sleep sleep = 12;
5864
Send send = 13;
5965
Stop stop = 14;
66+
Log log = 15;
6067
}
6168
};
6269

src/substantial/src/converters.rs

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,15 @@ pub enum SavedValue {
4444
},
4545
}
4646

47-
/// Bridge between protobuf types to Typescript
47+
#[derive(Serialize, Deserialize, Clone, Debug)]
48+
#[serde(tag = "type")]
49+
pub enum LogLevel {
50+
Warn,
51+
Info,
52+
Error,
53+
}
54+
55+
/// Bridge between protobuf types and Typescript
4856
#[derive(Serialize, Deserialize, Clone, Debug)]
4957
#[serde(tag = "type")]
5058
pub enum OperationEvent {
@@ -67,6 +75,11 @@ pub enum OperationEvent {
6775
Start {
6876
kwargs: HashMap<String, serde_json::Value>,
6977
},
78+
Log {
79+
id: u32,
80+
payload: serde_json::Value,
81+
level: LogLevel,
82+
},
7083
Compensate,
7184
}
7285

@@ -257,10 +270,20 @@ impl TryFrom<Event> for Operation {
257270
},
258271
});
259272
}
273+
Of::Log(log) => {
274+
return Ok(Operation {
275+
at,
276+
event: OperationEvent::Log {
277+
id: log.id,
278+
payload: serde_json::from_str(&log.json_payload)?,
279+
level: log.level.try_into()?,
280+
},
281+
})
282+
}
260283
}
261284
}
262285

263-
bail!("cannot convert from event {:?}", event)
286+
bail!("Fatal: cannot convert from event {:?}", event)
264287
}
265288
}
266289

@@ -269,7 +292,7 @@ impl TryFrom<Operation> for Event {
269292
fn try_from(operation: Operation) -> Result<Event> {
270293
use crate::protocol::events::event::Of;
271294
use crate::protocol::events::save::Of::{Failed, Resolved, Retry};
272-
use crate::protocol::events::{stop, Event, Save, Send, Sleep, Start, Stop};
295+
use crate::protocol::events::{stop, Event, Log, Save, Send, Sleep, Start, Stop};
273296

274297
let at = to_timestamp(&operation.at);
275298

@@ -377,6 +400,20 @@ impl TryFrom<Operation> for Event {
377400
..Default::default()
378401
})
379402
}
403+
OperationEvent::Log { id, payload, level } => {
404+
let log = Log {
405+
id,
406+
json_payload: serde_json::to_string(&payload)?,
407+
level: level.into(),
408+
..Default::default()
409+
};
410+
411+
Ok(Event {
412+
at: MessageField::some(at),
413+
of: Some(Of::Log(log)),
414+
..Default::default()
415+
})
416+
}
380417
OperationEvent::Compensate => {
381418
unimplemented!()
382419
}
@@ -444,6 +481,28 @@ impl TryFrom<MetadataEvent> for Metadata {
444481
}
445482
}
446483

484+
impl From<LogLevel> for u32 {
485+
fn from(value: LogLevel) -> Self {
486+
match value {
487+
LogLevel::Info => 0,
488+
LogLevel::Warn => 5,
489+
LogLevel::Error => 10,
490+
}
491+
}
492+
}
493+
494+
impl TryFrom<u32> for LogLevel {
495+
type Error = anyhow::Error;
496+
fn try_from(value: u32) -> anyhow::Result<Self> {
497+
Ok(match value {
498+
0 => LogLevel::Info,
499+
5 => LogLevel::Warn,
500+
10 => LogLevel::Error,
501+
_ => anyhow::bail!("Unknown log level {value:?}"),
502+
})
503+
}
504+
}
505+
447506
fn to_timestamp(datetime: &DateTime<Utc>) -> Timestamp {
448507
let mut timestamp = Timestamp::new();
449508
timestamp.seconds = datetime.timestamp();

0 commit comments

Comments
 (0)