11use std:: borrow:: Cow ;
22use std:: fmt:: Debug ;
33use std:: io:: { self , Write } ;
4+ use std:: sync:: Arc ;
45
56use pyo3:: exceptions:: PyTypeError ;
67use pyo3:: prelude:: * ;
@@ -30,8 +31,8 @@ pub(crate) trait BuildSerializer: Sized {
3031 fn build (
3132 schema : & Bound < ' _ , PyDict > ,
3233 config : Option < & Bound < ' _ , PyDict > > ,
33- definitions : & mut DefinitionsBuilder < CombinedSerializer > ,
34- ) -> PyResult < CombinedSerializer > ;
34+ definitions : & mut DefinitionsBuilder < Arc < CombinedSerializer > > ,
35+ ) -> PyResult < Arc < CombinedSerializer > > ;
3536}
3637
3738/// Build the `CombinedSerializer` enum and implement a `find_serializer` method for it.
@@ -53,8 +54,8 @@ macro_rules! combined_serializer {
5354 lookup_type: & str ,
5455 schema: & Bound <' _, PyDict >,
5556 config: Option <& Bound <' _, PyDict >>,
56- definitions: & mut DefinitionsBuilder <CombinedSerializer >
57- ) -> PyResult <CombinedSerializer > {
57+ definitions: & mut DefinitionsBuilder <Arc < CombinedSerializer > >
58+ ) -> PyResult <Arc < CombinedSerializer > > {
5859 match lookup_type {
5960 $(
6061 <$b_serializer>:: EXPECTED_TYPE => match <$b_serializer>:: build( schema, config, definitions) {
@@ -156,17 +157,17 @@ impl CombinedSerializer {
156157 pub fn build_base (
157158 schema : & Bound < ' _ , PyDict > ,
158159 config : Option < & Bound < ' _ , PyDict > > ,
159- definitions : & mut DefinitionsBuilder < CombinedSerializer > ,
160- ) -> PyResult < CombinedSerializer > {
160+ definitions : & mut DefinitionsBuilder < Arc < CombinedSerializer > > ,
161+ ) -> PyResult < Arc < CombinedSerializer > > {
161162 Self :: _build ( schema, config, definitions, false )
162163 }
163164
164165 fn _build (
165166 schema : & Bound < ' _ , PyDict > ,
166167 config : Option < & Bound < ' _ , PyDict > > ,
167- definitions : & mut DefinitionsBuilder < CombinedSerializer > ,
168+ definitions : & mut DefinitionsBuilder < Arc < CombinedSerializer > > ,
168169 use_prebuilt : bool ,
169- ) -> PyResult < CombinedSerializer > {
170+ ) -> PyResult < Arc < CombinedSerializer > > {
170171 let py = schema. py ( ) ;
171172 let type_key = intern ! ( py, "type" ) ;
172173
@@ -217,7 +218,7 @@ impl CombinedSerializer {
217218 if let Ok ( Some ( prebuilt_serializer) ) =
218219 super :: prebuilt:: PrebuiltSerializer :: try_get_from_schema ( type_, schema)
219220 {
220- return Ok ( prebuilt_serializer) ;
221+ return Ok ( Arc :: new ( prebuilt_serializer) ) ;
221222 }
222223 }
223224
@@ -300,8 +301,8 @@ impl BuildSerializer for CombinedSerializer {
300301 fn build (
301302 schema : & Bound < ' _ , PyDict > ,
302303 config : Option < & Bound < ' _ , PyDict > > ,
303- definitions : & mut DefinitionsBuilder < CombinedSerializer > ,
304- ) -> PyResult < CombinedSerializer > {
304+ definitions : & mut DefinitionsBuilder < Arc < CombinedSerializer > > ,
305+ ) -> PyResult < Arc < CombinedSerializer > > {
305306 Self :: _build ( schema, config, definitions, true )
306307 }
307308}
0 commit comments