From 2feeca134368f128e2133adc4be91d9bd17c0dc5 Mon Sep 17 00:00:00 2001 From: Harald Eilertsen Date: Sat, 23 Feb 2019 22:35:08 +0100 Subject: Add api to fetch availability data as well. --- src/api.rs | 17 ++++++++++++++++- src/lib.rs | 2 +- src/main.rs | 8 +++++++- src/station.rs | 18 ++++++++++++++++++ 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/api.rs b/src/api.rs index d44c2c4..6c85d76 100644 --- a/src/api.rs +++ b/src/api.rs @@ -24,7 +24,12 @@ use reqwest::{ }, Client, }; -use crate::station::{Station, StationContainer}; +use crate::station::{ + Station, + StationAvailability, + StationAvailabilityContainer, + StationContainer +}; use crate::error::ApiResult; const API_BASE: &'static str = "https://oslobysykkel.no/api/v1"; @@ -65,4 +70,14 @@ impl Api { let v: StationContainer = serde_json::from_str(&response_json)?; Ok(v.stations) } + + /// Fetch availability status for all stations + pub fn station_availability(&self) -> ApiResult> { + let response_json = self.client.get(&url_for("stations/availability")) + .send()? + .text()?; + + let v: StationAvailabilityContainer = serde_json::from_str(&response_json)?; + Ok(v.stations) + } } diff --git a/src/lib.rs b/src/lib.rs index c08c2cb..8bd9aed 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,4 +22,4 @@ mod station; // Re export the important parts of the API pub use api::Api; -pub use station::Station; +pub use station::{Station, StationAvailability}; diff --git a/src/main.rs b/src/main.rs index 53752c0..014e8b2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,10 +22,16 @@ use oslobike; fn main() { let api_key = dotenv::var("OSLOBIKE_APIKEY").expect("No API key defined!"); let api = oslobike::Api::new(api_key).unwrap(); + let stations = api.stations().unwrap(); + let station_availability = api.station_availability().unwrap(); + for station in api.stations().unwrap() { - println!("{:>4} {}: {}", + let a = station_availability.iter().find(|s| s.id == station.id).unwrap(); + println!("{:>4} {:<32}: {:>2} bikes, {:>2} locks of {:>2} total", station.id, station.title, + a.availability.bikes, + a.availability.locks, station.number_of_locks); } } diff --git a/src/station.rs b/src/station.rs index 1d52fb4..49f2cd1 100644 --- a/src/station.rs +++ b/src/station.rs @@ -30,3 +30,21 @@ pub struct Station { pub(crate) struct StationContainer { pub stations: Vec } + + +#[derive(Debug, Deserialize)] +pub struct Availability { + pub bikes: i16, + pub locks: i16, +} + +#[derive(Debug, Deserialize)] +pub struct StationAvailability { + pub id: usize, + pub availability: Availability, +} + +#[derive(Debug, Deserialize)] +pub(crate) struct StationAvailabilityContainer { + pub stations: Vec, +} -- cgit v1.2.3