1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
use restson::{Error, RestClient};

use crate::{Codec, Country, Language, State, Station, Stats, Tag};
use crate::{
    CodecResponse, CountryResponse, LanguageResponse, StateResponse, StationResponse, TagResponse,
};
use crate::{PlayableStationUrl, StationSearch};

pub struct Client {
    rest_client: RestClient,
}

impl Client {
    pub fn new(base_url: &str) -> Client {
        let rest_client = match RestClient::new(base_url) {
            Ok(rc) => rc,
            Err(_) => panic!("Could not create rest_client!"),
        };

        Client { rest_client }
    }

    pub fn get_station_by_id(&mut self, id: u32) -> Result<Option<Station>, Error> {
        match self.rest_client.get(id)? {
            StationResponse::Station(station) => Ok(Some(station)),
            StationResponse::Stations(mut stations) => Ok(stations.pop()),
        }
    }

    pub fn get_all_stations(&mut self) -> Result<Vec<Station>, Error> {
        match self.rest_client.get(())? {
            StationResponse::Stations(stations) => Ok(stations),
            _ => Err(Error::InvalidValue),
        }
    }

    pub fn get_all_codecs(&mut self) -> Result<Vec<Codec>, Error> {
        match self.rest_client.get(())? {
            CodecResponse::Codecs(codecs) => Ok(codecs),
            _ => Err(Error::InvalidValue),
        }
    }

    pub fn get_all_countries(&mut self) -> Result<Vec<Country>, Error> {
        match self.rest_client.get(())? {
            CountryResponse::Countries(countries) => Ok(countries),
            _ => Err(Error::InvalidValue),
        }
    }

    pub fn get_all_languages(&mut self) -> Result<Vec<Language>, Error> {
        match self.rest_client.get(())? {
            LanguageResponse::Languages(languages) => Ok(languages),
            _ => Err(Error::InvalidValue),
        }
    }

    pub fn get_all_states(&mut self) -> Result<Vec<State>, Error> {
        match self.rest_client.get(())? {
            StateResponse::States(states) => Ok(states),
            _ => Err(Error::InvalidValue),
        }
    }

    pub fn get_all_tags(&mut self) -> Result<Vec<Tag>, Error> {
        match self.rest_client.get(())? {
            TagResponse::Tags(tags) => Ok(tags),
            _ => Err(Error::InvalidValue),
        }
    }

    pub fn get_stats(&mut self) -> Result<Stats, Error> {
        self.rest_client.get(())
    }

    pub fn get_playable_station_url(&mut self, station: Station) -> Result<String, Error> {
        let result: PlayableStationUrl = self.rest_client.get(station)?;
        Ok(result.url)
    }

    pub fn search(&mut self, data: StationSearch) -> Result<Vec<Station>, Error> {
        match self.rest_client.post_capture((), &data)? {
            StationResponse::Stations(stations) => Ok(stations),
            _ => Err(Error::InvalidValue),
        }
    }
}