Skip to main content

harmos_domain/model/storage/
files.rs

1/* ***
2 *
3 * Harmos
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * ***
8 */
9
10/* === Modules === */
11
12pub mod codec;
13pub mod read;
14
15/* === Re-Exports === */
16
17pub use read::{ByteRange, FileBatch, FileCompletion};
18
19/* === Imports === */
20
21// Standard Library Imports
22
23// Third Party Imports
24use serde::{Deserialize, Serialize};
25// Local Imports
26use crate::model::storage::{StorageCursor, StoreHistory};
27use crate::{Identifier, MemorySize};
28
29/* === Constants === */
30
31/* === Macros === */
32
33/* === Type Aliases === */
34
35/* === Structs === */
36
37#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
38#[serde(deny_unknown_fields)]
39pub struct FileMetadata {
40    pub id: Identifier,
41    pub scope: Option<Identifier>,
42    pub media_type: String,
43    pub expected_length: Option<u64>,
44    pub expected_sha256: Option<[u8; 32]>,
45}
46
47#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
48#[serde(deny_unknown_fields)]
49pub struct StagedFile {
50    pub history: StoreHistory,
51    pub id: Identifier,
52}
53
54#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
55#[serde(deny_unknown_fields)]
56pub struct FileReference {
57    pub position: StorageCursor,
58    pub metadata: FileMetadata,
59    pub length: u64,
60    pub sha256: [u8; 32],
61}
62
63#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
64#[serde(deny_unknown_fields)]
65pub struct FileSession {
66    pub history: StoreHistory,
67    pub id: Identifier,
68    pub generation: u64,
69}
70
71#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
72pub struct FileProgress {
73    pub length: u64,
74    pub phase: FilePhase,
75}
76
77/* === Enums === */
78
79#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
80#[repr(u64)]
81pub enum FilePhase {
82    Producing = 0,
83    Finished = 1,
84    Abandoned = 2,
85}
86
87/* === Traits === */
88
89/* === Implementations === */
90
91impl MemorySize for FileMetadata {
92    fn memory_size(&self) -> usize {
93        std::mem::size_of::<Self>()
94            .saturating_add(self.id.memory_size().saturating_sub(std::mem::size_of::<Identifier>()))
95            .saturating_add(self.scope.memory_size().saturating_sub(std::mem::size_of::<Option<Identifier>>()))
96            .saturating_add(self.media_type.capacity())
97    }
98}
99
100impl MemorySize for FileReference {
101    fn memory_size(&self) -> usize {
102        std::mem::size_of::<Self>()
103            .saturating_add(self.position.memory_size().saturating_sub(std::mem::size_of::<StorageCursor>()))
104            .saturating_add(self.metadata.memory_size().saturating_sub(std::mem::size_of::<FileMetadata>()))
105    }
106}
107
108impl MemorySize for FileSession {
109    fn memory_size(&self) -> usize {
110        std::mem::size_of::<Self>()
111            .saturating_add(self.history.memory_size().saturating_sub(std::mem::size_of::<StoreHistory>()))
112            .saturating_add(self.id.memory_size().saturating_sub(std::mem::size_of::<Identifier>()))
113    }
114}
115
116impl MemorySize for StagedFile {
117    fn memory_size(&self) -> usize {
118        std::mem::size_of::<Self>()
119            .saturating_add(self.history.memory_size().saturating_sub(std::mem::size_of::<StoreHistory>()))
120            .saturating_add(self.id.memory_size().saturating_sub(std::mem::size_of::<Identifier>()))
121    }
122}
123
124impl MemorySize for FileProgress {
125    fn memory_size(&self) -> usize {
126        std::mem::size_of::<Self>()
127    }
128}
129
130/* === Public Functions === */
131
132/* === Private Functions === */
133
134/* === Tests === */