Skip to main content

serde_shape/impls/
result.rs

1// Copyright 2026 FastLabs Developers
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use 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}