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 stored(self, position: StorageCursor) -> StoredRecord {
119 StoredRecord {
120 position,
121 schema: self.schema,
122 scope: self.scope,
123 item: self.item,
124 source: self.source,
125 source_time: self.source_time,
126 payload: self.payload,
127 }
128 }
129
130 pub fn borrowed(&self) -> RecordWrite<'_> {
131 RecordWrite {
132 schema: &self.schema,
133 scope: self.scope.as_ref(),
134 item: &self.item,
135 source: self.source.as_ref(),
136 source_time: self.source_time,
137 payload: &self.payload,
138 }
139 }
140}
141
142impl StreamInput {
143 pub fn borrowed(&self) -> StreamWrite<'_> {
144 StreamWrite { record: self.record.borrowed(), stream: &self.stream, sequence: self.sequence }
145 }
146}
147
148impl<T: MemorySize> MemorySize for StoredRecord<T> {
149 fn memory_size(&self) -> usize {
150 let dynamic = [
151 self.position.memory_size().saturating_sub(std::mem::size_of::<StorageCursor>()),
152 self.schema.memory_size().saturating_sub(std::mem::size_of::<SchemaKey>()),
153 self.scope.memory_size().saturating_sub(std::mem::size_of::<Option<Identifier>>()),
154 self.item.memory_size().saturating_sub(std::mem::size_of::<Identifier>()),
155 self.source.memory_size().saturating_sub(std::mem::size_of::<Option<Identifier>>()),
156 self.payload.memory_size().saturating_sub(std::mem::size_of::<T>()),
157 ];
158 dynamic.into_iter().fold(std::mem::size_of::<Self>(), usize::saturating_add)
159 }
160}
161
162impl<T: MemorySize> MemorySize for StoredRow<T> {
163 fn memory_size(&self) -> usize {
164 std::mem::size_of::<Self>()
165 .saturating_add(self.stream.memory_size().saturating_sub(std::mem::size_of::<Identifier>()))
166 .saturating_add(self.record.memory_size().saturating_sub(std::mem::size_of::<StoredRecord<T>>()))
167 }
168}
169
170