abs_data/builders/
sdmx_meta_request_builder.rs1use 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}