Skip to main content

harmos_domain/operations/storage/
mod.rs

1/* ***
2 *
3 * Harmos
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * ***
8 */
9
10// The Closed Catalog Of Storage Operation Declarations. The Runtime Binds
11// Each Declaration To Its Storage Handler.
12
13/* === Modules === */
14
15mod abandon_file;
16mod append_file;
17mod capture_file;
18mod create_file;
19mod delete_file;
20mod finish_file;
21mod follow_file;
22mod follow_objects;
23mod follow_production;
24mod follow_records;
25mod follow_stream;
26mod hash_file;
27mod list_directory;
28mod query;
29mod read_file;
30mod resume_file;
31mod storage_status;
32mod watch_directory;
33mod write_file;
34mod write_objects;
35mod write_records;
36mod write_schema;
37mod write_streams;
38
39/* === Re-Exports === */
40
41pub use abandon_file::AbandonFile;
42pub use append_file::AppendFile;
43pub use capture_file::CaptureFile;
44pub use create_file::CreateFile;
45pub use delete_file::DeleteFile;
46pub use finish_file::FinishFile;
47pub use follow_file::FollowFile;
48pub use follow_objects::FollowObjects;
49pub use follow_production::FollowProduction;
50pub use follow_records::{FollowBoundaries, FollowRecords, Followed};
51pub use follow_stream::FollowStream;
52pub use hash_file::HashFile;
53pub use list_directory::ListDirectory;
54pub use query::Query;
55pub use read_file::ReadFile;
56pub use resume_file::ResumeFile;
57pub use storage_status::StorageStatus;
58pub use watch_directory::WatchDirectory;
59pub use write_file::WriteFile;
60pub use write_objects::WriteObjects;
61pub use write_records::WriteRecords;
62pub use write_schema::WriteSchema;
63pub use write_streams::WriteStreams;
64
65/* === Imports === */
66
67// Standard Library Imports
68use std::time::Duration;
69// Third Party Imports
70
71// Local Imports
72use crate::catalog::{Catalog, Contains, Member, Visitor};
73use crate::operations::{Backoff, Jitter, OperationPolicy, RestartPolicy, RetryPolicy};
74
75/* === Constants === */
76
77pub const POLICY: OperationPolicy = OperationPolicy {
78    timeout: Duration::from_secs(60),
79    attempt_timeout: Duration::from_secs(15),
80    retries: RetryPolicy::OnTransient {
81        max_retries: 3,
82        backoff: Backoff::Exponential {
83            initial: Duration::from_millis(250),
84            maximum: Duration::from_secs(2),
85            jitter: Jitter::Deterministic,
86        },
87    },
88    restart: RestartPolicy::Never,
89};
90
91pub const EVERY_SCHEMA: &str = "*";
92
93pub const STREAM_POLICY: OperationPolicy = OperationPolicy { attempt_timeout: POLICY.timeout, retries: RetryPolicy::Never, ..POLICY };
94
95pub const IO_POLICY: OperationPolicy = OperationPolicy {
96    timeout: crate::operations::UNBOUNDED,
97    attempt_timeout: crate::operations::UNBOUNDED,
98    retries: RetryPolicy::Never,
99    restart: RestartPolicy::Never,
100};
101
102/* === Macros === */
103
104macro_rules! catalog {
105    ($($leaf:ident),* $(,)?) => {
106        pub enum Operations { $($leaf($leaf)),* }
107        impl<V: Visitor $(+ Member<$leaf>)*> Catalog<V> for Operations {
108            type Entries = [V::Entry; [$(stringify!($leaf)),*].len()];
109            const ENTRIES: Self::Entries = [$(<V as Member<$leaf>>::ENTRY),*];
110        }
111        $(impl Contains<$leaf> for Operations {})*
112    };
113}
114
115catalog! {
116    ListDirectory,
117    WatchDirectory,
118    Query,
119    ReadFile,
120    HashFile,
121    CaptureFile,
122    FollowProduction,
123    FollowRecords,
124    FollowStream,
125    FollowFile,
126    StorageStatus,
127    ResumeFile,
128    CreateFile,
129    AppendFile,
130    FinishFile,
131    AbandonFile,
132    WriteRecords,
133    WriteStreams,
134    WriteFile,
135    DeleteFile,
136    WriteSchema,
137    WriteObjects,
138    FollowObjects,
139}
140
141/* === Type Aliases === */
142
143/* === Structs === */
144
145/* === Enums === */
146
147/* === Traits === */
148
149/* === Implementations === */
150
151/* === Public Functions === */
152
153/* === Private Functions === */
154
155/* === Tests === */