use crate::models::*;
#[derive(Default, Clone)]
pub struct OfferId(String);
#[derive(Default, Clone)]
pub struct NoOfferId;
#[derive(Default)]
pub struct SingleOfferRequest<I> {
offer_id: I,
}
impl SingleOfferRequest<NoOfferId> {
pub fn new() -> Self {
SingleOfferRequest::default()
}
pub fn set_offer_id(self, offer_id: impl Into<String>) -> Result<SingleOfferRequest<OfferId>, String> {
let offer_id = offer_id.into();
match offer_id.parse::<u32>() {
Ok(id) => {
if id > 0 {
Ok(SingleOfferRequest {
offer_id: OfferId(offer_id),
})
} else {
Err("offer ID must be greater than or equal to 1".to_string())
}
}
Err(_) => Err("invalid offer ID".to_string()),
}
}
}
impl Request for SingleOfferRequest<OfferId> {
fn get_query_parameters(&self) -> String {
let mut query = String::new();
query.push_str(&format!("{}", self.offer_id.0));
query.trim_end_matches('&').to_string()
}
fn build_url(&self, base_url: &str) -> String {
format!(
"{}/{}/{}",
base_url,
super::OFFERS_PATH,
self.get_query_parameters()
)
}
}