am_api/request/
builder.rs

1//! Request builder
2use 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
9/// A request builder
10pub struct MusicRequestBuilder<'a, BuilderType, Data = ()> {
11    /// Storefront
12    pub(crate) storefront_override: Option<celes::Country>,
13    /// Localization
14    pub(crate) localization_override: Option<&'a str>,
15    /// Extensions
16    pub(crate) extensions: ExtensionStorage,
17    /// Relationships
18    pub(crate) relationships: RelationshipStorage,
19    /// Views
20    pub(crate) views: ViewStorage,
21    /// Data
22    pub(crate) data: Data,
23    pub(crate) _marker: PhantomData<BuilderType>,
24}
25
26impl<'a, BuilderType, Data> MusicRequestBuilder<'a, BuilderType, Data> {
27    /// Override storefront for this request
28    pub fn override_storefront(mut self, storefront: celes::Country) -> Self {
29        self.storefront_override = Some(storefront);
30        self
31    }
32
33    /// Override localization for this request
34    pub fn override_localization(mut self, localization: &'a str) -> Self {
35        self.localization_override = Some(localization);
36        self
37    }
38
39    /// Extend resource attributes
40    pub fn extend(mut self, extension: impl ExtensionTrait) -> Self {
41        self.extensions.add_extension(extension);
42        self
43    }
44
45    /// Include a relationship
46    ///
47    /// This will fetch the full object for the relationship data
48    pub fn include(mut self, relationship: impl RelationshipTrait) -> Self {
49        self.relationships.add_relationship(relationship);
50        self
51    }
52
53    /// Lazily include a relationship
54    ///
55    /// This will only fetch the identifiers for the relationship data
56    pub fn include_lazy(mut self, relationship: impl RelationshipTrait) -> Self {
57        self.relationships.add_relationship_lazy(relationship);
58        self
59    }
60
61    /// Add a relationship view
62    pub fn view(mut self, view: impl ViewTrait) -> Self {
63        self.views.add_view(view);
64        self
65    }
66
67    /// Get request context draining this builder
68    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}