lib.rs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. use anchor_lang::prelude::*;
  2. declare_id!("Generics111111111111111111111111111111111111");
  3. #[program]
  4. pub mod generics {
  5. use super::*;
  6. pub fn generic(
  7. ctx: Context<GenericCtx>,
  8. generic_field: GenericType<u32, u64, 10>,
  9. ) -> Result<()> {
  10. ctx.accounts.generic_acc.data = generic_field;
  11. Ok(())
  12. }
  13. }
  14. #[derive(Accounts)]
  15. pub struct GenericCtx<'info> {
  16. generic_acc: Account<'info, GenericAccount>,
  17. #[account(mut)]
  18. payer: Signer<'info>,
  19. system_program: Program<'info, System>,
  20. }
  21. #[account]
  22. pub struct GenericAccount {
  23. pub data: GenericType<u32, u64, 10>,
  24. }
  25. #[derive(AnchorSerialize, AnchorDeserialize, Clone)]
  26. pub struct GenericType<T, U, const N: usize>
  27. where
  28. T: AnchorSerialize + AnchorDeserialize,
  29. U: AnchorSerialize + AnchorDeserialize,
  30. {
  31. pub gen1: T,
  32. pub gen2: U,
  33. pub gen3: GenericNested<u32, U>,
  34. pub gen4: GenericNested<T, external::Baz>,
  35. pub gen5: GenericNested<T, U>,
  36. pub gen6: GenericNested<u32, u64>,
  37. pub gen7: GenericNested<T, GenericNested<T, U>>,
  38. pub arr: [u8; N],
  39. pub warr: WrappedU8Array<N>,
  40. pub warrval: WrappedU8Array<10>,
  41. pub enm1: GenericEnum<T, U, N>,
  42. pub enm2: GenericEnum<GenericNested<T, u64>, u32, 30>,
  43. }
  44. #[derive(AnchorSerialize, AnchorDeserialize, Clone, Copy, Default)]
  45. pub struct GenericNested<V, Z>
  46. where
  47. V: AnchorSerialize + AnchorDeserialize,
  48. Z: AnchorSerialize + AnchorDeserialize,
  49. {
  50. pub gen1: V,
  51. pub gen2: Z,
  52. }
  53. #[derive(AnchorSerialize, AnchorDeserialize, Clone)]
  54. pub struct WrappedU8Array<const N: usize>(u8);
  55. #[derive(AnchorSerialize, AnchorDeserialize, Clone)]
  56. pub enum GenericEnum<T, U, const N: usize>
  57. where
  58. T: AnchorSerialize + AnchorDeserialize,
  59. U: AnchorSerialize + AnchorDeserialize,
  60. {
  61. Unnamed(T, U),
  62. Named { gen1: T, gen2: U },
  63. Struct(GenericNested<T, U>),
  64. Arr([T; N]),
  65. }