mirror of
https://github.com/martinvonz/jj.git
synced 2025-01-20 03:20:08 +00:00
templater: add helper methods to map property like Option/Result
These two are common when implementing methods. Fortunately, the "return-position impl Trait in traits" feature is stabilized in Rust 1.75.0, so we don't need another variant of TemplateFunction.
This commit is contained in:
parent
02a04d0d37
commit
a3d44485f4
1 changed files with 28 additions and 0 deletions
|
@ -330,6 +330,31 @@ tuple_impls! {
|
||||||
(0 T0, 1 T1, 2 T2, 3 T3)
|
(0 T0, 1 T1, 2 T2, 3 T3)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `TemplateProperty` adapters that are useful when implementing methods.
|
||||||
|
pub trait TemplatePropertyExt: TemplateProperty {
|
||||||
|
/// Translates to a property that will apply fallible `function` to an
|
||||||
|
/// extracted value.
|
||||||
|
fn and_then<O, F>(self, function: F) -> TemplateFunction<Self, F>
|
||||||
|
where
|
||||||
|
Self: Sized,
|
||||||
|
F: Fn(Self::Output) -> Result<O, TemplatePropertyError>,
|
||||||
|
{
|
||||||
|
TemplateFunction::new(self, function)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Translates to a property that will apply `function` to an extracted
|
||||||
|
/// value, leaving `Err` untouched.
|
||||||
|
fn map<O, F>(self, function: F) -> impl TemplateProperty<Output = O>
|
||||||
|
where
|
||||||
|
Self: Sized,
|
||||||
|
F: Fn(Self::Output) -> O,
|
||||||
|
{
|
||||||
|
TemplateFunction::new(self, move |value| Ok(function(value)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<P: TemplateProperty + ?Sized> TemplatePropertyExt for P {}
|
||||||
|
|
||||||
/// Adapter to drop template context.
|
/// Adapter to drop template context.
|
||||||
pub struct Literal<O>(pub O);
|
pub struct Literal<O>(pub O);
|
||||||
|
|
||||||
|
@ -525,6 +550,9 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Adapter to apply fallible `function` to the `property`.
|
||||||
|
///
|
||||||
|
/// This is usually created by `TemplatePropertyExt::and_then()`/`map()`.
|
||||||
pub struct TemplateFunction<P, F> {
|
pub struct TemplateFunction<P, F> {
|
||||||
pub property: P,
|
pub property: P,
|
||||||
pub function: F,
|
pub function: F,
|
||||||
|
|
Loading…
Reference in a new issue