128 lines
2.9 KiB
Rust
128 lines
2.9 KiB
Rust
#[derive(Clone, PartialEq, PartialOrd, Debug)]
|
|
pub struct Stop{
|
|
pub id:u32,
|
|
pub name:String,
|
|
pub lat: f64,
|
|
pub lon: f64,
|
|
}
|
|
impl std::hash::Hash for Stop {
|
|
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
|
|
state.write_u32(self.id);
|
|
}
|
|
}
|
|
impl From<Stop> for crate::types::Coords {
|
|
fn from(value: Stop) -> Self {
|
|
crate::types::Coords {lat: value.lat, lon: value.lon}
|
|
}
|
|
}
|
|
|
|
#[derive(serde::Deserialize)]
|
|
struct OcctStop{
|
|
id:u32,
|
|
name:String,
|
|
lat: f64,
|
|
#[serde(rename(deserialize = "lng"))]
|
|
lon: f64,
|
|
}
|
|
impl From<OcctStop> for Stop{
|
|
fn from(OcctStop{id,name,lat,lon}: OcctStop) -> Self {
|
|
Self {
|
|
id,
|
|
name,
|
|
lat,
|
|
lon
|
|
}
|
|
}
|
|
}
|
|
#[derive(serde::Deserialize)]
|
|
struct BCStop{
|
|
id:u32,
|
|
name:String,
|
|
lat: f64,
|
|
lon: f64,
|
|
}
|
|
impl From<BCStop> for Stop{
|
|
fn from(BCStop{id,name,lat,lon}: BCStop) -> Self {
|
|
Self {
|
|
id,
|
|
name,
|
|
lat,
|
|
lon
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(serde::Deserialize)]
|
|
struct OcctWrap{
|
|
get_stops:Vec<OcctStop>
|
|
}
|
|
pub async fn occt_stops_get()->anyhow::Result<Vec<Stop>>{
|
|
let resp = reqwest::get("http://binghamtonupublic.etaspot.net/service.php?service=get_stops&token=TESTING").await?;
|
|
let body = resp.text().await?;
|
|
let OcctWrap {get_stops: stops}= serde_json::from_str(body.as_str())?;
|
|
Ok(stops.into_iter().map(Stop::from).collect())
|
|
}
|
|
pub async fn bc_stops_get()->anyhow::Result<Vec<Stop>>{
|
|
let resp = reqwest::get("https://bctransit.doublemap.com/map/v2/stops").await?;
|
|
let body = resp.text().await?;
|
|
let stops:Vec<BCStop> = serde_json::from_str(body.as_str())?;
|
|
Ok(stops.into_iter().map(Stop::from).collect())
|
|
}
|
|
pub fn poly_encode_stops(stops:Vec<Stop>)->String{
|
|
println!("{:?}",stops);
|
|
stops.into_iter()
|
|
.map(|stop|{
|
|
"".to_owned()//enc_float(stop.lat) + &enc_float(stop.lon)
|
|
})
|
|
.reduce(|s1,s2|s1+&s2).unwrap_or("".into())
|
|
}
|
|
fn enc_float(num:f64)->String{
|
|
|
|
let working:i32 = invoke_e5(num);
|
|
let working = two_comp(working,num);
|
|
let working = lshf(working);
|
|
let working = if_negative_invert(working,num);
|
|
let chunks = chunks(working);
|
|
chunks.iter().map(|v| char::from_u32(*v as u32).unwrap()).collect()
|
|
}
|
|
|
|
fn invoke_e5(n:f64)->i32{
|
|
(n*1e5).round() as i32
|
|
}
|
|
|
|
fn two_comp(n:i32, orig:f64)->i32{
|
|
if orig < 0.0{
|
|
n^-1 + 1
|
|
}
|
|
else {
|
|
n
|
|
}
|
|
}
|
|
|
|
fn lshf(n:i32)->i32{
|
|
n << 1
|
|
}
|
|
fn if_negative_invert(n:i32, orig:f64)->i32{
|
|
if orig < 0.0{
|
|
n ^ -1
|
|
}
|
|
else {
|
|
n
|
|
}
|
|
}
|
|
fn chunks(n:i32)->[u8;6]{
|
|
let mut chunks:[u8;6] = [0;6];
|
|
for i in 0..6{
|
|
chunks[i] = (n >> (5*i) ) as u8 & 0x1f;
|
|
if i != 5 {chunks[i] |= 0x20;}
|
|
chunks[i] += 63;
|
|
}
|
|
chunks
|
|
}
|
|
|
|
#[derive(serde::Serialize)]
|
|
pub struct RouteDraw{
|
|
pub color:String,
|
|
pub poly_line:String
|
|
}
|
|
|