use std::{error::Error, str::FromStr};
use crate::{
layer::Layer,
layers::{parsed::ParseFn, Cached, FileRead, OrDefault, Parsed},
};
pub trait LayerExt: Sized {
fn cached(self) -> Cached<Self>
where
Self: Layer,
{
Cached {
var: self,
cached: Default::default(),
}
}
fn file_read(self) -> FileRead<Self> {
FileRead { var: self }
}
fn parsed<T>(self, parse_fn: ParseFn<T>) -> Parsed<T, Self>
where
Self: Layer,
{
Parsed {
parse_fn,
var: self,
}
}
fn parsed_from_str<T>(self) -> Parsed<T, Self>
where
Self: Layer,
T: FromStr<Err: Error + 'static>,
{
self.parsed(|input| {
input
.parse::<T>()
.map_err(|e| Box::new(e) as Box<dyn Error>)
})
}
fn or_default_val(self, default_fn: fn() -> <Self as Layer>::Output) -> OrDefault<Self>
where
Self: Layer,
{
OrDefault {
var: self,
default_fn,
}
}
#[inline]
fn or_default(self) -> OrDefault<Self>
where
Self: Layer<Output: Default>,
{
self.or_default_val(Default::default)
}
}
impl<T: Layer> LayerExt for T {}