use quote::quote_spanned;
use syn::DeriveInput;
use syn::spanned::Spanned;
pub fn derive_starlark_pagable_panic(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
match derive_starlark_pagable_panic_impl(input.into()) {
Ok(tokens) => tokens.into(),
Err(err) => err.to_compile_error().into(),
}
}
fn derive_starlark_pagable_panic_impl(
input: proc_macro2::TokenStream,
) -> syn::Result<proc_macro2::TokenStream> {
let input: DeriveInput = syn::parse2(input)?;
let name = &input.ident;
let (impl_generics, type_generics, where_clause) = input.generics.split_for_impl();
Ok(quote_spanned! { input.span() =>
#[allow(unused)]
impl #impl_generics starlark::pagable::StarlarkSerialize for #name #type_generics #where_clause {
fn starlark_serialize(
&self,
_ctx: &mut dyn starlark::pagable::StarlarkSerializeContext,
) -> starlark::Result<()> {
panic!(
"StarlarkSerialize is not supported for `{}`",
::std::any::type_name::<Self>()
)
}
}
#[allow(unused)]
impl #impl_generics starlark::pagable::StarlarkDeserialize for #name #type_generics #where_clause {
fn starlark_deserialize(
_ctx: &mut dyn starlark::pagable::StarlarkDeserializeContext<'_>,
) -> starlark::Result<Self> {
panic!(
"StarlarkDeserialize is not supported for `{}`",
::std::any::type_name::<Self>()
)
}
}
})
}