aws_smithy_schema/schema/serde/serializer.rs
1/*
2 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3 * SPDX-License-Identifier: Apache-2.0
4 */
5
6//! Shape serialization interfaces for the Smithy data model.
7
8use crate::Schema;
9use aws_smithy_types::{BigDecimal, BigInteger, Blob, DateTime, Document};
10use std::error::Error;
11
12/// Serializes Smithy shapes to a target format.
13///
14/// This trait provides a format-agnostic API for serializing the Smithy data model.
15/// Implementations serialize each data type to the corresponding encoding in their
16/// serial format (e.g., Smithy integers and floats to JSON numbers).
17///
18/// The serializer accepts a schema along with the value to provide additional
19/// information about how to serialize the value (e.g., timestamp format, JSON name).
20///
21/// # Type Parameter
22///
23/// * `Output` - The serialization target type (e.g., `Vec<u8>`, `String`)
24///
25/// # Example
26///
27/// ```ignore
28/// let mut serializer = JsonSerializer::new();
29/// serializer.write_string(&STRING_SCHEMA, "hello")?;
30/// let json_bytes = serializer.finish()?;
31/// ```
32pub trait ShapeSerializer {
33 /// The serialization target type (e.g., `Vec<u8>`, `String`).
34 type Output;
35
36 /// The error type returned by serialization operations.
37 type Error: Error;
38
39 /// Finalizes the serialization and returns the serialized output.
40 ///
41 /// This method should be called after all values have been written.
42 /// It may perform final formatting, validation, or resource cleanup.
43 fn finish(self) -> Result<Self::Output, Self::Error>;
44
45 /// Writes a structure to the serializer.
46 ///
47 /// The structure serialization is driven by a callback that writes each member.
48 /// This avoids the need for trait objects while maintaining flexibility.
49 ///
50 /// # Arguments
51 ///
52 /// * `schema` - The schema of the structure being serialized
53 /// * `write_members` - Callback that writes the structure's members
54 fn write_struct<F>(&mut self, schema: &dyn Schema, write_members: F) -> Result<(), Self::Error>
55 where
56 F: FnOnce(&mut Self) -> Result<(), Self::Error>;
57
58 /// Writes a list to the serializer.
59 ///
60 /// The list serialization is driven by a callback that writes each element.
61 ///
62 /// # Arguments
63 ///
64 /// * `schema` - The schema of the list being serialized
65 /// * `write_elements` - Callback that writes the list elements
66 fn write_list<F>(&mut self, schema: &dyn Schema, write_elements: F) -> Result<(), Self::Error>
67 where
68 F: FnOnce(&mut Self) -> Result<(), Self::Error>;
69
70 /// Writes a map to the serializer.
71 ///
72 /// The map serialization is driven by a callback that writes each entry.
73 ///
74 /// # Arguments
75 ///
76 /// * `schema` - The schema of the map being serialized
77 /// * `write_entries` - Callback that writes the map entries
78 fn write_map<F>(&mut self, schema: &dyn Schema, write_entries: F) -> Result<(), Self::Error>
79 where
80 F: FnOnce(&mut Self) -> Result<(), Self::Error>;
81
82 /// Writes a boolean value.
83 fn write_boolean(&mut self, schema: &dyn Schema, value: bool) -> Result<(), Self::Error>;
84
85 /// Writes a byte (i8) value.
86 fn write_byte(&mut self, schema: &dyn Schema, value: i8) -> Result<(), Self::Error>;
87
88 /// Writes a short (i16) value.
89 fn write_short(&mut self, schema: &dyn Schema, value: i16) -> Result<(), Self::Error>;
90
91 /// Writes an integer (i32) value.
92 fn write_integer(&mut self, schema: &dyn Schema, value: i32) -> Result<(), Self::Error>;
93
94 /// Writes a long (i64) value.
95 fn write_long(&mut self, schema: &dyn Schema, value: i64) -> Result<(), Self::Error>;
96
97 /// Writes a float (f32) value.
98 fn write_float(&mut self, schema: &dyn Schema, value: f32) -> Result<(), Self::Error>;
99
100 /// Writes a double (f64) value.
101 fn write_double(&mut self, schema: &dyn Schema, value: f64) -> Result<(), Self::Error>;
102
103 /// Writes a big integer value.
104 fn write_big_integer(
105 &mut self,
106 schema: &dyn Schema,
107 value: &BigInteger,
108 ) -> Result<(), Self::Error>;
109
110 /// Writes a big decimal value.
111 fn write_big_decimal(
112 &mut self,
113 schema: &dyn Schema,
114 value: &BigDecimal,
115 ) -> Result<(), Self::Error>;
116
117 /// Writes a string value.
118 fn write_string(&mut self, schema: &dyn Schema, value: &str) -> Result<(), Self::Error>;
119
120 /// Writes a blob (byte array) value.
121 fn write_blob(&mut self, schema: &dyn Schema, value: &Blob) -> Result<(), Self::Error>;
122
123 /// Writes a timestamp value.
124 fn write_timestamp(&mut self, schema: &dyn Schema, value: &DateTime)
125 -> Result<(), Self::Error>;
126
127 /// Writes a document value.
128 fn write_document(&mut self, schema: &dyn Schema, value: &Document) -> Result<(), Self::Error>;
129
130 /// Writes a null value (for sparse collections).
131 fn write_null(&mut self, schema: &dyn Schema) -> Result<(), Self::Error>;
132}
133
134/// Trait for structures that can be serialized.
135///
136/// This trait is implemented by generated structure types to enable
137/// schema-based serialization.
138///
139/// # Example
140///
141/// ```ignore
142/// impl SerializableStruct for MyStruct {
143/// fn serialize<S: ShapeSerializer>(&self, serializer: &mut S) -> Result<(), S::Error> {
144/// serializer.write_struct(&Self::SCHEMA, |ser| {
145/// ser.write_string(&FIELD1_SCHEMA, &self.field1)?;
146/// ser.write_integer(&FIELD2_SCHEMA, self.field2)?;
147/// Ok(())
148/// })
149/// }
150/// }
151/// ```
152pub trait SerializableStruct {
153 /// Serializes this structure using the provided serializer.
154 ///
155 /// # Arguments
156 ///
157 /// * `serializer` - The serializer to write to
158 fn serialize<S: ShapeSerializer>(&self, serializer: &mut S) -> Result<(), S::Error>;
159}