sbb-api 0.1.0

A library to interact with sbb.ch's unofficial API
Documentation
use std::fmt::Formatter;

use serde::{Deserialize, Serialize};
use crate::models::verbindung::Verbindung;

#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct VerbindungenResults {
    pub verbindungen: Vec<Verbindung>,
    pub earlier_url: Option<String>,
    pub late_url: Option<String>,
    pub verbindung_preis_url: String,
}

impl std::fmt::Display for VerbindungenResults {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        write!(f, "VerbindungenResults{{\n")?;
        for verb in &self.verbindungen {
            write!(f, "{},\n", verb)?;
        }
        write!(f, "earlier={:?}, late={:?}, preis={}",
               self.earlier_url,
               self.late_url,
               self.verbindung_preis_url
        )
    }
}

#[cfg(test)]
mod test {
    use std::fs;

    use crate::models::results::VerbindungenResults;

    #[test]
    fn parse_verbindungen_1() {
        let f = fs::read("./resources/test/verbindungen-1.json")
            .expect("File not found");

        let vr: VerbindungenResults = serde_json::from_str(
            std::str::from_utf8(&f)
                .expect("Unable to parse file into string"))
            .expect("Unable to decode from JSON");

        assert_gt!(vr.verbindungen.len(), 0);
    }

    #[test]
    fn parse_verbindungen_2() {
        let f = fs::read("./resources/test/verbindungen-2.json")
            .expect("File not found");

        let vr: VerbindungenResults = serde_json::from_str(
            std::str::from_utf8(&f)
                .expect("Unable to parse file into string"))
            .expect("Unable to decode from JSON");

        assert_gt!(vr.verbindungen.len(), 0);
    }

    #[test]
    fn parse_verbindungen_3() {
        let f = fs::read("./resources/test/verbindungen-3.json")
            .expect("File not found");

        let vr: VerbindungenResults = serde_json::from_str(
            std::str::from_utf8(&f)
                .expect("Unable to parse file into string"))
            .expect("Unable to decode from JSON");

        assert_gt!(vr.verbindungen.len(), 0);

        for v in vr.verbindungen {
            println!("{}", v);
        }
    }

    #[test]
    fn parse_verbindungen_4() {
        let f = fs::read("./resources/test/verbindungen-4.json")
            .expect("File not found");

        let vr: VerbindungenResults = serde_json::from_str(
            std::str::from_utf8(&f)
                .expect("Unable to parse file into string"))
            .expect("Unable to decode from JSON");

        assert_gt!(vr.verbindungen.len(), 0);

        for v in vr.verbindungen {
            println!("{}", v);
        }
    }

    #[test]
    fn parse_verbindungen_5() {
        let f = fs::read("./resources/test/verbindungen-5.json")
            .expect("File not found");

        let vr: VerbindungenResults = serde_json::from_str(
            std::str::from_utf8(&f)
                .expect("Unable to parse file into string"))
            .expect("Unable to decode from JSON");

        assert_gt!(vr.verbindungen.len(), 0);
        assert_eq!(vr.verbindungen[0].duration().as_secs(), (2 * 60 + 47) * 60);

        for v in vr.verbindungen {
            println!("{:?} {}", v.as_ref().duration(), v);
        }
    }
}