diff options
author | Harald Eilertsen <haraldei@anduin.net> | 2019-02-23 22:35:08 +0100 |
---|---|---|
committer | Harald Eilertsen <haraldei@anduin.net> | 2019-02-23 22:35:08 +0100 |
commit | 2feeca134368f128e2133adc4be91d9bd17c0dc5 (patch) | |
tree | 49e5652a7002c6f68fceaa842e06f500adb7b3a5 /src | |
parent | f1b68ffc0f539b7782ed5cc593cbebc360fe4791 (diff) | |
download | oslobike-2feeca134368f128e2133adc4be91d9bd17c0dc5.tar.gz oslobike-2feeca134368f128e2133adc4be91d9bd17c0dc5.tar.bz2 oslobike-2feeca134368f128e2133adc4be91d9bd17c0dc5.zip |
Add api to fetch availability data as well.
Diffstat (limited to 'src')
-rw-r--r-- | src/api.rs | 17 | ||||
-rw-r--r-- | src/lib.rs | 2 | ||||
-rw-r--r-- | src/main.rs | 8 | ||||
-rw-r--r-- | src/station.rs | 18 |
4 files changed, 42 insertions, 3 deletions
@@ -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<Vec<StationAvailability>> { + let response_json = self.client.get(&url_for("stations/availability")) + .send()? + .text()?; + + let v: StationAvailabilityContainer = serde_json::from_str(&response_json)?; + Ok(v.stations) + } } @@ -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<Station> } + + +#[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<StationAvailability>, +} |