1use reqwest::Client;
2use serde::{Deserialize, Serialize};
3use url::Url;
4
5use crate::{
6 request::{AuthMode, QueryBuilder, Request},
7 types::OrderSide,
8};
9
10#[derive(Clone)]
12pub struct Markets {
13 pub(crate) client: Client,
14 pub(crate) base_url: Url,
15 pub(crate) chain_id: u64,
16}
17
18impl Markets {
19 pub fn get(&self, condition_id: impl Into<String>) -> Request<Market> {
21 Request::get(
22 self.client.clone(),
23 self.base_url.clone(),
24 format!("/markets/{}", urlencoding::encode(&condition_id.into())),
25 AuthMode::None,
26 self.chain_id,
27 )
28 }
29
30 pub fn list(&self) -> Request<ListMarketsResponse> {
32 Request::get(
33 self.client.clone(),
34 self.base_url.clone(),
35 "/markets",
36 AuthMode::None,
37 self.chain_id,
38 )
39 }
40
41 pub fn order_book(&self, token_id: impl Into<String>) -> Request<OrderBook> {
43 Request::get(
44 self.client.clone(),
45 self.base_url.clone(),
46 "/book",
47 AuthMode::None,
48 self.chain_id,
49 )
50 .query("token_id", token_id.into())
51 }
52
53 pub fn price(&self, token_id: impl Into<String>, side: OrderSide) -> Request<PriceResponse> {
55 Request::get(
56 self.client.clone(),
57 self.base_url.clone(),
58 "/price",
59 AuthMode::None,
60 self.chain_id,
61 )
62 .query("token_id", token_id.into())
63 .query("side", side.to_string())
64 }
65
66 pub fn midpoint(&self, token_id: impl Into<String>) -> Request<MidpointResponse> {
68 Request::get(
69 self.client.clone(),
70 self.base_url.clone(),
71 "/midpoint",
72 AuthMode::None,
73 self.chain_id,
74 )
75 .query("token_id", token_id.into())
76 }
77}
78
79#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct Market {
82 pub condition_id: String,
83 pub question_id: String,
84 pub tokens: Vec<MarketToken>,
85 #[serde(default)]
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 #[serde(default)]
97 pub neg_risk: bool,
98 #[serde(default)]
99 pub neg_risk_market_id: Option<String>,
100 #[serde(default)]
101 pub enable_order_book: bool,
102}
103
104#[derive(Debug, Clone, Serialize, Deserialize)]
106pub struct ListMarketsResponse {
107 pub data: Vec<Market>,
108 #[serde(default)]
109 pub next_cursor: Option<String>,
110}
111
112#[derive(Debug, Clone, Serialize, Deserialize)]
114pub struct MarketToken {
115 #[serde(default)]
116 pub token_id: Option<String>,
117 pub outcome: String,
118 #[serde(default)]
119 pub price: Option<f64>,
120 #[serde(default)]
121 pub winner: Option<bool>,
122}
123
124#[derive(Debug, Clone, Serialize, Deserialize)]
126pub struct OrderLevel {
127 pub price: String,
128 pub size: String,
129}
130
131#[derive(Debug, Clone, Serialize, Deserialize)]
133pub struct OrderBook {
134 pub market: String,
135 pub asset_id: String,
136 pub bids: Vec<OrderLevel>,
137 pub asks: Vec<OrderLevel>,
138 pub timestamp: u64,
139 pub hash: String,
140}
141
142#[derive(Debug, Clone, Serialize, Deserialize)]
144pub struct PriceResponse {
145 pub price: String,
146}
147
148#[derive(Debug, Clone, Serialize, Deserialize)]
150pub struct MidpointResponse {
151 pub mid: String,
152}