(attr: PunctuatedNestedMeta, item: Item)
| 101 | } |
| 102 | |
| 103 | pub(crate) fn impl_pyclass_impl(attr: PunctuatedNestedMeta, item: Item) -> Result<TokenStream> { |
| 104 | let mut context = ImplContext::default(); |
| 105 | let mut tokens = match item { |
| 106 | Item::Impl(mut imp) => { |
| 107 | extract_items_into_context(&mut context, imp.items.iter_mut()); |
| 108 | |
| 109 | let (impl_ty, payload_guess) = match imp.self_ty.as_ref() { |
| 110 | syn::Type::Path(syn::TypePath { |
| 111 | path: syn::Path { segments, .. }, |
| 112 | .. |
| 113 | }) if segments.len() == 1 => { |
| 114 | let segment = &segments[0]; |
| 115 | let payload_ty = if segment.ident == "Py" || segment.ident == "PyRef" { |
| 116 | match &segment.arguments { |
| 117 | syn::PathArguments::AngleBracketed( |
| 118 | syn::AngleBracketedGenericArguments { args, .. }, |
| 119 | ) if args.len() == 1 => { |
| 120 | let arg = &args[0]; |
| 121 | match arg { |
| 122 | syn::GenericArgument::Type(syn::Type::Path( |
| 123 | syn::TypePath { |
| 124 | path: syn::Path { segments, .. }, |
| 125 | .. |
| 126 | }, |
| 127 | )) if segments.len() == 1 => segments[0].ident.clone(), |
| 128 | _ => { |
| 129 | return Err(syn::Error::new_spanned( |
| 130 | segment, |
| 131 | "Py{Ref}<T> is expected but Py{Ref}<?> is found", |
| 132 | )); |
| 133 | } |
| 134 | } |
| 135 | } |
| 136 | _ => { |
| 137 | return Err(syn::Error::new_spanned( |
| 138 | segment, |
| 139 | "Py{Ref}<T> is expected but Py{Ref}? is found", |
| 140 | )); |
| 141 | } |
| 142 | } |
| 143 | } else { |
| 144 | if !matches!(segment.arguments, syn::PathArguments::None) { |
| 145 | return Err(syn::Error::new_spanned( |
| 146 | segment, |
| 147 | "PyImpl can only be implemented for Py{Ref}<T> or T", |
| 148 | )); |
| 149 | } |
| 150 | segment.ident.clone() |
| 151 | }; |
| 152 | (segment.ident.clone(), payload_ty) |
| 153 | } |
| 154 | _ => { |
| 155 | return Err(syn::Error::new_spanned( |
| 156 | imp.self_ty, |
| 157 | "PyImpl can only be implemented for Py{Ref}<T> or T", |
| 158 | )); |
| 159 | } |
| 160 | }; |
no test coverage detected