use crate::models::{astronomy::AstronomyObjectType, time::DateTime};
use crate::service::{ProvidedArgument, RequiredArgument};
use serde::Serialize;
macro_rules! return_type {
($self:ident) => {
AstroPositionRequest {
object: $self.object,
placeid: $self.placeid,
interval: $self.interval,
localtime: $self.localtime,
utctime: $self.utctime,
isotime: $self.isotime,
lang: $self.lang,
radius: $self.radius,
_a: Default::default(),
_b: Default::default(),
_c: Default::default(),
}
};
}
#[derive(Default, Serialize)]
pub struct AstroPositionRequest<A = ProvidedArgument, B = ProvidedArgument, C = ProvidedArgument> {
object: Vec<AstronomyObjectType>,
placeid: Vec<String>,
interval: Vec<DateTime>,
localtime: Option<u8>,
utctime: Option<u8>,
isotime: Option<u8>,
lang: Option<String>,
radius: Option<i32>,
_a: std::marker::PhantomData<A>,
_b: std::marker::PhantomData<B>,
_c: std::marker::PhantomData<C>,
}
impl AstroPositionRequest {
pub fn new() -> AstroPositionRequest<RequiredArgument, RequiredArgument, RequiredArgument> {
Default::default()
}
}
impl<A, B, C> AstroPositionRequest<A, B, C> {
pub fn set_object(
mut self,
object: Vec<AstronomyObjectType>,
) -> AstroPositionRequest<ProvidedArgument, B, C> {
self.object = object;
return_type!(self)
}
pub fn with_object(
mut self,
object: AstronomyObjectType,
) -> AstroPositionRequest<ProvidedArgument, B, C> {
self.object.push(object);
return_type!(self)
}
pub fn set_placeid(
mut self,
placeid: Vec<impl Into<String>>,
) -> AstroPositionRequest<A, ProvidedArgument, C> {
self.placeid = placeid.into_iter().map(Into::into).collect();
return_type!(self)
}
pub fn with_placeid(
mut self,
placeid: impl Into<String>,
) -> AstroPositionRequest<A, ProvidedArgument, C> {
self.placeid.push(placeid.into());
return_type!(self)
}
pub fn set_interval(
mut self,
interval: Vec<DateTime>,
) -> AstroPositionRequest<A, B, ProvidedArgument> {
self.interval = interval;
return_type!(self)
}
pub fn with_interval(
mut self,
interval: DateTime,
) -> AstroPositionRequest<A, B, ProvidedArgument> {
self.interval.push(interval);
return_type!(self)
}
pub fn set_localtime(mut self, enable: bool) -> Self {
self.localtime.insert(enable.into());
self
}
pub fn set_utctime(mut self, enable: bool) -> Self {
self.utctime.insert(enable.into());
self
}
pub fn set_isotime(mut self, enable: bool) -> Self {
self.isotime.insert(enable.into());
self
}
pub fn set_lang(mut self, lang: impl Into<String>) -> Self {
self.lang.insert(lang.into());
self
}
pub fn set_radius(mut self, radius: i32) -> Self {
self.radius.insert(radius);
self
}
}