Skip to main content

polyoxide_data/api/
market_positions.rs

1use polyoxide_core::{HttpClient, QueryBuilder, Request};
2
3use crate::{
4    error::DataApiError,
5    types::{MarketPositionSortBy, MarketPositionStatus, MetaMarketPositionV1, SortDirection},
6};
7
8/// Market positions namespace — `GET /v1/market-positions`.
9///
10/// Returns positions for a specific market across all users (or a single user
11/// via [`ListMarketPositions::user`]).
12#[derive(Clone)]
13pub struct MarketPositionsApi {
14    pub(crate) http_client: HttpClient,
15}
16
17impl MarketPositionsApi {
18    /// List positions for a market by condition ID.
19    ///
20    /// `market` is required by the upstream API.
21    pub fn list(&self, market: impl Into<String>) -> ListMarketPositions {
22        let mut request = Request::new(self.http_client.clone(), "/v1/market-positions");
23        request = request.query("market", market.into());
24        ListMarketPositions { request }
25    }
26}
27
28/// Request builder for listing positions in a market.
29pub struct ListMarketPositions {
30    request: Request<Vec<MetaMarketPositionV1>, DataApiError>,
31}
32
33impl ListMarketPositions {
34    /// Filter to a single user by proxy wallet address.
35    pub fn user(mut self, user_address: impl Into<String>) -> Self {
36        self.request = self.request.query("user", user_address.into());
37        self
38    }
39
40    /// Filter positions by status (default: `ALL`).
41    pub fn status(mut self, status: MarketPositionStatus) -> Self {
42        self.request = self.request.query("status", status);
43        self
44    }
45
46    /// Sort positions by field (default: `TOTAL_PNL`).
47    pub fn sort_by(mut self, sort_by: MarketPositionSortBy) -> Self {
48        self.request = self.request.query("sortBy", sort_by);
49        self
50    }
51
52    /// Set sort direction (default: `DESC`).
53    pub fn sort_direction(mut self, direction: SortDirection) -> Self {
54        self.request = self.request.query("sortDirection", direction);
55        self
56    }
57
58    /// Maximum number of positions per outcome token (0-500, default: 50).
59    pub fn limit(mut self, limit: u32) -> Self {
60        self.request = self.request.query("limit", limit);
61        self
62    }
63
64    /// Pagination offset per outcome token (0-10000, default: 0).
65    pub fn offset(mut self, offset: u32) -> Self {
66        self.request = self.request.query("offset", offset);
67        self
68    }
69
70    /// Execute the request.
71    pub async fn send(self) -> Result<Vec<MetaMarketPositionV1>, DataApiError> {
72        self.request.send().await
73    }
74}