use anchor_lang::prelude::*; declare_id!("Generics111111111111111111111111111111111111"); #[program] pub mod generics { use super::*; pub fn generic( ctx: Context, generic_field: GenericType, ) -> Result<()> { ctx.accounts.generic_acc.data = generic_field; Ok(()) } } #[derive(Accounts)] pub struct GenericCtx<'info> { generic_acc: Account<'info, GenericAccount>, #[account(mut)] payer: Signer<'info>, system_program: Program<'info, System>, } #[account] pub struct GenericAccount { pub data: GenericType, } #[derive(AnchorSerialize, AnchorDeserialize, Clone)] pub struct GenericType where T: AnchorSerialize + AnchorDeserialize, U: AnchorSerialize + AnchorDeserialize, { pub gen1: T, pub gen2: U, pub gen3: GenericNested, pub gen4: GenericNested, pub gen5: GenericNested, pub gen6: GenericNested, pub gen7: GenericNested>, pub arr: [u8; N], pub warr: WrappedU8Array, pub warrval: WrappedU8Array<10>, pub enm1: GenericEnum, pub enm2: GenericEnum, u32, 30>, } #[derive(AnchorSerialize, AnchorDeserialize, Clone, Copy, Default)] pub struct GenericNested where V: AnchorSerialize + AnchorDeserialize, Z: AnchorSerialize + AnchorDeserialize, { pub gen1: V, pub gen2: Z, } #[derive(AnchorSerialize, AnchorDeserialize, Clone)] pub struct WrappedU8Array(u8); #[derive(AnchorSerialize, AnchorDeserialize, Clone)] pub enum GenericEnum where T: AnchorSerialize + AnchorDeserialize, U: AnchorSerialize + AnchorDeserialize, { Unnamed(T, U), Named { gen1: T, gen2: U }, Struct(GenericNested), Arr([T; N]), }