am_api/request/
builder.rs1use crate::request::context::RequestContext;
3use crate::request::extension::{ExtensionStorage, ExtensionTrait};
4use crate::request::relationship::{RelationshipStorage, RelationshipTrait};
5use crate::request::view::{ViewStorage, ViewTrait};
6use crate::ApiClient;
7use std::marker::PhantomData;
8
9pub struct MusicRequestBuilder<'a, BuilderType, Data = ()> {
11 pub(crate) storefront_override: Option<celes::Country>,
13 pub(crate) localization_override: Option<&'a str>,
15 pub(crate) extensions: ExtensionStorage,
17 pub(crate) relationships: RelationshipStorage,
19 pub(crate) views: ViewStorage,
21 pub(crate) data: Data,
23 pub(crate) _marker: PhantomData<BuilderType>,
24}
25
26impl<'a, BuilderType, Data> MusicRequestBuilder<'a, BuilderType, Data> {
27 pub fn override_storefront(mut self, storefront: celes::Country) -> Self {
29 self.storefront_override = Some(storefront);
30 self
31 }
32
33 pub fn override_localization(mut self, localization: &'a str) -> Self {
35 self.localization_override = Some(localization);
36 self
37 }
38
39 pub fn extend(mut self, extension: impl ExtensionTrait) -> Self {
41 self.extensions.add_extension(extension);
42 self
43 }
44
45 pub fn include(mut self, relationship: impl RelationshipTrait) -> Self {
49 self.relationships.add_relationship(relationship);
50 self
51 }
52
53 pub fn include_lazy(mut self, relationship: impl RelationshipTrait) -> Self {
57 self.relationships.add_relationship_lazy(relationship);
58 self
59 }
60
61 pub fn view(mut self, view: impl ViewTrait) -> Self {
63 self.views.add_view(view);
64 self
65 }
66
67 pub(crate) fn get_request_context_drain(&mut self, client: &ApiClient) -> RequestContext {
69 let storefront = self
70 .storefront_override
71 .unwrap_or(client.get_storefront_country());
72
73 let localization = self
74 .localization_override
75 .unwrap_or(client.get_localization());
76
77 let mut context = RequestContext {
78 storefront,
79 query: Vec::from([(String::from("l"), localization.to_string())]),
80 };
81
82 self.extensions.build_query_drain(&mut context);
83 self.relationships.build_query_drain(&mut context);
84 self.views.build_query_drain(&mut context);
85
86 context
87 }
88}
89
90impl<'a, T, Data> Default for MusicRequestBuilder<'a, T, Data>
91where
92 Data: Default,
93{
94 fn default() -> Self {
95 MusicRequestBuilder {
96 storefront_override: None,
97 localization_override: None,
98 extensions: Default::default(),
99 relationships: Default::default(),
100 views: Default::default(),
101 data: Default::default(),
102 _marker: Default::default(),
103 }
104 }
105}