harmos_domain/model/storage/
data.rs1pub mod codec;
13
14use std::time::SystemTime as Timestamp;
20
21use serde::{Deserialize, Serialize};
23
24use crate::model::storage::{SchemaKey, StorageCursor};
26use crate::{Identifier, MemorySize};
27
28#[derive(Clone, Debug, PartialEq, Eq)]
37pub struct RecordInput {
38 pub schema: SchemaKey,
39 pub scope: Option<Identifier>,
40 pub item: Identifier,
41 pub source: Option<Identifier>,
42 pub source_time: Option<Timestamp>,
43 pub payload: Vec<u8>,
44}
45
46#[derive(Clone, Debug, PartialEq, Eq)]
47pub struct StreamInput {
48 pub record: RecordInput,
49 pub stream: Identifier,
50 pub sequence: u64,
51}
52
53#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
54#[serde(deny_unknown_fields)]
55pub struct StoredRecord<T = Vec<u8>> {
56 pub position: StorageCursor,
57 pub schema: SchemaKey,
58 pub scope: Option<Identifier>,
59 pub item: Identifier,
60 pub source: Option<Identifier>,
61
62 #[serde(default, with = "crate::model::storage::time::optional")]
63 pub source_time: Option<Timestamp>,
64
65 pub payload: T,
66}
67
68#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
69#[serde(deny_unknown_fields)]
70pub struct StoredRow<T = Vec<u8>> {
71 pub record: StoredRecord<T>,
72 pub stream: Identifier,
73 pub sequence: u64,
74}
75
76#[derive(Clone, Copy, Debug, Serialize)]
77pub struct RecordWrite<'a> {
78 pub schema: &'a SchemaKey,
79 pub scope: Option<&'a Identifier>,
80 pub item: &'a Identifier,
81 pub source: Option<&'a Identifier>,
82 pub source_time: Option<Timestamp>,
83 pub payload: &'a [u8],
84}
85
86#[derive(Clone, Copy, Debug, Serialize)]
87pub struct StreamWrite<'a> {
88 pub stream: &'a Identifier,
89 pub sequence: u64,
90 pub record: RecordWrite<'a>,
91}
92
93impl MemorySize for RecordInput {
100 fn memory_size(&self) -> usize {
101 std::mem::size_of::<Self>() + self.schema.memory_size() - std::mem::size_of::<SchemaKey>() + self.scope.memory_size()
102 - std::mem::size_of::<Option<Identifier>>()
103 + self.item.memory_size()
104 - std::mem::size_of::<Identifier>()
105 + self.source.memory_size()
106 - std::mem::size_of::<Option<Identifier>>()
107 + self.payload.capacity()
108 }
109}
110impl MemorySize for StreamInput {
111 fn memory_size(&self) -> usize {
112 std::mem::size_of::<Self>() + self.record.memory_size() - std::mem::size_of::<RecordInput>() + self.stream.memory_size()
113 - std::mem::size_of::<Identifier>()
114 }
115}
116
117impl RecordInput {
118 pub fn borrowed(&self) -> RecordWrite<'_> {
119 RecordWrite {
120 schema: &self.schema,
121 scope: self.scope.as_ref(),
122 item: &self.item,
123 source: self.source.as_ref(),
124 source_time: self.source_time,
125 payload: &self.payload,
126 }
127 }
128}
129
130impl StreamInput {
131 pub fn borrowed(&self) -> StreamWrite<'_> {
132 StreamWrite { record: self.record.borrowed(), stream: &self.stream, sequence: self.sequence }
133 }
134}
135
136impl RecordWrite<'_> {
137 pub fn stored(&self, position: StorageCursor) -> StoredRecord {
138 StoredRecord {
139 position,
140 schema: self.schema.clone(),
141 scope: self.scope.cloned(),
142 item: self.item.clone(),
143 source: self.source.cloned(),
144 source_time: self.source_time,
145 payload: self.payload.to_vec(),
146 }
147 }
148}
149
150impl<T: MemorySize> MemorySize for StoredRecord<T> {
151 fn memory_size(&self) -> usize {
152 let dynamic = [
153 self.position.memory_size().saturating_sub(std::mem::size_of::<StorageCursor>()),
154 self.schema.memory_size().saturating_sub(std::mem::size_of::<SchemaKey>()),
155 self.scope.memory_size().saturating_sub(std::mem::size_of::<Option<Identifier>>()),
156 self.item.memory_size().saturating_sub(std::mem::size_of::<Identifier>()),
157 self.source.memory_size().saturating_sub(std::mem::size_of::<Option<Identifier>>()),
158 self.payload.memory_size().saturating_sub(std::mem::size_of::<T>()),
159 ];
160 dynamic.into_iter().fold(std::mem::size_of::<Self>(), usize::saturating_add)
161 }
162}
163
164impl<T: MemorySize> MemorySize for StoredRow<T> {
165 fn memory_size(&self) -> usize {
166 std::mem::size_of::<Self>()
167 .saturating_add(self.stream.memory_size().saturating_sub(std::mem::size_of::<Identifier>()))
168 .saturating_add(self.record.memory_size().saturating_sub(std::mem::size_of::<StoredRecord<T>>()))
169 }
170}
171
172