use crate::{
folio::{AccountBalances, AccountPositions, AccountStatistics},
orderflow::{Cancel, Order},
symbology::{ExecutionInfo, ExecutionVenue, TradableProduct},
AccountId, AccountIdOrName, UserId,
};
use derive::grpc;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use uuid::Uuid;
pub mod cpty_id;
pub use cpty_id::CptyId;
#[grpc(package = "json.architect")]
#[grpc(service = "Cpty", name = "cpty", response = "CptyResponse", server_streaming)]
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "t", rename_all = "snake_case")]
pub enum CptyRequest {
#[schemars(title = "Login|CptyLoginRequest")]
Login(CptyLoginRequest),
#[schemars(title = "Logout|CptyLogoutRequest")]
Logout(CptyLogoutRequest),
#[schemars(title = "PlaceOrder|Order")]
PlaceOrder(Order),
#[schemars(title = "PlaceBatchOrder|BatchOrder")]
PlaceBatchOrder { orders: Vec<Order> },
#[schemars(title = "CancelOrder")]
CancelOrder { cancel: Cancel, original_order: Option<Order> },
#[schemars(title = "CancelAllOrders")]
CancelAllOrders {
cancel_id: Uuid,
trader: Option<UserId>,
account: Option<AccountId>,
},
#[schemars(title = "BatchCancelOrders")]
BatchCancelOrders { cancels: Vec<Cancel>, original_orders: Vec<Option<Order>> },
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct CptyLoginRequest {
pub trader: UserId,
pub account: AccountId,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct CptyLogoutRequest {}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "t", rename_all = "snake_case")]
pub enum CptyResponse {
#[serde(rename = "xs")]
#[schemars(title = "Symbology")]
Symbology {
execution_info:
BTreeMap<TradableProduct, BTreeMap<ExecutionVenue, ExecutionInfo>>,
},
#[serde(rename = "ro")]
#[schemars(title = "ReconcileOrder|Order")]
ReconcileOrder(Order),
#[serde(rename = "oo")]
#[schemars(title = "ReconcileOpenOrders")]
ReconcileOpenOrders {
orders: Vec<Order>,
snapshot_for_account: Option<AccountIdOrName>,
},
#[serde(rename = "as")]
#[schemars(title = "UpdateAccountSummary")]
UpdateAccountSummary {
account: AccountIdOrName,
timestamp: i64,
timestamp_ns: u32,
#[serde(default)]
balances: Option<AccountBalances>,
#[serde(default)]
positions: Option<AccountPositions>,
#[serde(default)]
statistics: Option<AccountStatistics>,
is_snapshot: bool,
},
}
#[grpc(package = "json.architect")]
#[grpc(service = "Cpty", name = "cpty_status", response = "CptyStatus")]
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct CptyStatusRequest {
pub kind: String,
pub instance: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct CptyStatus {
pub kind: String,
pub instance: Option<String>,
pub connected: bool,
pub logged_in: Option<bool>,
pub stale: bool,
pub connections: BTreeMap<String, ConnectionStatus>,
}
impl CptyStatus {
pub fn new(id: CptyId) -> Self {
Self {
kind: id.kind.to_string(),
instance: id.instance.map(|s| s.to_string()),
connected: true,
logged_in: None,
stale: false,
connections: BTreeMap::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct ConnectionStatus {
pub connected: bool,
pub logged_in: Option<bool>,
pub last_heartbeat: i64,
pub last_heartbeat_stale_threshold: i64,
}
#[grpc(package = "json.architect")]
#[grpc(service = "Cpty", name = "cptys", response = "CptysResponse")]
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct CptysRequest {}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct CptysResponse {
pub cptys: Vec<CptyStatus>,
}