use serde::{Deserialize, Serialize};
use crate::content::ContentId;
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct PisGroup {
pub name: String,
pub stations: Vec<PisStation>,
pub special_chars: Vec<PisSpecialChar>,
pub routes: Vec<PisRoute>,
pub server_name: Option<String>,
}
impl PisGroup {
#[cfg(feature = "ffi")]
pub fn get_name() -> String {
let name =
lotus_script_sys::FfiObject::from_packed(unsafe { lotus_script_sys::pis::get_name() });
name.deserialize()
}
#[cfg(feature = "ffi")]
pub fn get_station(code: u32) -> Option<PisStation> {
let station = lotus_script_sys::FfiObject::from_packed(unsafe {
lotus_script_sys::pis::get_station(code)
});
station.deserialize()
}
#[cfg(feature = "ffi")]
pub fn get_special_char_with_line(line: u32, special_char_code: u32) -> String {
let route_codes = lotus_script_sys::FfiObject::from_packed(unsafe {
lotus_script_sys::pis::get_special_char_with_line(line, special_char_code)
});
route_codes.deserialize()
}
#[cfg(feature = "ffi")]
pub fn get_route(line_code: (u32, u32)) -> Option<PisRoute> {
let route = lotus_script_sys::FfiObject::from_packed(unsafe {
lotus_script_sys::pis::get_route(line_code.0, line_code.1)
});
route.deserialize()
}
#[cfg(feature = "ffi")]
pub fn get_route_codes_by_line(line: u32) -> Vec<u32> {
let route_codes = lotus_script_sys::FfiObject::from_packed(unsafe {
lotus_script_sys::pis::get_route_codes_by_line(line)
});
route_codes.deserialize()
}
#[cfg(feature = "ffi")]
pub fn get_all_stations() -> Vec<PisStation> {
let stations = lotus_script_sys::FfiObject::from_packed(unsafe {
lotus_script_sys::pis::get_all_stations()
});
stations.deserialize()
}
#[cfg(feature = "ffi")]
pub fn get_all_routes() -> Vec<PisRoute> {
let routes = lotus_script_sys::FfiObject::from_packed(unsafe {
lotus_script_sys::pis::get_all_routes()
});
routes.deserialize()
}
#[cfg(feature = "ffi")]
pub fn get_all_special_chars_with_line(line: u32) -> Vec<(u32, String)> {
let special_chars = lotus_script_sys::FfiObject::from_packed(unsafe {
lotus_script_sys::pis::get_all_special_chars_with_line(line)
});
special_chars.deserialize()
}
#[cfg(feature = "ffi")]
pub fn get_server_name() -> Option<String> {
let server_name = lotus_script_sys::FfiObject::from_packed(unsafe {
lotus_script_sys::pis::get_server_name()
});
server_name.deserialize()
}
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Eq, Debug)]
pub struct PisStation {
pub id: String,
pub code: u32,
pub interieur_display: [String; 2],
pub terminus_front_option: Option<[String; 2]>,
pub terminus_side_option: Option<[String; 2]>,
pub terminus_oneline: String,
}
pub enum PisStationTerminusOneLineTo {
FirstLine,
SecondLine,
}
impl PisStation {
pub fn terminus_front(&self, one_to_two_line: PisStationTerminusOneLineTo) -> [String; 2] {
if let Some(front) = &self.terminus_front_option {
front.clone()
} else {
match one_to_two_line {
PisStationTerminusOneLineTo::FirstLine => {
[self.terminus_oneline.clone(), String::new()]
}
PisStationTerminusOneLineTo::SecondLine => {
[String::new(), self.terminus_oneline.clone()]
}
}
}
}
pub fn terminus_side(&self, one_to_two_line: PisStationTerminusOneLineTo) -> [String; 2] {
if let Some(side) = &self.terminus_side_option {
side.clone()
} else {
self.terminus_front(one_to_two_line)
}
}
pub fn code_is_public(&self) -> bool {
self.code < 1_000_000
}
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Eq, Debug)]
pub struct PisSpecialChar {
pub code: u32,
pub chars: String, }
#[derive(Clone, Serialize, Deserialize, PartialEq, Eq, Debug)]
pub struct PisRoute {
pub line_code: (u32, u32),
pub stop_codes: Vec<u32>,
pub special_char_code: Option<u32>,
pub routing_code: Option<u32>,
pub text: Option<String>,
pub termini: Vec<PisRouteTerminus>,
pub following_line_code: Option<(u32, u32)>,
}
impl PisRoute {
pub fn new(
line_code: (u32, u32),
stop_codes: Vec<u32>,
special_char_code: Option<u32>,
routing_code: Option<u32>,
text: Option<String>,
termini: Vec<PisRouteTerminus>,
following_line_code: Option<(u32, u32)>,
) -> Self {
Self {
line_code,
stop_codes,
special_char_code,
routing_code,
text,
termini,
following_line_code,
}
}
pub fn get_current_direction(&self, stop_index: usize) -> Option<PisRouteTerminus> {
self.termini
.iter()
.filter(|terminus| stop_index >= terminus.stop_index)
.max_by_key(|terminus| terminus.stop_index)
.cloned()
.or_else(|| {
self.stop_codes.last().map(|code| PisRouteTerminus {
stop_index: 0,
code: Some(*code),
line: Some(self.line_code.0),
special_char_code: self.special_char_code,
routing_code: self.routing_code,
})
})
}
}
#[derive(Default, Clone, Serialize, Deserialize, PartialEq, Eq, Debug)]
pub struct PisRouteTerminus {
pub stop_index: usize,
pub code: Option<u32>,
pub line: Option<u32>,
pub special_char_code: Option<u32>,
pub routing_code: Option<u32>,
}
impl PisRouteTerminus {
fn routing_code_hash(&self) -> u32 {
0
}
pub fn routing_code(&self) -> u32 {
self.routing_code.unwrap_or(self.routing_code_hash())
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct PisSpGroup {
pub name: String,
pub basic_pis_group: ContentId,
pub class: String,
pub add_lines: String,
pub add_lines_stations: Vec<PisSpAddLines>,
pub routes: Vec<PisSpRoute>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct PisSpAddLines {
pub code: i32,
pub lines: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PisSpRoute {
pub code: i32,
pub lines: String,
pub stop_lines: Vec<String>,
}
impl PisSpGroup {
#[cfg(feature = "ffi")]
pub fn get_content_id(class: &str) -> Option<ContentId> {
let class = lotus_script_sys::FfiObject::new(&class);
let content_id = lotus_script_sys::FfiObject::from_packed(unsafe {
lotus_script_sys::pis::get_sp_content_id(class.packed())
});
content_id.deserialize()
}
#[cfg(feature = "ffi")]
pub fn get_group_strings(content_id: ContentId) -> String {
let content_id = lotus_script_sys::FfiObject::new(&content_id);
let lines = lotus_script_sys::FfiObject::from_packed(unsafe {
lotus_script_sys::pis::get_sp_group_strings(content_id.packed())
});
lines.deserialize()
}
#[cfg(feature = "ffi")]
pub fn get_station_strings(content_id: ContentId, station_code: u32) -> Option<String> {
let content_id = lotus_script_sys::FfiObject::new(&content_id);
let lines = lotus_script_sys::FfiObject::from_packed(unsafe {
lotus_script_sys::pis::get_sp_station_strings(content_id.packed(), station_code)
});
lines.deserialize()
}
#[cfg(feature = "ffi")]
pub fn get_route(content_id: ContentId, line: u32, code: u32) -> Option<PisSpRoute> {
let content_id = lotus_script_sys::FfiObject::new(&content_id);
let route = lotus_script_sys::FfiObject::from_packed(unsafe {
lotus_script_sys::pis::get_sp_route_data(content_id.packed(), line, code)
});
route.deserialize()
}
}