abs_data/builders/
sdmx_meta_request_builder.rs

1use crate::{
2    builders::url_builder::UrlBuilder,
3    config::Config,
4    models::typed::{
5        meta_detail::MetaDetail, reference::Reference, sdmx_meta_request::SdmxMetaRequest,
6        sdmx_request::SdmxRequest, structure_type::StructureType, version::Version,
7    },
8};
9
10pub struct SdmxMetaRequestBuilder<'a> {
11    base_url: &'a str,
12    structure_type: &'a StructureType,
13    agency_id: Option<&'a str>,
14    detail: Option<&'a MetaDetail>,
15    structure_id: Option<&'a str>,
16    structure_version: Option<&'a Version>,
17    references: Option<&'a Reference>,
18    key: Option<&'a str>,
19    headers: &'a [(&'a str, &'a str)],
20}
21
22impl<'a> SdmxMetaRequestBuilder<'a> {
23    pub fn new(structure_type: &'a StructureType) -> Self {
24        Self {
25            base_url: Config::BASE_URL,
26            structure_type,
27            agency_id: None,
28            detail: None,
29            structure_id: None,
30            structure_version: None,
31            references: None,
32            key: None,
33            headers: &[Config::USER_AGENT_ANONYMOUS, Config::ACCEPT_STRUCTURE_JSON],
34        }
35    }
36
37    pub fn detail(mut self, detail: &'a MetaDetail) -> Self {
38        self.detail = Some(detail);
39        self
40    }
41
42    pub fn agency_id(mut self, agency_id: &'a str) -> Self {
43        self.agency_id = Some(agency_id);
44        self
45    }
46
47    pub fn structure_id(mut self, structure_id: &'a str) -> Self {
48        self.structure_id = Some(structure_id);
49        self
50    }
51
52    pub fn structure_version(mut self, structure_version: &'a Version) -> Self {
53        self.structure_version = Some(structure_version);
54        self
55    }
56
57    pub fn reference(mut self, references: &'a Reference) -> Self {
58        self.references = Some(references);
59        self
60    }
61
62    pub fn key(mut self, key: &'a str) -> Self {
63        self.key = Some(key);
64        self
65    }
66
67    pub fn build(&self) -> SdmxMetaRequest {
68        let mut url_builder = UrlBuilder::new(self.base_url)
69            .add_path_segment(self.structure_type.to_string())
70            .add_path_segment(self.agency_id.unwrap_or("ABS"));
71
72        if let Some(structure_id) = self.structure_id {
73            url_builder = url_builder.add_path_segment(structure_id.to_string());
74
75            if let Some(structure_version) = self.structure_version {
76                url_builder = url_builder.add_path_segment(structure_version.to_string());
77            }
78        }
79
80        if let Some(references) = self.references {
81            url_builder =
82                url_builder.add_query_param(Config::QUERY_REFERENCES, references.to_string());
83        }
84
85        if let Some(detail) = self.detail {
86            url_builder = url_builder.add_query_param(Config::QUERY_DETAIL, detail.to_string());
87        }
88
89        let url = url_builder.build().expect("Failed to build url");
90
91        let request = SdmxRequest::new(url, self.key, self.headers);
92
93        SdmxMetaRequest::from(request)
94    }
95}