@@ -15,12 +15,12 @@ use crate::{
1515 SchemaSerializer ,
1616} ;
1717
18- #[ derive( Debug , Clone ) ]
18+ #[ derive( Debug ) ]
1919pub struct NestedModelSerializer {
2020 model : Py < PyType > ,
2121 name : String ,
2222 get_serializer : Py < PyAny > ,
23- serializer : OnceLock < Py < SchemaSerializer > > ,
23+ serializer : OnceLock < PyResult < Py < SchemaSerializer > > > ,
2424}
2525
2626impl_py_gc_traverse ! ( NestedModelSerializer {
@@ -41,14 +41,14 @@ impl BuildSerializer for NestedModelSerializer {
4141
4242 let get_serializer = schema
4343 . get_item ( intern ! ( py, "get_info" ) ) ?
44- . expect ( "Invalid core schema for `nested-model` type" )
44+ . expect ( "Invalid core schema for `nested-model` type, no `get_info` " )
4545 . unbind ( ) ;
4646
4747 let model = schema
4848 . get_item ( intern ! ( py, "model" ) ) ?
49- . expect ( "Invalid core schema for `nested-model` type" )
49+ . expect ( "Invalid core schema for `nested-model` type, no `model` " )
5050 . downcast :: < PyType > ( )
51- . expect ( "Invalid core schema for `nested-model` type" )
51+ . expect ( "Invalid core schema for `nested-model` type, not a `PyType` " )
5252 . clone ( ) ;
5353
5454 let name = model. getattr ( intern ! ( py, "__name__" ) ) ?. extract ( ) ?;
@@ -63,23 +63,21 @@ impl BuildSerializer for NestedModelSerializer {
6363}
6464
6565impl NestedModelSerializer {
66- fn nested_serializer < ' py > ( & self , py : Python < ' py > ) -> Py < SchemaSerializer > {
66+ fn nested_serializer < ' py > ( & self , py : Python < ' py > ) -> PyResult < & Py < SchemaSerializer > > {
6767 self . serializer
6868 . get_or_init ( || {
69- self . get_serializer
69+ Ok ( self
70+ . get_serializer
7071 . bind ( py)
71- . call ( ( ) , None )
72- . expect ( "Invalid core schema for `nested-model`" )
73- . downcast :: < PyTuple > ( )
74- . expect ( "Invalid return value from `nested-model`'s `get_info` callable" )
75- . get_item ( 2 )
76- . expect ( "Invalid return value from `nested-model`'s `get_info` callable" )
77- . downcast :: < SchemaSerializer > ( )
78- . expect ( "Invalid return value from `nested-model`'s `get_info` callable" )
72+ . call ( ( ) , None ) ?
73+ . downcast :: < PyTuple > ( ) ?
74+ . get_item ( 2 ) ?
75+ . downcast :: < SchemaSerializer > ( ) ?
7976 . clone ( )
80- . unbind ( )
77+ . unbind ( ) )
8178 } )
82- . clone ( )
79+ . as_ref ( )
80+ . map_err ( |e| e. clone_ref ( py) )
8381 }
8482}
8583
@@ -93,15 +91,15 @@ impl TypeSerializer for NestedModelSerializer {
9391 ) -> PyResult < PyObject > {
9492 let mut guard = extra. recursion_guard ( value, self . model . as_ptr ( ) as usize ) ?;
9593
96- self . nested_serializer ( value. py ( ) )
94+ self . nested_serializer ( value. py ( ) ) ?
9795 . bind ( value. py ( ) )
9896 . get ( )
9997 . serializer
10098 . to_python ( value, include, exclude, guard. state ( ) )
10199 }
102100
103101 fn json_key < ' a > ( & self , key : & ' a Bound < ' _ , PyAny > , extra : & Extra ) -> PyResult < Cow < ' a , str > > {
104- self . nested_serializer ( key. py ( ) )
102+ self . nested_serializer ( key. py ( ) ) ?
105103 . bind ( key. py ( ) )
106104 . get ( )
107105 . serializer
@@ -123,6 +121,8 @@ impl TypeSerializer for NestedModelSerializer {
123121 . map_err ( py_err_se_err) ?;
124122
125123 self . nested_serializer ( value. py ( ) )
124+ // FIXME(BoxyUwU): Don't unwrap this
125+ . unwrap ( )
126126 . bind ( value. py ( ) )
127127 . get ( )
128128 . serializer
0 commit comments