use crate::{FormatAccess, Storage};
use std::fmt::{Debug, Display};
use std::ops::Deref;
use std::sync::Arc;
use tokio::sync::{OwnedRwLockReadGuard, RwLock};
pub trait WrappedFormat<S: Storage>: Debug + Display + Send + Sync {
fn wrap(inner: FormatAccess<S>) -> Self;
fn inner(&self) -> &FormatAccess<S>;
}
impl<
S: Storage + 'static,
D: Deref<Target = FormatAccess<S>> + Debug + Display + From<FormatAccess<S>> + Send + Sync,
> WrappedFormat<S> for D
{
fn wrap(inner: FormatAccess<S>) -> Self {
Self::from(inner)
}
fn inner(&self) -> &FormatAccess<S> {
self.deref()
}
}
impl<S: Storage> WrappedFormat<S> for FormatAccess<S> {
fn wrap(inner: FormatAccess<S>) -> Self {
inner
}
fn inner(&self) -> &FormatAccess<S> {
self
}
}
impl<S: Storage> WrappedFormat<S> for OwnedRwLockReadGuard<FormatAccess<S>> {
fn wrap(inner: FormatAccess<S>) -> Self {
Arc::new(RwLock::new(inner)).try_read_owned().unwrap()
}
fn inner(&self) -> &FormatAccess<S> {
self.deref()
}
}