1use polyte_core::QueryBuilder;
2use reqwest::Client;
3use serde::{Deserialize, Serialize};
4use url::Url;
5
6use crate::{
7 request::{AuthMode, Request},
8 types::OrderSide,
9};
10
11#[derive(Clone)]
13pub struct Markets {
14 pub(crate) client: Client,
15 pub(crate) base_url: Url,
16 pub(crate) chain_id: u64,
17}
18
19impl Markets {
20 pub fn get(&self, condition_id: impl Into<String>) -> Request<Market> {
22 Request::get(
23 self.client.clone(),
24 self.base_url.clone(),
25 format!("/markets/{}", urlencoding::encode(&condition_id.into())),
26 AuthMode::None,
27 self.chain_id,
28 )
29 }
30
31 pub fn list(&self) -> Request<ListMarketsResponse> {
33 Request::get(
34 self.client.clone(),
35 self.base_url.clone(),
36 "/markets",
37 AuthMode::None,
38 self.chain_id,
39 )
40 }
41
42 pub fn order_book(&self, token_id: impl Into<String>) -> Request<OrderBook> {
44 Request::get(
45 self.client.clone(),
46 self.base_url.clone(),
47 "/book",
48 AuthMode::None,
49 self.chain_id,
50 )
51 .query("token_id", token_id.into())
52 }
53
54 pub fn price(&self, token_id: impl Into<String>, side: OrderSide) -> Request<PriceResponse> {
56 Request::get(
57 self.client.clone(),
58 self.base_url.clone(),
59 "/price",
60 AuthMode::None,
61 self.chain_id,
62 )
63 .query("token_id", token_id.into())
64 .query("side", side.to_string())
65 }
66
67 pub fn midpoint(&self, token_id: impl Into<String>) -> Request<MidpointResponse> {
69 Request::get(
70 self.client.clone(),
71 self.base_url.clone(),
72 "/midpoint",
73 AuthMode::None,
74 self.chain_id,
75 )
76 .query("token_id", token_id.into())
77 }
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize)]
82pub struct Market {
83 pub condition_id: String,
84 pub question_id: String,
85 pub tokens: Vec<MarketToken>,
86 pub rewards: Option<serde_json::Value>,
87 pub minimum_order_size: f64,
88 pub minimum_tick_size: f64,
89 pub description: String,
90 pub category: Option<String>,
91 pub end_date_iso: Option<String>,
92 pub question: String,
93 pub active: bool,
94 pub closed: bool,
95 pub archived: bool,
96 pub neg_risk: Option<bool>,
97 pub neg_risk_market_id: Option<String>,
98 pub enable_order_book: Option<bool>,
99}
100
101#[derive(Debug, Clone, Serialize, Deserialize)]
103pub struct ListMarketsResponse {
104 pub data: Vec<Market>,
105 pub next_cursor: Option<String>,
106}
107
108#[derive(Debug, Clone, Serialize, Deserialize)]
110pub struct MarketToken {
111 pub token_id: Option<String>,
112 pub outcome: String,
113 pub price: Option<f64>,
114 pub winner: Option<bool>,
115}
116
117#[derive(Debug, Clone, Serialize, Deserialize)]
119pub struct OrderLevel {
120 pub price: String,
121 pub size: String,
122}
123
124#[derive(Debug, Clone, Serialize, Deserialize)]
126pub struct OrderBook {
127 pub market: String,
128 pub asset_id: String,
129 pub bids: Vec<OrderLevel>,
130 pub asks: Vec<OrderLevel>,
131 pub timestamp: u64,
132 pub hash: String,
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize)]
137pub struct PriceResponse {
138 pub price: String,
139}
140
141#[derive(Debug, Clone, Serialize, Deserialize)]
143pub struct MidpointResponse {
144 pub mid: String,
145}