serde_shape/impls/
result.rs1use alloc::vec;
16
17use crate::DefaultShape;
18use crate::DeserializeContainerAttributes;
19use crate::DeserializeDefinitionKind;
20use crate::DeserializeEnumShape;
21use crate::DeserializeFieldShape;
22use crate::DeserializeShape;
23use crate::DeserializeShapeContext;
24use crate::DeserializeVariantContent;
25use crate::DeserializeVariantShape;
26use crate::FieldMember;
27use crate::FieldWireShape;
28use crate::FieldsStyle;
29use crate::SerializeContainerAttributes;
30use crate::SerializeDefinitionKind;
31use crate::SerializeEnumShape;
32use crate::SerializeFieldShape;
33use crate::SerializeShape;
34use crate::SerializeShapeContext;
35use crate::SerializeVariantContent;
36use crate::SerializeVariantShape;
37use crate::ShapeRef;
38use crate::Tagging;
39use crate::TypeName;
40
41impl<T, E> SerializeShape for Result<T, E>
42where
43 T: SerializeShape,
44 E: SerializeShape,
45{
46 fn serialize_shape_in(context: &mut SerializeShapeContext) -> ShapeRef {
47 context.define_named_type(TypeName::of::<Self>("Result"), |context| {
48 SerializeDefinitionKind::Enum(SerializeEnumShape {
49 repr: Tagging::External,
50 variants: vec![
51 serialize_result_variant("Ok", T::serialize_shape_in(context)),
52 serialize_result_variant("Err", E::serialize_shape_in(context)),
53 ],
54 attributes: SerializeContainerAttributes::default(),
55 })
56 })
57 }
58}
59
60impl<T, E> DeserializeShape for Result<T, E>
61where
62 T: DeserializeShape,
63 E: DeserializeShape,
64{
65 fn deserialize_shape_in(context: &mut DeserializeShapeContext) -> ShapeRef {
66 context.define_named_type(TypeName::of::<Self>("Result"), |context| {
67 DeserializeDefinitionKind::Enum(DeserializeEnumShape {
68 repr: Tagging::External,
69 variants: vec![
70 deserialize_result_variant("Ok", T::deserialize_shape_in(context)),
71 deserialize_result_variant("Err", E::deserialize_shape_in(context)),
72 ],
73 attributes: DeserializeContainerAttributes::default(),
74 })
75 })
76 }
77}
78
79fn serialize_result_variant(name: &'static str, shape: ShapeRef) -> SerializeVariantShape {
80 SerializeVariantShape {
81 rust_name: name,
82 name,
83 description: None,
84 style: FieldsStyle::Newtype,
85 content: SerializeVariantContent::Fields(vec![SerializeFieldShape {
86 member: FieldMember::Unnamed(0),
87 name: "0",
88 description: None,
89 wire_shape: FieldWireShape::Value(shape),
90 skip_if: None,
91 }]),
92 untagged: false,
93 }
94}
95
96fn deserialize_result_variant(name: &'static str, shape: ShapeRef) -> DeserializeVariantShape {
97 DeserializeVariantShape {
98 rust_name: name,
99 name,
100 aliases: vec![name],
101 description: None,
102 style: FieldsStyle::Newtype,
103 content: DeserializeVariantContent::Fields(vec![DeserializeFieldShape {
104 member: FieldMember::Unnamed(0),
105 name: "0",
106 aliases: vec!["0"],
107 description: None,
108 wire_shape: FieldWireShape::Value(shape),
109 default: DefaultShape::None,
110 }]),
111 other: false,
112 untagged: false,
113 }
114}