pub mod mint_row;
pub mod multisig_row;
pub mod token_row;
pub use self::{mint_row::*, multisig_row::*, token_row::*};
use super::TokenProgramAccount;
pub struct TokenProgramAccountsMigration;
impl sqlx_migrator::Migration<sqlx::Postgres> for TokenProgramAccountsMigration {
fn app(&self) -> &str {
"token-program"
}
fn name(&self) -> &str {
"token_program_accounts"
}
fn operations(&self) -> Vec<Box<dyn sqlx_migrator::Operation<sqlx::Postgres>>> {
vec![
Box::new(MintMigrationOperation),
Box::new(MultisigMigrationOperation),
Box::new(TokenMigrationOperation),
]
}
fn parents(&self) -> Vec<Box<dyn sqlx_migrator::Migration<sqlx::Postgres>>> {
vec![]
}
}
pub struct TokenProgramAccountWithMetadata(
pub TokenProgramAccount,
pub carbon_core::account::AccountMetadata,
);
impl From<(TokenProgramAccount, carbon_core::account::AccountMetadata)>
for TokenProgramAccountWithMetadata
{
fn from(value: (TokenProgramAccount, carbon_core::account::AccountMetadata)) -> Self {
TokenProgramAccountWithMetadata(value.0, value.1)
}
}
#[async_trait::async_trait]
impl carbon_core::postgres::operations::Insert for TokenProgramAccountWithMetadata {
async fn insert(&self, pool: &sqlx::PgPool) -> carbon_core::error::CarbonResult<()> {
let TokenProgramAccountWithMetadata(account, metadata) = self;
match account {
TokenProgramAccount::Mint(account) => {
let row = mint_row::MintRow::from_parts(*account.clone(), metadata.clone());
row.insert(pool).await?;
Ok(())
}
TokenProgramAccount::Token(account) => {
let row = token_row::TokenRow::from_parts(*account.clone(), metadata.clone());
row.insert(pool).await?;
Ok(())
}
TokenProgramAccount::Multisig(account) => {
let row = multisig_row::MultisigRow::from_parts(*account.clone(), metadata.clone());
row.insert(pool).await?;
Ok(())
}
}
}
}
#[async_trait::async_trait]
impl carbon_core::postgres::operations::Upsert for TokenProgramAccountWithMetadata {
async fn upsert(&self, pool: &sqlx::PgPool) -> carbon_core::error::CarbonResult<()> {
let TokenProgramAccountWithMetadata(account, metadata) = self;
match account {
TokenProgramAccount::Mint(account) => {
let row = mint_row::MintRow::from_parts(*account.clone(), metadata.clone());
row.upsert(pool).await?;
Ok(())
}
TokenProgramAccount::Token(account) => {
let row = token_row::TokenRow::from_parts(*account.clone(), metadata.clone());
row.upsert(pool).await?;
Ok(())
}
TokenProgramAccount::Multisig(account) => {
let row = multisig_row::MultisigRow::from_parts(*account.clone(), metadata.clone());
row.upsert(pool).await?;
Ok(())
}
}
}
}