rustio 0.0.2

Rust API wrapper for radio-browser.info
Documentation
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),
        }
    }
}