use {
crate::types::graphql::{
MarginModeGraphQL, OrderGraphQL, PerpPositionGraphQL, SpotPositionGraphQL,
},
carbon_core::graphql::primitives::{Pubkey, I64, U32, U64, U8},
juniper::GraphQLObject,
};
#[derive(Debug, Clone, GraphQLObject)]
#[graphql(name = "User")]
pub struct UserGraphQL {
pub account_metadata: crate::accounts::graphql::AccountMetadataGraphQL,
pub authority: Pubkey,
pub delegate: Pubkey,
pub name: Vec<U8>,
pub spot_positions: Vec<SpotPositionGraphQL>,
pub perp_positions: Vec<PerpPositionGraphQL>,
pub orders: Vec<OrderGraphQL>,
pub last_add_perp_lp_shares_ts: I64,
pub total_deposits: U64,
pub total_withdraws: U64,
pub total_social_loss: U64,
pub settled_perp_pnl: I64,
pub cumulative_spot_fees: I64,
pub cumulative_perp_funding: I64,
pub liquidation_margin_freed: U64,
pub last_active_slot: U64,
pub next_order_id: U32,
pub max_margin_ratio: U32,
pub next_liquidation_id: i32,
pub sub_account_id: i32,
pub status: U8,
pub is_margin_trading_enabled: bool,
pub idle: bool,
pub open_orders: U8,
pub has_open_order: bool,
pub open_auctions: U8,
pub has_open_auction: bool,
pub margin_mode: MarginModeGraphQL,
pub pool_id: U8,
pub padding1: Vec<U8>,
pub last_fuel_bonus_update_ts: U32,
pub padding: Vec<U8>,
}
impl TryFrom<crate::accounts::postgres::UserRow> for UserGraphQL {
type Error = carbon_core::error::Error;
fn try_from(row: crate::accounts::postgres::UserRow) -> Result<Self, Self::Error> {
Ok(Self {
account_metadata: row.account_metadata.into(),
authority: carbon_core::graphql::primitives::Pubkey(row.authority.0),
delegate: carbon_core::graphql::primitives::Pubkey(row.delegate.0),
name: row
.name
.into_iter()
.map(carbon_core::graphql::primitives::U8)
.collect(),
spot_positions: row
.spot_positions
.0
.into_iter()
.map(|item| item.into())
.collect(),
perp_positions: row
.perp_positions
.0
.into_iter()
.map(|item| item.into())
.collect(),
orders: row.orders.0.into_iter().map(|item| item.into()).collect(),
last_add_perp_lp_shares_ts: carbon_core::graphql::primitives::I64(
row.last_add_perp_lp_shares_ts,
),
total_deposits: carbon_core::graphql::primitives::U64(*row.total_deposits),
total_withdraws: carbon_core::graphql::primitives::U64(*row.total_withdraws),
total_social_loss: carbon_core::graphql::primitives::U64(*row.total_social_loss),
settled_perp_pnl: carbon_core::graphql::primitives::I64(row.settled_perp_pnl),
cumulative_spot_fees: carbon_core::graphql::primitives::I64(row.cumulative_spot_fees),
cumulative_perp_funding: carbon_core::graphql::primitives::I64(
row.cumulative_perp_funding,
),
liquidation_margin_freed: carbon_core::graphql::primitives::U64(
*row.liquidation_margin_freed,
),
last_active_slot: carbon_core::graphql::primitives::U64(*row.last_active_slot),
next_order_id: carbon_core::graphql::primitives::U32((*row.next_order_id) as u32),
max_margin_ratio: carbon_core::graphql::primitives::U32((*row.max_margin_ratio) as u32),
next_liquidation_id: *row.next_liquidation_id,
sub_account_id: *row.sub_account_id,
status: carbon_core::graphql::primitives::U8((*row.status) as u8),
is_margin_trading_enabled: row.is_margin_trading_enabled,
idle: row.idle,
open_orders: carbon_core::graphql::primitives::U8((*row.open_orders) as u8),
has_open_order: row.has_open_order,
open_auctions: carbon_core::graphql::primitives::U8((*row.open_auctions) as u8),
has_open_auction: row.has_open_auction,
margin_mode: row.margin_mode.0.into(),
pool_id: carbon_core::graphql::primitives::U8((*row.pool_id) as u8),
padding1: row
.padding1
.into_iter()
.map(carbon_core::graphql::primitives::U8)
.collect(),
last_fuel_bonus_update_ts: carbon_core::graphql::primitives::U32(
(*row.last_fuel_bonus_update_ts) as u32,
),
padding: row
.padding
.into_iter()
.map(carbon_core::graphql::primitives::U8)
.collect(),
})
}
}