vec.rs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. use crate::{Accounts, ToAccountInfos, ToAccountMetas};
  2. use solana_program::account_info::AccountInfo;
  3. use solana_program::instruction::AccountMeta;
  4. use solana_program::program_error::ProgramError;
  5. use solana_program::pubkey::Pubkey;
  6. impl<'info, T: ToAccountInfos<'info>> ToAccountInfos<'info> for Vec<T> {
  7. fn to_account_infos(&self) -> Vec<AccountInfo<'info>> {
  8. self.iter()
  9. .flat_map(|item| item.to_account_infos())
  10. .collect()
  11. }
  12. }
  13. impl<T: ToAccountMetas> ToAccountMetas for Vec<T> {
  14. fn to_account_metas(&self, is_signer: Option<bool>) -> Vec<AccountMeta> {
  15. self.iter()
  16. .flat_map(|item| (*item).to_account_metas(is_signer))
  17. .collect()
  18. }
  19. }
  20. impl<'info, T: Accounts<'info>> Accounts<'info> for Vec<T> {
  21. fn try_accounts(
  22. program_id: &Pubkey,
  23. accounts: &mut &[AccountInfo<'info>],
  24. ix_data: &[u8],
  25. ) -> Result<Self, ProgramError> {
  26. let mut vec: Vec<T> = Vec::new();
  27. T::try_accounts(program_id, accounts, ix_data).map(|item| vec.push(item))?;
  28. Ok(vec)
  29. }
  30. }
  31. #[cfg(test)]
  32. mod tests {
  33. use solana_program::clock::Epoch;
  34. use solana_program::pubkey::Pubkey;
  35. use super::*;
  36. #[derive(Accounts)]
  37. pub struct Test<'info> {
  38. #[account(signer)]
  39. test: AccountInfo<'info>,
  40. }
  41. #[test]
  42. fn test_accounts_trait_for_vec() {
  43. let program_id = Pubkey::default();
  44. let key = Pubkey::default();
  45. let mut lamports1 = 0;
  46. let mut data1 = vec![0; 10];
  47. let owner = Pubkey::default();
  48. let account1 = AccountInfo::new(
  49. &key,
  50. true,
  51. true,
  52. &mut lamports1,
  53. &mut data1,
  54. &owner,
  55. false,
  56. Epoch::default(),
  57. );
  58. let mut lamports2 = 0;
  59. let mut data2 = vec![0; 10];
  60. let account2 = AccountInfo::new(
  61. &key,
  62. true,
  63. true,
  64. &mut lamports2,
  65. &mut data2,
  66. &owner,
  67. false,
  68. Epoch::default(),
  69. );
  70. let mut accounts = &[account1, account2][..];
  71. let parsed_accounts = Vec::<Test>::try_accounts(&program_id, &mut accounts, &[]).unwrap();
  72. assert_eq!(accounts.len(), parsed_accounts.len());
  73. }
  74. #[test]
  75. #[should_panic]
  76. fn test_accounts_trait_for_vec_empty() {
  77. let program_id = Pubkey::default();
  78. let mut accounts = &[][..];
  79. Vec::<Test>::try_accounts(&program_id, &mut accounts, &[]).unwrap();
  80. }
  81. }