use crate::cli::common::write_json_output;
use clap::{Args, Subcommand};
use polymarket_hft::client::polymarket::clob::Client;
#[allow(clippy::enum_variant_names)] #[derive(Subcommand)]
pub enum ClobCommands {
GetOrderBook {
#[arg(short, long, required = true)]
token_id: String,
},
GetOrderBooks {
#[arg(short, long, required = true)]
token_id: Vec<String>,
#[arg(short, long)]
side: Option<String>,
},
GetMarketPrice {
#[arg(short, long, required = true)]
token_id: String,
#[arg(short, long, required = true)]
side: String,
},
GetMarketPrices,
GetMidpointPrice {
#[arg(short, long, required = true)]
token_id: String,
},
GetPriceHistory {
#[command(flatten)]
params: GetPriceHistoryArgs,
},
GetSpreads {
#[arg(short, long, required = true)]
token_id: Vec<String>,
},
}
#[derive(Args, Debug, Clone)]
pub struct GetPriceHistoryArgs {
#[arg(short, long, required = true)]
pub market: String,
#[arg(long)]
pub start_ts: Option<i64>,
#[arg(long)]
pub end_ts: Option<i64>,
#[arg(short, long)]
pub interval: Option<String>,
#[arg(short, long)]
pub fidelity: Option<i32>,
}
pub async fn handle(command: &ClobCommands) -> anyhow::Result<()> {
let client = Client::new();
match command {
ClobCommands::GetOrderBook { token_id } => {
let order_book = client.get_order_book(token_id).await?;
write_json_output(&order_book)?;
}
ClobCommands::GetOrderBooks { token_id, side } => {
let parsed_side = side
.as_ref()
.map(|s| s.parse::<polymarket_hft::client::polymarket::clob::Side>())
.transpose()
.map_err(|e| anyhow::anyhow!("invalid --side: {}", e))?;
let request: Vec<polymarket_hft::client::polymarket::clob::GetOrderBooksRequestItem> =
token_id
.iter()
.map(
|id| polymarket_hft::client::polymarket::clob::GetOrderBooksRequestItem {
token_id: id.clone(),
side: parsed_side,
},
)
.collect();
let order_books = client.get_order_books(&request).await?;
write_json_output(&order_books)?;
}
ClobCommands::GetMarketPrice { token_id, side } => {
let parsed_side = side
.parse::<polymarket_hft::client::polymarket::clob::Side>()
.map_err(|e| anyhow::anyhow!("invalid --side: {}", e))?;
let price = client.get_market_price(token_id, parsed_side).await?;
write_json_output(&price)?;
}
ClobCommands::GetMarketPrices => {
let prices = client.get_market_prices().await?;
write_json_output(&prices)?;
}
ClobCommands::GetMidpointPrice { token_id } => {
let midpoint = client.get_midpoint_price(token_id).await?;
write_json_output(&midpoint)?;
}
ClobCommands::GetPriceHistory { params } => {
let parsed_interval = params
.interval
.as_ref()
.map(|s| {
s.parse::<polymarket_hft::client::polymarket::clob::PriceHistoryInterval>()
})
.transpose()
.map_err(|e| anyhow::anyhow!("invalid --interval: {}", e))?;
let history = client
.get_price_history(
polymarket_hft::client::polymarket::clob::GetPriceHistoryRequest {
market: ¶ms.market,
start_ts: params.start_ts,
end_ts: params.end_ts,
interval: parsed_interval,
fidelity: params.fidelity,
},
)
.await?;
write_json_output(&history)?;
}
ClobCommands::GetSpreads { token_id } => {
let request: Vec<polymarket_hft::client::polymarket::clob::SpreadRequest> = token_id
.iter()
.map(
|id| polymarket_hft::client::polymarket::clob::SpreadRequest {
token_id: id.clone(),
side: None,
},
)
.collect();
let spreads = client.get_spreads(&request).await?;
write_json_output(&spreads)?;
}
}
Ok(())
}