use crate::error::{Error, ErrorType};
use crate::orders::strategy::Strategy;
use crate::orders::{OrderSide, OrderType, SymbolFormat, TimeInForce};
use crate::utils::{parse_response};
use reqwest::{RequestBuilder, Response};
use serde::{Deserialize, Serialize};
#[cfg(feature="async")]
use crate::client::async_client::AsyncClient;
#[cfg(feature="sync")]
use crate::client::sync_client::SyncClient;
#[cfg(feature="sync")]
use crate::utils::parse_response_blocking;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateOrderParams {
pub account_id: String,
pub reference_id: String,
pub order_type: OrderType,
#[serde(rename = "side")]
pub order_side: OrderSide,
pub quantity: String,
pub price: Option<String>,
pub stop_price: Option<String>,
pub time_in_force: TimeInForce,
pub symbol: String,
pub symbol_format: SymbolFormat,
pub strategy: Strategy,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateOrderResponse {
pub order_id: String,
}
#[cfg(feature = "async")]
pub async fn create_order(
client: &AsyncClient,
params: CreateOrderParams,
) -> Result<CreateOrderResponse, Error> {
let api_url: &str = &client.client_options.api_url;
let account_id: &str = &client.client_options.account_id;
let url: String = format!("{api_url}/studio/v2/accounts/{account_id}/orders");
let request_builder: RequestBuilder = client.client.post(&url).json(¶ms);
let response: Response = request_builder.send().await?;
let status = response.status();
if !status.is_success() {
let error_body = response.text().await?;
return Err(Error::new(
ErrorType::HttpError,
&format!("Error: {} - {}", status, error_body),
));
}
parse_response::<CreateOrderResponse>(response).await
}
#[cfg(feature = "sync")]
pub fn create_order_blocking(
sync_client: &SyncClient,
params: CreateOrderParams,
) -> Result<CreateOrderResponse, Error> {
let url = format!(
"{}/studio/v2/accounts/{}/orders",
sync_client.client_options.api_url, sync_client.client_options.account_id
);
let request_builder: reqwest::blocking::RequestBuilder =
sync_client.client.post(&url).json(¶ms);
let response: reqwest::blocking::Response = request_builder
.send()?;
let status = response.status();
if !status.is_success() {
let error_body = response.text()?;
return Err(Error::new(
ErrorType::HttpError,
&format!("Error: {} - {}", status, error_body),
));
}
parse_response_blocking::<CreateOrderResponse>(response)
}