#[macro_export]
macro_rules! cfg_client {
($($item:item)*) => {
$(
#[cfg(any(feature = "client", feature = "client-v2", feature = "client-v3"))]
$item
)*
};
}
#[macro_export]
macro_rules! cfg_anchor {
($($item:item)*) => {
$(
#[cfg(any(feature = "anchor"))]
$item
)*
};
}
#[macro_export]
macro_rules! build_ix_compat {
($program_id:expr, $accounts:expr, $params:expr) => {{
$crate::utils::build_ix($program_id, $accounts, $params)
}};
}
#[macro_export]
macro_rules! retry {
($attempts:expr, $delay_ms:expr, $expr:expr) => {{
async {
let mut attempts = $attempts;
loop {
match $expr {
Ok(val) => break Ok(val),
Err(_) if attempts > 1 => {
attempts -= 1;
tokio::time::sleep(tokio::time::Duration::from_millis($delay_ms)).await;
}
Err(e) => break Err(e),
}
}
}
}};
}
#[macro_export]
macro_rules! blocking_retry {
($attempts:expr, $delay_ms:expr, $expr:expr) => {{
let mut attempts = $attempts;
loop {
match $expr {
Ok(val) => break Ok(val),
Err(_) if attempts > 1 => {
attempts -= 1;
std::thread::sleep(tokio::time::Duration::from_millis($delay_ms));
}
Err(e) => break Err(e),
}
}
}};
}
#[cfg(feature = "anchor-lang")]
#[macro_export]
macro_rules! impl_account_deserialize {
($struct_name:ident) => {
impl anchor_lang::AccountDeserialize for $struct_name {
fn try_deserialize(buf: &mut &[u8]) -> Result<Self, anchor_lang::prelude::Error> {
use anchor_lang::prelude::ErrorCode;
use $crate::anchor_traits::Discriminator;
if buf.len() < $struct_name::discriminator().len() {
return Err(ErrorCode::AccountDiscriminatorMismatch.into());
}
let given_disc = &buf[..8];
if $struct_name::discriminator() != given_disc {
return Err(ErrorCode::AccountDiscriminatorMismatch.into());
}
if let Ok(ret) = Self::try_deserialize_unchecked(buf) {
return Ok(ret);
}
Err(ErrorCode::AccountDidNotDeserialize.into())
}
fn try_deserialize_unchecked(buf: &mut &[u8]) -> Result<Self, anchor_lang::prelude::Error> {
use anchor_lang::prelude::ErrorCode;
let data: &[u8] = &buf[8..];
bytemuck::try_from_bytes(data)
.map(|r: &Self| *r)
.map_err(|_| ErrorCode::AccountDidNotDeserialize.into())
}
}
};
}
#[cfg(not(feature = "anchor-lang"))]
#[macro_export]
macro_rules! impl_account_deserialize {
($struct_name:ident) => {};
}