use quote::quote_spanned;
use syn::DeriveInput;
use syn::spanned::Spanned;
pub fn derive_starlark_pagable_via_pagable(
input: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
match derive_impl(input.into()) {
Ok(tokens) => tokens.into(),
Err(err) => err.to_compile_error().into(),
}
}
fn derive_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() =>
impl #impl_generics starlark::pagable::StarlarkSerialize for #name #type_generics #where_clause {
fn starlark_serialize(
&self,
ctx: &mut dyn starlark::pagable::StarlarkSerializeContext,
) -> starlark::Result<()> {
pagable::PagableSerialize::pagable_serialize(self, ctx.pagable())?;
Ok(())
}
}
impl #impl_generics starlark::pagable::StarlarkDeserialize for #name #type_generics #where_clause {
fn starlark_deserialize(
ctx: &mut dyn starlark::pagable::StarlarkDeserializeContext<'_>,
) -> starlark::Result<Self> {
Ok(<Self as pagable::PagableDeserialize>::pagable_deserialize(ctx.pagable())?)
}
}
})
}