protobuf/reflect/acc/v2/singular/
oneof.rs

1use crate::reflect::acc::v2::singular::SingularFieldAccessorHolder;
2use crate::reflect::acc::v2::AccessorV2;
3use crate::reflect::acc::FieldAccessor;
4use crate::reflect::runtime_types::RuntimeTypeWithDeref;
5use crate::reflect::ProtobufValue;
6use crate::EnumFull;
7use crate::EnumOrUnknown;
8use crate::MessageFull;
9
10/// Make accessor for `oneof` `message` field
11pub fn make_oneof_message_has_get_mut_set_accessor<M, F>(
12    name: &'static str,
13    has_field: fn(&M) -> bool,
14    get_field: for<'a> fn(&'a M) -> &'a F,
15    mut_field: for<'a> fn(&'a mut M) -> &'a mut F,
16    set_field: fn(&mut M, F),
17) -> FieldAccessor
18where
19    M: MessageFull,
20    F: MessageFull,
21{
22    FieldAccessor::new(
23        name,
24        AccessorV2::Singular(SingularFieldAccessorHolder::new_has_get_mut_set(
25            has_field, get_field, mut_field, set_field,
26        )),
27    )
28}
29
30/// Make accessor for `Copy` field
31pub fn make_oneof_copy_has_get_set_simpler_accessors<M, V>(
32    name: &'static str,
33    has: fn(&M) -> bool,
34    get: fn(&M) -> V,
35    set: fn(&mut M, V),
36) -> FieldAccessor
37where
38    M: MessageFull,
39    V: ProtobufValue + Copy,
40{
41    FieldAccessor::new(
42        name,
43        AccessorV2::Singular(SingularFieldAccessorHolder::new_has_get_set(has, get, set)),
44    )
45}
46
47/// Make accessor for `Copy` field
48pub fn make_oneof_enum_accessors<M, E>(
49    name: &'static str,
50    get: fn(&M) -> Option<EnumOrUnknown<E>>,
51    set: fn(&mut M, EnumOrUnknown<E>),
52    // TODO: remove this
53    _default_value: E,
54) -> FieldAccessor
55where
56    M: MessageFull,
57    E: EnumFull,
58{
59    FieldAccessor::new(
60        name,
61        AccessorV2::Singular(SingularFieldAccessorHolder::new_get_option_set_enum(
62            get, set,
63        )),
64    )
65}
66
67/// Make accessor for `oneof` field
68pub fn make_oneof_deref_has_get_set_simpler_accessor<M, F>(
69    name: &'static str,
70    has: fn(&M) -> bool,
71    get: for<'a> fn(&'a M) -> &'a <F::RuntimeType as RuntimeTypeWithDeref>::DerefTarget,
72    set: fn(&mut M, F),
73) -> FieldAccessor
74where
75    M: MessageFull + 'static,
76    F: ProtobufValue,
77    F::RuntimeType: RuntimeTypeWithDeref,
78{
79    FieldAccessor::new(
80        name,
81        AccessorV2::Singular(SingularFieldAccessorHolder::new_has_get_set_deref(
82            has, get, set,
83        )),
84    )
85}