architect_api/algo/
builder.rs1use 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(¶ms)?;
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}