1
1
use std:: borrow:: Cow ;
2
2
use std:: fmt:: Debug ;
3
3
use std:: io:: { self , Write } ;
4
+ use std:: sync:: Arc ;
4
5
5
6
use pyo3:: exceptions:: PyTypeError ;
6
7
use pyo3:: prelude:: * ;
@@ -30,8 +31,8 @@ pub(crate) trait BuildSerializer: Sized {
30
31
fn build (
31
32
schema : & Bound < ' _ , PyDict > ,
32
33
config : Option < & Bound < ' _ , PyDict > > ,
33
- definitions : & mut DefinitionsBuilder < CombinedSerializer > ,
34
- ) -> PyResult < CombinedSerializer > ;
34
+ definitions : & mut DefinitionsBuilder < Arc < CombinedSerializer > > ,
35
+ ) -> PyResult < Arc < CombinedSerializer > > ;
35
36
}
36
37
37
38
/// Build the `CombinedSerializer` enum and implement a `find_serializer` method for it.
@@ -53,8 +54,8 @@ macro_rules! combined_serializer {
53
54
lookup_type: & str ,
54
55
schema: & Bound <' _, PyDict >,
55
56
config: Option <& Bound <' _, PyDict >>,
56
- definitions: & mut DefinitionsBuilder <CombinedSerializer >
57
- ) -> PyResult <CombinedSerializer > {
57
+ definitions: & mut DefinitionsBuilder <Arc < CombinedSerializer > >
58
+ ) -> PyResult <Arc < CombinedSerializer > > {
58
59
match lookup_type {
59
60
$(
60
61
<$b_serializer>:: EXPECTED_TYPE => match <$b_serializer>:: build( schema, config, definitions) {
@@ -156,17 +157,17 @@ impl CombinedSerializer {
156
157
pub fn build_base (
157
158
schema : & Bound < ' _ , PyDict > ,
158
159
config : Option < & Bound < ' _ , PyDict > > ,
159
- definitions : & mut DefinitionsBuilder < CombinedSerializer > ,
160
- ) -> PyResult < CombinedSerializer > {
160
+ definitions : & mut DefinitionsBuilder < Arc < CombinedSerializer > > ,
161
+ ) -> PyResult < Arc < CombinedSerializer > > {
161
162
Self :: _build ( schema, config, definitions, false )
162
163
}
163
164
164
165
fn _build (
165
166
schema : & Bound < ' _ , PyDict > ,
166
167
config : Option < & Bound < ' _ , PyDict > > ,
167
- definitions : & mut DefinitionsBuilder < CombinedSerializer > ,
168
+ definitions : & mut DefinitionsBuilder < Arc < CombinedSerializer > > ,
168
169
use_prebuilt : bool ,
169
- ) -> PyResult < CombinedSerializer > {
170
+ ) -> PyResult < Arc < CombinedSerializer > > {
170
171
let py = schema. py ( ) ;
171
172
let type_key = intern ! ( py, "type" ) ;
172
173
@@ -217,7 +218,7 @@ impl CombinedSerializer {
217
218
if let Ok ( Some ( prebuilt_serializer) ) =
218
219
super :: prebuilt:: PrebuiltSerializer :: try_get_from_schema ( type_, schema)
219
220
{
220
- return Ok ( prebuilt_serializer) ;
221
+ return Ok ( Arc :: new ( prebuilt_serializer) ) ;
221
222
}
222
223
}
223
224
@@ -300,8 +301,8 @@ impl BuildSerializer for CombinedSerializer {
300
301
fn build (
301
302
schema : & Bound < ' _ , PyDict > ,
302
303
config : Option < & Bound < ' _ , PyDict > > ,
303
- definitions : & mut DefinitionsBuilder < CombinedSerializer > ,
304
- ) -> PyResult < CombinedSerializer > {
304
+ definitions : & mut DefinitionsBuilder < Arc < CombinedSerializer > > ,
305
+ ) -> PyResult < Arc < CombinedSerializer > > {
305
306
Self :: _build ( schema, config, definitions, true )
306
307
}
307
308
}
0 commit comments