pub mod book_side_row;
pub mod event_heap_row;
pub mod market_row;
pub mod open_orders_account_row;
pub mod open_orders_indexer_row;
pub mod stub_oracle_row;
pub use self::{
book_side_row::*, event_heap_row::*, market_row::*, open_orders_account_row::*,
open_orders_indexer_row::*, stub_oracle_row::*,
};
use super::OpenbookV2Account;
pub struct OpenbookV2AccountsMigration;
impl sqlx_migrator::Migration<sqlx::Postgres> for OpenbookV2AccountsMigration {
fn app(&self) -> &str {
"openbook-v2"
}
fn name(&self) -> &str {
"openbook_v2_accounts"
}
fn operations(&self) -> Vec<Box<dyn sqlx_migrator::Operation<sqlx::Postgres>>> {
vec![
Box::new(BookSideMigrationOperation),
Box::new(EventHeapMigrationOperation),
Box::new(MarketMigrationOperation),
Box::new(OpenOrdersAccountMigrationOperation),
Box::new(OpenOrdersIndexerMigrationOperation),
Box::new(StubOracleMigrationOperation),
]
}
fn parents(&self) -> Vec<Box<dyn sqlx_migrator::Migration<sqlx::Postgres>>> {
vec![]
}
}
pub struct OpenbookV2AccountWithMetadata(
pub OpenbookV2Account,
pub carbon_core::account::AccountMetadata,
);
impl From<(OpenbookV2Account, carbon_core::account::AccountMetadata)>
for OpenbookV2AccountWithMetadata
{
fn from(value: (OpenbookV2Account, carbon_core::account::AccountMetadata)) -> Self {
OpenbookV2AccountWithMetadata(value.0, value.1)
}
}
#[async_trait::async_trait]
impl carbon_core::postgres::operations::Insert for OpenbookV2AccountWithMetadata {
async fn insert(&self, pool: &sqlx::PgPool) -> carbon_core::error::CarbonResult<()> {
let OpenbookV2AccountWithMetadata(account, metadata) = self;
match account {
OpenbookV2Account::Market(account) => {
let row = market_row::MarketRow::from_parts(*account.clone(), metadata.clone());
row.insert(pool).await?;
Ok(())
}
OpenbookV2Account::OpenOrdersAccount(account) => {
let row = open_orders_account_row::OpenOrdersAccountRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.insert(pool).await?;
Ok(())
}
OpenbookV2Account::OpenOrdersIndexer(account) => {
let row = open_orders_indexer_row::OpenOrdersIndexerRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.insert(pool).await?;
Ok(())
}
OpenbookV2Account::StubOracle(account) => {
let row =
stub_oracle_row::StubOracleRow::from_parts(*account.clone(), metadata.clone());
row.insert(pool).await?;
Ok(())
}
OpenbookV2Account::BookSide(account) => {
let row =
book_side_row::BookSideRow::from_parts(*account.clone(), metadata.clone());
row.insert(pool).await?;
Ok(())
}
OpenbookV2Account::EventHeap(account) => {
let row =
event_heap_row::EventHeapRow::from_parts(*account.clone(), metadata.clone());
row.insert(pool).await?;
Ok(())
}
}
}
}
#[async_trait::async_trait]
impl carbon_core::postgres::operations::Upsert for OpenbookV2AccountWithMetadata {
async fn upsert(&self, pool: &sqlx::PgPool) -> carbon_core::error::CarbonResult<()> {
let OpenbookV2AccountWithMetadata(account, metadata) = self;
match account {
OpenbookV2Account::Market(account) => {
let row = market_row::MarketRow::from_parts(*account.clone(), metadata.clone());
row.upsert(pool).await?;
Ok(())
}
OpenbookV2Account::OpenOrdersAccount(account) => {
let row = open_orders_account_row::OpenOrdersAccountRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.upsert(pool).await?;
Ok(())
}
OpenbookV2Account::OpenOrdersIndexer(account) => {
let row = open_orders_indexer_row::OpenOrdersIndexerRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.upsert(pool).await?;
Ok(())
}
OpenbookV2Account::StubOracle(account) => {
let row =
stub_oracle_row::StubOracleRow::from_parts(*account.clone(), metadata.clone());
row.upsert(pool).await?;
Ok(())
}
OpenbookV2Account::BookSide(account) => {
let row =
book_side_row::BookSideRow::from_parts(*account.clone(), metadata.clone());
row.upsert(pool).await?;
Ok(())
}
OpenbookV2Account::EventHeap(account) => {
let row =
event_heap_row::EventHeapRow::from_parts(*account.clone(), metadata.clone());
row.upsert(pool).await?;
Ok(())
}
}
}
}