architect_api/algo/
builder.rs

1use super::{Algo, CreateAlgoOrderRequest};
2use crate::{OrderId, TraderIdOrEmail};
3use anyhow::{anyhow, Result};
4use serde_json::value::RawValue;
5
6#[derive(Debug, Default)]
7pub struct CreateAlgoOrderRequestBuilder {
8    pub algo: Option<String>,
9    pub id: Option<OrderId>,
10    pub parent_id: Option<OrderId>,
11    pub trader: Option<TraderIdOrEmail>,
12    pub params: Option<Box<RawValue>>,
13}
14
15impl CreateAlgoOrderRequestBuilder {
16    pub fn new(algo: impl AsRef<str>) -> Self {
17        Self { algo: Some(algo.as_ref().to_string()), ..Default::default() }
18    }
19
20    pub fn id(&mut self, id: OrderId) -> &mut Self {
21        self.id = Some(id);
22        self
23    }
24
25    pub fn parent_id(&mut self, parent_id: OrderId) -> &mut Self {
26        self.parent_id = Some(parent_id);
27        self
28    }
29
30    pub fn trader(&mut self, trader: TraderIdOrEmail) -> &mut Self {
31        self.trader = Some(trader);
32        self
33    }
34
35    pub fn params<A: Algo>(&mut self, params: A::Params) -> Result<&mut Self> {
36        let params = serde_json::value::to_raw_value(&params)?;
37        self.params = Some(params);
38        Ok(self)
39    }
40
41    pub fn build(self) -> Result<CreateAlgoOrderRequest> {
42        Ok(CreateAlgoOrderRequest {
43            algo: self.algo.ok_or_else(|| anyhow!("algo is required"))?,
44            id: self.id,
45            parent_id: self.parent_id,
46            trader: self.trader,
47            params: self.params.ok_or_else(|| anyhow!("params are required"))?,
48        })
49    }
50}