pub mod prelude {
pub use crate::crowd::crowd_density::{
CrowdDensityForecast, CrowdDensityForecastRawResp, CrowdInterval, CrowdLevel,
StationCrowdForecast, StationCrowdLevel, StationCrowdLevelRawResp,
};
pub use crate::crowd::passenger_vol::{Link, PassengerVolRawResp, VolType};
}
pub mod crowd_density {
use crate::train::StationCode;
use serde::{Deserialize, Serialize};
use time::{
serde::{iso8601, timestamp},
OffsetDateTime,
};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub enum CrowdLevel {
#[serde(rename = "l")]
Low,
#[serde(rename = "h")]
High,
#[serde(rename = "m")]
Moderate,
#[default]
#[serde(other)]
Na,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct StationCrowdLevelRaw {
pub station: StationCode,
#[serde(with = "iso8601")]
pub start_time: OffsetDateTime,
#[serde(with = "iso8601")]
pub end_time: OffsetDateTime,
pub crowd_level: CrowdLevel,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct StationCrowdLevel {
pub station: StationCode,
#[serde(with = "timestamp")]
pub start_time: OffsetDateTime,
#[serde(with = "timestamp")]
pub end_time: OffsetDateTime,
pub crowd_level: CrowdLevel,
}
impl From<StationCrowdLevelRaw> for StationCrowdLevel {
fn from(r: StationCrowdLevelRaw) -> Self {
Self {
station: r.station,
start_time: r.start_time,
end_time: r.end_time,
crowd_level: r.crowd_level,
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct StationCrowdLevelRawResp {
value: Vec<StationCrowdLevelRaw>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct CrowdDensityForecastRaw {
#[serde(alias = "Date", with = "iso8601")]
pub datetime: OffsetDateTime,
pub stations: Vec<StationCrowdForecast>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CrowdDensityForecast {
#[serde(with = "timestamp")]
pub datetime: OffsetDateTime,
pub stations: Vec<StationCrowdForecast>,
}
impl From<CrowdDensityForecastRaw> for CrowdDensityForecast {
fn from(r: CrowdDensityForecastRaw) -> Self {
Self {
datetime: r.datetime,
stations: r.stations
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CrowdDensityForecastRawResp {
value: Vec<CrowdDensityForecastRaw>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct StationCrowdForecast {
pub station: StationCode,
pub interval: Vec<CrowdInterval>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct CrowdInterval {
#[serde(with = "iso8601")]
pub start: OffsetDateTime,
pub crowd_level: CrowdLevel,
}
impl From<StationCrowdLevelRawResp> for Vec<StationCrowdLevel> {
fn from(data: StationCrowdLevelRawResp) -> Self {
data.value.into_iter().map(Into::into).collect()
}
}
impl From<CrowdDensityForecastRawResp> for CrowdDensityForecast {
fn from(data: CrowdDensityForecastRawResp) -> Self {
Self::from(data.value[0].clone())
}
}
}
pub mod passenger_vol {
use serde::{Deserialize, Serialize};
pub const FORMAT: &str = "%Y%m";
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub enum VolType {
BusStops,
OdBusStop,
Train,
OdTrain,
#[default]
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct Link {
#[serde(alias = "Link")]
pub link: String,
}
impl From<Link> for String {
fn from(data: Link) -> Self {
data.link
}
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct PassengerVolRawResp {
pub value: Vec<Link>,
}
impl From<PassengerVolRawResp> for Vec<String> {
fn from(data: PassengerVolRawResp) -> Self {
data.value.into_iter().map(|f| f.link).collect()
}
}
}