use crate::request::context::RequestContext;
use crate::request::extension::{ExtensionStorage, ExtensionTrait};
use crate::request::relationship::{RelationshipStorage, RelationshipTrait};
use crate::request::view::{ViewStorage, ViewTrait};
use crate::ApiClient;
use std::marker::PhantomData;
pub struct MusicRequestBuilder<'a, BuilderType, Data = ()> {
pub(crate) storefront_override: Option<celes::Country>,
pub(crate) localization_override: Option<&'a str>,
pub(crate) extensions: ExtensionStorage,
pub(crate) relationships: RelationshipStorage,
pub(crate) views: ViewStorage,
pub(crate) data: Data,
pub(crate) _marker: PhantomData<BuilderType>,
}
impl<'a, BuilderType, Data> MusicRequestBuilder<'a, BuilderType, Data> {
pub fn override_storefront(mut self, storefront: celes::Country) -> Self {
self.storefront_override = Some(storefront);
self
}
pub fn override_localization(mut self, localization: &'a str) -> Self {
self.localization_override = Some(localization);
self
}
pub fn extend(mut self, extension: impl ExtensionTrait) -> Self {
self.extensions.add_extension(extension);
self
}
pub fn include(mut self, relationship: impl RelationshipTrait) -> Self {
self.relationships.add_relationship(relationship);
self
}
pub fn include_lazy(mut self, relationship: impl RelationshipTrait) -> Self {
self.relationships.add_relationship_lazy(relationship);
self
}
pub fn view(mut self, view: impl ViewTrait) -> Self {
self.views.add_view(view);
self
}
pub(crate) fn get_request_context_drain(&mut self, client: &ApiClient) -> RequestContext {
let storefront = self
.storefront_override
.unwrap_or(client.get_storefront_country());
let localization = self
.localization_override
.unwrap_or(client.get_localization());
let mut context = RequestContext {
storefront,
query: Vec::from([(String::from("l"), localization.to_string())]),
};
self.extensions.build_query_drain(&mut context);
self.relationships.build_query_drain(&mut context);
self.views.build_query_drain(&mut context);
context
}
}
impl<'a, T, Data> Default for MusicRequestBuilder<'a, T, Data>
where
Data: Default,
{
fn default() -> Self {
MusicRequestBuilder {
storefront_override: None,
localization_override: None,
extensions: Default::default(),
relationships: Default::default(),
views: Default::default(),
data: Default::default(),
_marker: Default::default(),
}
}
}