use url::form_urlencoded;
use crate::{
api_types::{
ASSEMBLE_EXTERNAL_MATCH_ROUTE, REQUEST_EXTERNAL_MATCH_ROUTE, REQUEST_EXTERNAL_QUOTE_ROUTE,
},
types::ExternalOrder,
GAS_REFUND_NATIVE_ETH_QUERY_PARAM,
};
use super::{GAS_REFUND_ADDRESS_QUERY_PARAM, GAS_SPONSORSHIP_QUERY_PARAM};
#[derive(Clone, Default)]
pub struct RequestQuoteOptions {
pub disable_gas_sponsorship: bool,
pub gas_refund_address: Option<String>,
pub refund_native_eth: bool,
}
impl RequestQuoteOptions {
pub fn new() -> Self {
Default::default()
}
pub fn disable_gas_sponsorship(mut self) -> Self {
self.disable_gas_sponsorship = true;
self
}
pub fn with_gas_refund_address(mut self, gas_refund_address: String) -> Self {
self.gas_refund_address = Some(gas_refund_address);
self
}
pub fn with_refund_native_eth(mut self) -> Self {
self.refund_native_eth = true;
self
}
pub(crate) fn build_request_path(&self) -> String {
let mut query = form_urlencoded::Serializer::new(String::new());
query.append_pair(GAS_SPONSORSHIP_QUERY_PARAM, &self.disable_gas_sponsorship.to_string());
query.append_pair(GAS_REFUND_NATIVE_ETH_QUERY_PARAM, &self.refund_native_eth.to_string());
if let Some(addr) = &self.gas_refund_address {
query.append_pair(GAS_REFUND_ADDRESS_QUERY_PARAM, addr);
}
format!("{}?{}", REQUEST_EXTERNAL_QUOTE_ROUTE, query.finish())
}
}
#[deprecated(
since = "0.1.0",
note = "This endpoint will soon be removed, use `request_quote` and `assemble_quote` instead"
)]
#[derive(Clone, Default)]
pub struct ExternalMatchOptions {
pub do_gas_estimation: bool,
pub sponsor_gas: bool,
pub gas_refund_address: Option<String>,
pub receiver_address: Option<String>,
}
#[allow(deprecated)]
impl ExternalMatchOptions {
pub fn new() -> Self {
Default::default()
}
pub fn with_gas_estimation(mut self, do_gas_estimation: bool) -> Self {
self.do_gas_estimation = do_gas_estimation;
self
}
pub fn with_receiver_address(mut self, receiver_address: String) -> Self {
self.receiver_address = Some(receiver_address);
self
}
pub fn request_gas_sponsorship(mut self) -> Self {
self.sponsor_gas = true;
self
}
pub fn with_gas_refund_address(mut self, gas_refund_address: String) -> Self {
self.gas_refund_address = Some(gas_refund_address);
self
}
pub(crate) fn build_request_path(&self) -> String {
let mut query = form_urlencoded::Serializer::new(String::new());
query.append_pair(GAS_SPONSORSHIP_QUERY_PARAM, &(!self.sponsor_gas).to_string());
if let Some(addr) = &self.gas_refund_address {
query.append_pair(GAS_REFUND_ADDRESS_QUERY_PARAM, addr);
}
format!("{}?{}", REQUEST_EXTERNAL_MATCH_ROUTE, query.finish())
}
}
#[derive(Clone, Default)]
pub struct AssembleQuoteOptions {
pub do_gas_estimation: bool,
pub allow_shared: bool,
#[deprecated(
since = "0.1.0",
note = "This option will soon be removed, request gas sponsorship when requesting a quote instead"
)]
pub sponsor_gas: bool,
#[deprecated(
since = "0.1.0",
note = "This option will soon be removed, request gas sponsorship when requesting a quote instead"
)]
pub gas_refund_address: Option<String>,
pub receiver_address: Option<String>,
pub updated_order: Option<ExternalOrder>,
}
impl AssembleQuoteOptions {
pub fn new() -> Self {
Default::default()
}
pub fn with_gas_estimation(mut self, do_gas_estimation: bool) -> Self {
self.do_gas_estimation = do_gas_estimation;
self
}
pub fn with_allow_shared(mut self, allow_shared: bool) -> Self {
self.allow_shared = allow_shared;
self
}
#[deprecated(
since = "0.1.0",
note = "This option will soon be removed, request gas sponsorship when requesting a quote instead"
)]
#[allow(deprecated)]
pub fn request_gas_sponsorship(mut self) -> Self {
self.sponsor_gas = true;
self
}
#[deprecated(
since = "0.1.0",
note = "This option will soon be removed, request gas sponsorship when requesting a quote instead"
)]
#[allow(deprecated)]
pub fn with_gas_refund_address(mut self, gas_refund_address: String) -> Self {
self.gas_refund_address = Some(gas_refund_address);
self
}
pub fn with_receiver_address(mut self, receiver_address: String) -> Self {
self.receiver_address = Some(receiver_address);
self
}
pub fn with_updated_order(mut self, updated_order: ExternalOrder) -> Self {
self.updated_order = Some(updated_order);
self
}
#[allow(deprecated)]
pub(crate) fn build_request_path(&self) -> String {
let mut query = form_urlencoded::Serializer::new(String::new());
if self.sponsor_gas {
query.append_pair(GAS_SPONSORSHIP_QUERY_PARAM, &(!self.sponsor_gas).to_string());
}
if let Some(addr) = &self.gas_refund_address {
query.append_pair(GAS_REFUND_ADDRESS_QUERY_PARAM, addr);
}
let query_str = query.finish();
if query_str.is_empty() {
return ASSEMBLE_EXTERNAL_MATCH_ROUTE.to_string();
}
format!("{ASSEMBLE_EXTERNAL_MATCH_ROUTE}?{query_str}")
}
}