nbp 0.2.0

A Rust library for accessing the National Bank of Poland's API.
Documentation
use crate::client::service_client::ServiceClient;
use crate::models::date_parameters::{DateParameter, NoDateParameter, WithDateParameter};
use crate::models::exchange_rates::CurrencyExchangeTable;
use crate::models::table_type::TableType;
use crate::nbp_error::NbpResult;
use chrono::NaiveDate;
use std::marker::PhantomData;

pub struct GetTablesBuilder<State> {
    service_client: ServiceClient,
    date_parameter: Option<DateParameter>,
    _state: PhantomData<State>,
}

impl GetTablesBuilder<NoDateParameter> {
    pub fn new(mut service_client: ServiceClient, table_type: TableType) -> Self {
        service_client
            .join_path(&format!("tables/{}/", table_type))
            .unwrap();

        Self {
            service_client,
            date_parameter: None,
            _state: PhantomData,
        }
    }

    pub fn today(self) -> GetTablesBuilder<WithDateParameter> {
        GetTablesBuilder {
            service_client: self.service_client,
            date_parameter: Some(DateParameter::Today),
            _state: PhantomData,
        }
    }

    pub fn last_day(self) -> GetTablesBuilder<WithDateParameter> {
        GetTablesBuilder {
            service_client: self.service_client,
            date_parameter: Some(DateParameter::LastDay),
            _state: PhantomData,
        }
    }

    pub fn last_days(self, days_number: u8) -> GetTablesBuilder<WithDateParameter> {
        GetTablesBuilder {
            service_client: self.service_client,
            date_parameter: Some(DateParameter::LastDays(days_number)),
            _state: PhantomData,
        }
    }

    pub fn date(self, date: NaiveDate) -> GetTablesBuilder<WithDateParameter> {
        GetTablesBuilder {
            service_client: self.service_client,
            date_parameter: Some(DateParameter::Date(date)),
            _state: PhantomData,
        }
    }

    pub fn date_range(
        self,
        start_date: NaiveDate,
        end_date: NaiveDate,
    ) -> GetTablesBuilder<WithDateParameter> {
        GetTablesBuilder {
            service_client: self.service_client,
            date_parameter: Some(DateParameter::DateRange(start_date, end_date)),
            _state: PhantomData,
        }
    }
}

impl<State> GetTablesBuilder<State> {
    pub async fn send(mut self) -> NbpResult<Vec<CurrencyExchangeTable>> {
        if let Some(date_param) = self.date_parameter {
            let path_segment = date_param.to_path_segment();
            self.service_client.join_path(&path_segment)?;
        }

        self.service_client.get().await
    }
}