mod abandon_file;
mod append_file;
mod capture_file;
mod create_file;
mod delete_file;
mod finish_file;
mod follow_file;
mod follow_objects;
mod follow_production;
mod follow_records;
mod follow_stream;
mod hash_file;
mod list_directory;
mod query;
mod read_file;
mod resume_file;
mod storage_status;
mod watch_directory;
mod write_file;
mod write_objects;
mod write_records;
mod write_schema;
mod write_streams;
pub use harmos_domain::operations::storage::*;
use std::sync::Arc;
use crate::catalog::{Catalog, Member, Visitor};
use crate::operations::OperationManager;
use crate::storage::StorageManager;
use crate::{Result, operations::Lane};
const IO_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(30);
macro_rules! provider {
($($module:ident),* $(,)?) => {
impl<C: 'static, V> Catalog<V> for Provider<C>
where V: Visitor $(+ Member<$module::Handler<C>>)* {
type Entries = [V::Entry; [$(stringify!($module)),*].len()];
const ENTRIES: Self::Entries = [$(<V as Member<$module::Handler<C>>>::ENTRY),*];
}
};
}
provider! {
list_directory,
watch_directory,
query,
read_file,
hash_file,
capture_file,
follow_production,
follow_records,
follow_stream,
follow_file,
storage_status,
resume_file,
create_file,
append_file,
finish_file,
abandon_file,
write_records,
write_streams,
write_file,
delete_file,
write_schema,
write_objects,
follow_objects,
}
struct Provider<C>(std::marker::PhantomData<fn() -> C>);
pub fn register<C: 'static>(operations: &OperationManager, owner: &str, lane: impl Lane, storage: Arc<StorageManager<C>>) -> Result<()> {
operations.register_wire_operations::<Provider<C>, _>(owner, lane, storage)
}
fn output_timeout() -> crate::Error {
crate::Error::backend(
"storage output",
crate::BackendFailure::Transient,
std::io::Error::new(std::io::ErrorKind::TimedOut, "consumer delivery deadline exceeded"),
)
}
fn classify(error: &crate::Error) -> crate::operations::FailureKind {
let mut cause = error;
while let crate::Error::Persistence { source } = cause {
cause = source;
}
match cause {
crate::Error::Backend { kind: crate::BackendFailure::Transient, .. } => crate::operations::FailureKind::Transient,
_ => crate::operations::FailureKind::Permanent,
}
}