cgp_field_extra/impls/
build_default.rs1use 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}