@@ -26,9 +26,11 @@ use crate::tags::PyTagSet;
2626
2727pub ( crate ) struct PyPutMode ( PutMode ) ;
2828
29- impl < ' py > FromPyObject < ' py > for PyPutMode {
30- fn extract_bound ( ob : & Bound < ' py , PyAny > ) -> PyResult < Self > {
31- if let Ok ( s) = ob. extract :: < PyBackedStr > ( ) {
29+ impl < ' py > FromPyObject < ' _ , ' py > for PyPutMode {
30+ type Error = PyErr ;
31+
32+ fn extract ( obj : Borrowed < ' _ , ' py , PyAny > ) -> Result < Self , Self :: Error > {
33+ if let Ok ( s) = obj. extract :: < PyBackedStr > ( ) {
3234 let s = s. to_ascii_lowercase ( ) ;
3335 match s. as_str ( ) {
3436 "create" => Ok ( Self ( PutMode :: Create ) ) ,
@@ -38,19 +40,21 @@ impl<'py> FromPyObject<'py> for PyPutMode {
3840 ) ) ) ,
3941 }
4042 } else {
41- let update_version = ob . extract :: < PyUpdateVersion > ( ) ?;
43+ let update_version = obj . extract :: < PyUpdateVersion > ( ) ?;
4244 Ok ( Self ( PutMode :: Update ( update_version. 0 ) ) )
4345 }
4446 }
4547}
4648
4749pub ( crate ) struct PyUpdateVersion ( UpdateVersion ) ;
4850
49- impl < ' py > FromPyObject < ' py > for PyUpdateVersion {
50- fn extract_bound ( ob : & Bound < ' py , PyAny > ) -> PyResult < Self > {
51+ impl < ' py > FromPyObject < ' _ , ' py > for PyUpdateVersion {
52+ type Error = PyErr ;
53+
54+ fn extract ( obj : Borrowed < ' _ , ' py , PyAny > ) -> Result < Self , Self :: Error > {
5155 // Update to use derive(FromPyObject) when default is implemented:
5256 // https://github.com/PyO3/pyo3/issues/4643
53- let dict = ob . extract :: < HashMap < String , Bound < PyAny > > > ( ) ?;
57+ let dict = obj . extract :: < HashMap < String , Bound < PyAny > > > ( ) ?;
5458 Ok ( Self ( UpdateVersion {
5559 e_tag : dict. get ( "e_tag" ) . map ( |x| x. extract ( ) ) . transpose ( ) ?,
5660 version : dict. get ( "version" ) . map ( |x| x. extract ( ) ) . transpose ( ) ?,
@@ -233,40 +237,48 @@ impl PutInput {
233237 }
234238}
235239
236- impl < ' py > FromPyObject < ' py > for PutInput {
237- fn extract_bound ( ob : & Bound < ' py , PyAny > ) -> PyResult < Self > {
238- let py = ob. py ( ) ;
239- if let Ok ( path) = ob. extract :: < PathBuf > ( ) {
240+ impl < ' py > FromPyObject < ' _ , ' py > for PutInput {
241+ type Error = PyErr ;
242+
243+ fn extract ( obj : Borrowed < ' _ , ' py , PyAny > ) -> Result < Self , Self :: Error > {
244+ let py = obj. py ( ) ;
245+ if let Ok ( path) = obj. extract :: < PathBuf > ( ) {
240246 Ok ( Self :: Pull ( PullSource :: File ( BufReader :: new ( File :: open (
241247 path,
242248 ) ?) ) ) )
243- } else if let Ok ( buffer) = ob . extract :: < PyBytes > ( ) {
249+ } else if let Ok ( buffer) = obj . extract :: < PyBytes > ( ) {
244250 Ok ( Self :: Pull ( PullSource :: Buffer ( Cursor :: new (
245251 buffer. into_inner ( ) ,
246252 ) ) ) )
247253 }
248254 // Check for file-like object
249- else if ob . hasattr ( intern ! ( py, "read" ) ) ? && ob . hasattr ( intern ! ( py, "seek" ) ) ? {
255+ else if obj . hasattr ( intern ! ( py, "read" ) ) ? && obj . hasattr ( intern ! ( py, "seek" ) ) ? {
250256 Ok ( Self :: Pull ( PullSource :: FileLike (
251- PyFileLikeObject :: py_with_requirements ( ob. clone ( ) , true , false , true , false ) ?,
257+ PyFileLikeObject :: py_with_requirements (
258+ obj. as_any ( ) . clone ( ) ,
259+ true ,
260+ false ,
261+ true ,
262+ false ,
263+ ) ?,
252264 ) ) )
253265 }
254266 // Ensure we check _first_ for an async generator before a sync one
255- else if ob . hasattr ( intern ! ( py, "__aiter__" ) ) ? {
267+ else if obj . hasattr ( intern ! ( py, "__aiter__" ) ) ? {
256268 Ok ( Self :: AsyncPush ( AsyncPushSource :: AsyncIterator (
257- ob . call_method0 ( intern ! ( py, "__aiter__" ) ) ?. unbind ( ) ,
269+ obj . call_method0 ( intern ! ( py, "__aiter__" ) ) ?. unbind ( ) ,
258270 ) ) )
259- } else if ob . hasattr ( intern ! ( py, "__anext__" ) ) ? {
271+ } else if obj . hasattr ( intern ! ( py, "__anext__" ) ) ? {
260272 Ok ( Self :: AsyncPush ( AsyncPushSource :: AsyncIterator (
261- ob . clone ( ) . unbind ( ) ,
273+ obj . as_unbound ( ) . clone_ref ( py ) ,
262274 ) ) )
263- } else if ob . hasattr ( intern ! ( py, "__iter__" ) ) ? {
275+ } else if obj . hasattr ( intern ! ( py, "__iter__" ) ) ? {
264276 Ok ( Self :: SyncPush ( SyncPushSource :: Iterator (
265- ob . call_method0 ( intern ! ( py, "__iter__" ) ) ?. unbind ( ) ,
277+ obj . call_method0 ( intern ! ( py, "__iter__" ) ) ?. unbind ( ) ,
266278 ) ) )
267- } else if ob . hasattr ( intern ! ( py, "__next__" ) ) ? {
279+ } else if obj . hasattr ( intern ! ( py, "__next__" ) ) ? {
268280 Ok ( Self :: SyncPush ( SyncPushSource :: Iterator (
269- ob . clone ( ) . unbind ( ) ,
281+ obj . as_unbound ( ) . clone_ref ( py ) ,
270282 ) ) )
271283 } else {
272284 Err ( PyValueError :: new_err ( "Unexpected input for PutInput" ) )
0 commit comments