use crate::{
bus::{client::responses, traits::NeedsStop},
error::Error,
requests::Fetch,
Date,
};
use serde::{
de::{Deserializer, Error as SerdeError},
Deserialize,
};
#[derive(Debug)]
pub struct Stop(pub String);
impl Stop {
pub fn new(stop: &str) -> Self {
Stop(stop.to_string())
}
}
impl Fetch for Stop {}
impl NeedsStop for Stop {}
impl Stop {
pub async fn next_buses(&self, api_key: &str) -> Result<responses::Predictions, Error> {
<Self as NeedsStop>::next_buses(&self, self, api_key).await
}
pub async fn schedule(
&self,
date: Option<Date>,
api_key: &str,
) -> Result<responses::StopSchedule, Error> {
self.stop_schedule(self, date, api_key).await
}
}
impl<'de> Deserialize<'de> for Stop {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let stop = String::deserialize(deserializer)?;
if stop.as_str() == "" {
return Err(SerdeError::custom("Stop isn't present"));
}
Ok(Stop::new(&stop))
}
}
impl PartialEq for Stop {
fn eq(&self, other: &Self) -> bool {
self.0 == other.0
}
}