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 pub rewards: Option<serde_json::Value>,
86 pub minimum_order_size: f64,
87 pub minimum_tick_size: f64,
88 pub description: String,
89 pub category: Option<String>,
90 pub end_date_iso: Option<String>,
91 pub question: String,
92 pub active: bool,
93 pub closed: bool,
94 pub archived: bool,
95 pub neg_risk: Option<bool>,
96 pub neg_risk_market_id: Option<String>,
97 pub enable_order_book: Option<bool>,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
102pub struct ListMarketsResponse {
103 pub data: Vec<Market>,
104 pub next_cursor: Option<String>,
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
109pub struct MarketToken {
110 pub token_id: Option<String>,
111 pub outcome: String,
112 pub price: Option<f64>,
113 pub winner: Option<bool>,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize)]
118pub struct OrderLevel {
119 pub price: String,
120 pub size: String,
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize)]
125pub struct OrderBook {
126 pub market: String,
127 pub asset_id: String,
128 pub bids: Vec<OrderLevel>,
129 pub asks: Vec<OrderLevel>,
130 pub timestamp: u64,
131 pub hash: String,
132}
133
134#[derive(Debug, Clone, Serialize, Deserialize)]
136pub struct PriceResponse {
137 pub price: String,
138}
139
140#[derive(Debug, Clone, Serialize, Deserialize)]
142pub struct MidpointResponse {
143 pub mid: String,
144}