@@ -15,12 +15,12 @@ use crate::{
15
15
SchemaSerializer ,
16
16
} ;
17
17
18
- #[ derive( Debug , Clone ) ]
18
+ #[ derive( Debug ) ]
19
19
pub struct NestedModelSerializer {
20
20
model : Py < PyType > ,
21
21
name : String ,
22
22
get_serializer : Py < PyAny > ,
23
- serializer : OnceLock < Py < SchemaSerializer > > ,
23
+ serializer : OnceLock < PyResult < Py < SchemaSerializer > > > ,
24
24
}
25
25
26
26
impl_py_gc_traverse ! ( NestedModelSerializer {
@@ -41,14 +41,14 @@ impl BuildSerializer for NestedModelSerializer {
41
41
42
42
let get_serializer = schema
43
43
. 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` " )
45
45
. unbind ( ) ;
46
46
47
47
let model = schema
48
48
. 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` " )
50
50
. downcast :: < PyType > ( )
51
- . expect ( "Invalid core schema for `nested-model` type" )
51
+ . expect ( "Invalid core schema for `nested-model` type, not a `PyType` " )
52
52
. clone ( ) ;
53
53
54
54
let name = model. getattr ( intern ! ( py, "__name__" ) ) ?. extract ( ) ?;
@@ -63,23 +63,21 @@ impl BuildSerializer for NestedModelSerializer {
63
63
}
64
64
65
65
impl NestedModelSerializer {
66
- fn nested_serializer < ' py > ( & self , py : Python < ' py > ) -> Py < SchemaSerializer > {
66
+ fn nested_serializer < ' py > ( & self , py : Python < ' py > ) -> PyResult < & Py < SchemaSerializer > > {
67
67
self . serializer
68
68
. get_or_init ( || {
69
- self . get_serializer
69
+ Ok ( self
70
+ . get_serializer
70
71
. 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 > ( ) ?
79
76
. clone ( )
80
- . unbind ( )
77
+ . unbind ( ) )
81
78
} )
82
- . clone ( )
79
+ . as_ref ( )
80
+ . map_err ( |e| e. clone_ref ( py) )
83
81
}
84
82
}
85
83
@@ -93,15 +91,15 @@ impl TypeSerializer for NestedModelSerializer {
93
91
) -> PyResult < PyObject > {
94
92
let mut guard = extra. recursion_guard ( value, self . model . as_ptr ( ) as usize ) ?;
95
93
96
- self . nested_serializer ( value. py ( ) )
94
+ self . nested_serializer ( value. py ( ) ) ?
97
95
. bind ( value. py ( ) )
98
96
. get ( )
99
97
. serializer
100
98
. to_python ( value, include, exclude, guard. state ( ) )
101
99
}
102
100
103
101
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 ( ) ) ?
105
103
. bind ( key. py ( ) )
106
104
. get ( )
107
105
. serializer
@@ -123,6 +121,8 @@ impl TypeSerializer for NestedModelSerializer {
123
121
. map_err ( py_err_se_err) ?;
124
122
125
123
self . nested_serializer ( value. py ( ) )
124
+ // FIXME(BoxyUwU): Don't unwrap this
125
+ . unwrap ( )
126
126
. bind ( value. py ( ) )
127
127
. get ( )
128
128
. serializer
0 commit comments