Skip to main content

cgp_field_extra/impls/
build_default.rs

1use cgp_field::impls::{CanBuildFrom, IsNothing, IsOptional, IsPresent};
2use cgp_field::traits::{FinalizeBuild, HasBuilder, TransformMap, TransformMapFields};
3
4pub trait CanBuildWithDefault<Source> {
5    fn build_with_default(source: Source) -> Self;
6}
7
8pub trait CanFinalizeWithDefault {
9    type Output;
10
11    fn finalize_with_default(self) -> Self::Output;
12}
13
14impl<Source, Target, Builder> CanBuildWithDefault<Source> for Target
15where
16    Target: HasBuilder<Builder = Builder>,
17    Builder: CanBuildFrom<Source>,
18    Builder::Output: CanFinalizeWithDefault<Output = Target>,
19{
20    fn build_with_default(source: Source) -> Target {
21        Target::builder().build_from(source).finalize_with_default()
22    }
23}
24
25impl<Builder, Output> CanFinalizeWithDefault for Builder
26where
27    Builder: TransformMapFields<TransformMapDefault, IsPresent>,
28    Builder::Output: FinalizeBuild<Target = Output>,
29{
30    type Output = Output;
31
32    fn finalize_with_default(self) -> Output {
33        self.transform_map_fields().finalize_build()
34    }
35}
36
37pub struct TransformMapDefault;
38
39impl<T> TransformMap<IsPresent, IsPresent, T> for TransformMapDefault {
40    fn transform_mapped(value: T) -> T {
41        value
42    }
43}
44
45impl<T: Default> TransformMap<IsNothing, IsPresent, T> for TransformMapDefault {
46    fn transform_mapped(_value: ()) -> T {
47        T::default()
48    }
49}
50
51impl<T: Default> TransformMap<IsOptional, IsPresent, T> for TransformMapDefault {
52    fn transform_mapped(value: Option<T>) -> T {
53        value.unwrap_or_default()
54    }
55}