From 632aefa250998e5ff85203574bde0d2237b9e739 Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Sat, 20 Nov 2021 18:14:06 +0300 Subject: [PATCH] lang: Add fmt::Debug to structs (#1043) --- lang/src/account.rs | 12 ++++++++++++ lang/src/context.rs | 11 +++++++++++ lang/src/loader.rs | 10 ++++++++++ lang/src/loader_account.rs | 10 ++++++++++ lang/src/program.rs | 10 ++++++++++ lang/src/signer.rs | 2 +- lang/src/system_account.rs | 2 +- lang/src/system_program.rs | 2 +- lang/src/sysvar.rs | 10 ++++++++++ lang/src/unchecked_account.rs | 2 +- 10 files changed, 67 insertions(+), 4 deletions(-) diff --git a/lang/src/account.rs b/lang/src/account.rs index 183aacc07..ec7af0150 100644 --- a/lang/src/account.rs +++ b/lang/src/account.rs @@ -5,6 +5,7 @@ use solana_program::entrypoint::ProgramResult; use solana_program::instruction::AccountMeta; use solana_program::program_error::ProgramError; use solana_program::pubkey::Pubkey; +use std::fmt; use std::ops::{Deref, DerefMut}; /// Account container that checks ownership on deserialization. @@ -14,6 +15,17 @@ pub struct Account<'info, T: AccountSerialize + AccountDeserialize + Owner + Clo info: AccountInfo<'info>, } +impl<'info, T: AccountSerialize + AccountDeserialize + Owner + Clone + fmt::Debug> fmt::Debug + for Account<'info, T> +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Account") + .field("account", &self.account) + .field("info", &self.info) + .finish() + } +} + impl<'a, T: AccountSerialize + AccountDeserialize + Owner + Clone> Account<'a, T> { fn new(info: AccountInfo<'a>, account: T) -> Account<'a, T> { Self { info, account } diff --git a/lang/src/context.rs b/lang/src/context.rs index ec35df31e..45fc28c9f 100644 --- a/lang/src/context.rs +++ b/lang/src/context.rs @@ -2,6 +2,7 @@ use crate::{Accounts, ToAccountInfos, ToAccountMetas}; use solana_program::account_info::AccountInfo; use solana_program::instruction::AccountMeta; use solana_program::pubkey::Pubkey; +use std::fmt; /// Provides non-argument inputs to the program. pub struct Context<'a, 'b, 'c, 'info, T> { @@ -14,6 +15,16 @@ pub struct Context<'a, 'b, 'c, 'info, T> { pub remaining_accounts: &'c [AccountInfo<'info>], } +impl<'a, 'b, 'c, 'info, T: fmt::Debug> fmt::Debug for Context<'a, 'b, 'c, 'info, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Context") + .field("program_id", &self.program_id) + .field("accounts", &self.accounts) + .field("remaining_accounts", &self.remaining_accounts) + .finish() + } +} + impl<'a, 'b, 'c, 'info, T: Accounts<'info>> Context<'a, 'b, 'c, 'info, T> { pub fn new( program_id: &'a Pubkey, diff --git a/lang/src/loader.rs b/lang/src/loader.rs index 2b3285ac6..f944f5687 100644 --- a/lang/src/loader.rs +++ b/lang/src/loader.rs @@ -9,6 +9,7 @@ use solana_program::instruction::AccountMeta; use solana_program::program_error::ProgramError; use solana_program::pubkey::Pubkey; use std::cell::{Ref, RefMut}; +use std::fmt; use std::io::Write; use std::marker::PhantomData; use std::ops::DerefMut; @@ -29,6 +30,15 @@ pub struct Loader<'info, T: ZeroCopy> { phantom: PhantomData<&'info T>, } +impl<'info, T: ZeroCopy + fmt::Debug> fmt::Debug for Loader<'info, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Loader") + .field("acc_info", &self.acc_info) + .field("phantom", &self.phantom) + .finish() + } +} + impl<'info, T: ZeroCopy> Loader<'info, T> { fn new(acc_info: AccountInfo<'info>) -> Loader<'info, T> { Self { diff --git a/lang/src/loader_account.rs b/lang/src/loader_account.rs index a48a04c07..6a867b831 100644 --- a/lang/src/loader_account.rs +++ b/lang/src/loader_account.rs @@ -9,6 +9,7 @@ use solana_program::instruction::AccountMeta; use solana_program::program_error::ProgramError; use solana_program::pubkey::Pubkey; use std::cell::{Ref, RefMut}; +use std::fmt; use std::io::Write; use std::marker::PhantomData; use std::ops::DerefMut; @@ -30,6 +31,15 @@ pub struct AccountLoader<'info, T: ZeroCopy + Owner> { phantom: PhantomData<&'info T>, } +impl<'info, T: ZeroCopy + Owner + fmt::Debug> fmt::Debug for AccountLoader<'info, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("AccountLoader") + .field("acc_info", &self.acc_info) + .field("phantom", &self.phantom) + .finish() + } +} + impl<'info, T: ZeroCopy + Owner> AccountLoader<'info, T> { fn new(acc_info: AccountInfo<'info>) -> AccountLoader<'info, T> { Self { diff --git a/lang/src/program.rs b/lang/src/program.rs index 1fe5c2287..73a02196c 100644 --- a/lang/src/program.rs +++ b/lang/src/program.rs @@ -4,6 +4,7 @@ use solana_program::account_info::AccountInfo; use solana_program::instruction::AccountMeta; use solana_program::program_error::ProgramError; use solana_program::pubkey::Pubkey; +use std::fmt; use std::ops::Deref; /// Account container that checks ownership on deserialization. @@ -13,6 +14,15 @@ pub struct Program<'info, T: Id + AccountDeserialize + Clone> { info: AccountInfo<'info>, } +impl<'info, T: Id + AccountDeserialize + Clone + fmt::Debug> fmt::Debug for Program<'info, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Program") + .field("account", &self._account) + .field("info", &self.info) + .finish() + } +} + impl<'a, T: Id + AccountDeserialize + Clone> Program<'a, T> { fn new(info: AccountInfo<'a>, _account: T) -> Program<'a, T> { Self { info, _account } diff --git a/lang/src/signer.rs b/lang/src/signer.rs index 33d5cf88f..635fd12a2 100644 --- a/lang/src/signer.rs +++ b/lang/src/signer.rs @@ -10,7 +10,7 @@ use std::ops::Deref; /// Type validating that the account signed the transaction. No other ownership /// or type checks are done. If this is used, one should not try to access the /// underlying account data. -#[derive(Clone)] +#[derive(Debug, Clone)] pub struct Signer<'info> { info: AccountInfo<'info>, } diff --git a/lang/src/system_account.rs b/lang/src/system_account.rs index bb0c08a53..889bde39e 100644 --- a/lang/src/system_account.rs +++ b/lang/src/system_account.rs @@ -8,7 +8,7 @@ use solana_program::pubkey::Pubkey; use solana_program::system_program; use std::ops::Deref; -#[derive(Clone)] +#[derive(Debug, Clone)] pub struct SystemAccount<'info> { info: AccountInfo<'info>, } diff --git a/lang/src/system_program.rs b/lang/src/system_program.rs index 30eed3b76..3ae37d60c 100644 --- a/lang/src/system_program.rs +++ b/lang/src/system_program.rs @@ -4,7 +4,7 @@ use solana_program::pubkey::Pubkey; pub use solana_program::system_program::ID; -#[derive(Clone)] +#[derive(Debug, Clone)] pub struct System; impl anchor_lang::AccountDeserialize for System { diff --git a/lang/src/sysvar.rs b/lang/src/sysvar.rs index 11bdafb6f..20a9e3e27 100644 --- a/lang/src/sysvar.rs +++ b/lang/src/sysvar.rs @@ -5,6 +5,7 @@ use solana_program::entrypoint::ProgramResult; use solana_program::instruction::AccountMeta; use solana_program::program_error::ProgramError; use solana_program::pubkey::Pubkey; +use std::fmt; use std::ops::{Deref, DerefMut}; /// Container for sysvars. @@ -13,6 +14,15 @@ pub struct Sysvar<'info, T: solana_program::sysvar::Sysvar> { account: T, } +impl<'info, T: solana_program::sysvar::Sysvar + fmt::Debug> fmt::Debug for Sysvar<'info, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Sysvar") + .field("info", &self.info) + .field("account", &self.account) + .finish() + } +} + impl<'info, T: solana_program::sysvar::Sysvar> Sysvar<'info, T> { pub fn from_account_info( acc_info: &AccountInfo<'info>, diff --git a/lang/src/unchecked_account.rs b/lang/src/unchecked_account.rs index 4b416b8ff..633b599fe 100644 --- a/lang/src/unchecked_account.rs +++ b/lang/src/unchecked_account.rs @@ -8,7 +8,7 @@ use solana_program::pubkey::Pubkey; use std::ops::Deref; /// Explicit wrapper for AccountInfo types. -#[derive(Clone)] +#[derive(Debug, Clone)] pub struct UncheckedAccount<'info>(AccountInfo<'info>); impl<'info> UncheckedAccount<'info> {