sark-gen 0.8.6

Sark proc-macro generators
Documentation
use proc_macro2::TokenStream;
use quote::quote;
use syn::{Error, Result, Type};

pub(super) struct RawBody;

impl RawBody {
    pub(super) fn field_expr(ty: &Type) -> Result<TokenStream> {
        let Type::Path(path) = ty else {
            return Err(Self::ty_error(ty));
        };
        let Some(seg) = path.path.segments.last() else {
            return Err(Self::ty_error(ty));
        };
        Ok(match seg.ident.to_string().as_str() {
            "Body" => quote!(raw_body),
            "LocalFrameBytes" => quote!(raw_body.into_local()),
            "Shared" => quote!(raw_body.into_bytes()),
            _ => return Err(Self::ty_error(ty)),
        })
    }

    fn ty_error(ty: &Type) -> Error {
        Error::new_spanned(
            ty,
            "#[raw_body] field type must be request::Body, LocalFrameBytes, or Shared",
        )
    }
}