1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
use std::borrow::Cow;
pub mod message_capnp {
include!("message_capnp.rs");
}
pub use uhlc;
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct Metadata<'a> {
metadata_version: u16,
timestamp: uhlc::Timestamp,
pub parameters: MetadataParameters<'a>,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, serde::Serialize, serde::Deserialize)]
pub struct MetadataParameters<'a> {
pub watermark: u64,
pub deadline: u64,
pub open_telemetry_context: Cow<'a, str>,
}
impl MetadataParameters<'_> {
pub fn into_owned(self) -> MetadataParameters<'static> {
MetadataParameters {
open_telemetry_context: self.open_telemetry_context.into_owned().into(),
..self
}
}
}
impl<'a> Metadata<'a> {
pub fn new(timestamp: uhlc::Timestamp) -> Self {
Self::from_parameters(timestamp, Default::default())
}
pub fn from_parameters(timestamp: uhlc::Timestamp, parameters: MetadataParameters<'a>) -> Self {
Self {
metadata_version: 0,
timestamp,
parameters,
}
}
pub fn serialize(&self) -> Result<Vec<u8>, capnp::Error> {
let Metadata {
metadata_version,
timestamp,
parameters:
MetadataParameters {
watermark,
deadline,
open_telemetry_context: otel_context,
},
} = self;
let mut meta_builder = capnp::message::Builder::new_default();
let mut metadata = meta_builder.init_root::<message_capnp::metadata::Builder>();
metadata.set_metadata_version(*metadata_version);
metadata.set_watermark(*watermark);
metadata.set_deadline(*deadline);
metadata.set_otel_context(otel_context);
metadata.set_timestamp(×tamp.to_string());
let mut buffer = Vec::new();
capnp::serialize::write_message(&mut buffer, &meta_builder)?;
Ok(buffer)
}
pub fn deserialize(raw: &mut &[u8]) -> Result<Self, capnp::Error> {
let deserialized = capnp::serialize::read_message_from_flat_slice(raw, Default::default())?
.into_typed::<message_capnp::metadata::Owned>();
let metadata_reader = deserialized.get()?;
let metadata = Metadata {
metadata_version: metadata_reader.get_metadata_version(),
timestamp: metadata_reader
.get_timestamp()?
.parse()
.map_err(|_| capnp::Error::failed("failed to parse timestamp".into()))?,
parameters: MetadataParameters {
watermark: metadata_reader.get_watermark(),
deadline: metadata_reader.get_deadline(),
open_telemetry_context: metadata_reader.get_otel_context()?.into(),
},
};
Ok(metadata.into_owned())
}
fn into_owned(self) -> Metadata<'static> {
Metadata {
parameters: self.parameters.into_owned(),
..self
}
}
pub fn timestamp(&self) -> uhlc::Timestamp {
self.timestamp
}
}