use proc_macro2::TokenStream;
use quote::quote;
pub trait CodegenBackend {
fn serialize_derive(&self) -> TokenStream;
fn deserialize_derive(&self) -> TokenStream;
fn account_crate(&self) -> TokenStream;
fn account_info_trait(&self) -> TokenStream;
fn account_info_type(&self) -> TokenStream;
fn packed_accounts_type(&self) -> TokenStream;
fn account_meta_type(&self) -> TokenStream;
fn is_pinocchio(&self) -> bool;
fn sdk_error_type(&self) -> TokenStream;
fn program_error_type(&self) -> TokenStream;
fn borrow_error(&self) -> TokenStream;
}
pub struct AnchorBackend;
impl CodegenBackend for AnchorBackend {
fn serialize_derive(&self) -> TokenStream {
quote! { anchor_lang::AnchorSerialize }
}
fn deserialize_derive(&self) -> TokenStream {
quote! { anchor_lang::AnchorDeserialize }
}
fn account_crate(&self) -> TokenStream {
quote! { light_account }
}
fn account_info_trait(&self) -> TokenStream {
quote! { light_account::AccountInfoTrait }
}
fn account_info_type(&self) -> TokenStream {
quote! { anchor_lang::prelude::AccountInfo }
}
fn packed_accounts_type(&self) -> TokenStream {
quote! { light_account::interface::instruction::PackedAccounts<AM> }
}
fn account_meta_type(&self) -> TokenStream {
quote! { light_account::AccountMetaTrait }
}
fn is_pinocchio(&self) -> bool {
false
}
fn sdk_error_type(&self) -> TokenStream {
quote! { light_account::LightSdkTypesError }
}
fn program_error_type(&self) -> TokenStream {
quote! { anchor_lang::error::Error }
}
fn borrow_error(&self) -> TokenStream {
quote! { ? }
}
}
pub struct PinocchioBackend;
impl CodegenBackend for PinocchioBackend {
fn serialize_derive(&self) -> TokenStream {
quote! { borsh::BorshSerialize }
}
fn deserialize_derive(&self) -> TokenStream {
quote! { borsh::BorshDeserialize }
}
fn account_crate(&self) -> TokenStream {
quote! { light_account_pinocchio }
}
fn account_info_trait(&self) -> TokenStream {
quote! { light_account_pinocchio::light_account_checks::AccountInfoTrait }
}
fn account_info_type(&self) -> TokenStream {
quote! { pinocchio::account_info::AccountInfo }
}
fn packed_accounts_type(&self) -> TokenStream {
quote! { light_account_pinocchio::PackedAccounts }
}
fn account_meta_type(&self) -> TokenStream {
quote! { light_account_pinocchio::solana_instruction::AccountMeta }
}
fn is_pinocchio(&self) -> bool {
true
}
fn sdk_error_type(&self) -> TokenStream {
quote! { light_account_pinocchio::LightSdkTypesError }
}
fn program_error_type(&self) -> TokenStream {
quote! { pinocchio::program_error::ProgramError }
}
fn borrow_error(&self) -> TokenStream {
quote! { .map_err(|_| light_account_pinocchio::LightSdkTypesError::Borsh)? }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_anchor_backend_types() {
let backend = AnchorBackend;
assert!(!backend.is_pinocchio());
}
#[test]
fn test_pinocchio_backend_types() {
let backend = PinocchioBackend;
assert!(backend.is_pinocchio());
}
}