sunk 0.1.2

Rust bindings for the Subsonic music streaming API
Documentation
use serde::de::{Deserialize, Deserializer};
use std::result;

use query::Query;
use {Client, Result};

#[derive(Debug)]
pub struct RadioStation {
    id: usize,
    pub name: String,
    pub stream_url: String,
    pub homepage_url: Option<String>,
}

impl<'de> Deserialize<'de> for RadioStation {
    fn deserialize<D>(de: D) -> result::Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        #[derive(Deserialize)]
        #[serde(rename_all = "camelCase")]
        struct _Station {
            id: String,
            name: String,
            stream_url: String,
            homepage_url: Option<String>,
        }
        let raw = _Station::deserialize(de)?;
        Ok(RadioStation {
            id: raw.id.parse().unwrap(),
            name: raw.name,
            stream_url: raw.stream_url,
            homepage_url: raw.homepage_url,
        })
    }
}

impl RadioStation {
    pub fn id(&self) -> usize {
        self.id
    }

    pub fn list(client: &Client) -> Result<Vec<RadioStation>> {
        #[allow(non_snake_case)]
        let internetRadioStation = client.get("getInternetRadioStations", Query::none())?;
        Ok(get_list_as!(internetRadioStation, RadioStation))
    }

    pub fn create(client: &Client, name: &str, url: &str, homepage: Option<&str>) -> Result<()> {
        let args = Query::with("name", name)
            .arg("streamUrl", url)
            .arg("homepageUrl", homepage)
            .build();
        client.get("createInternetRadioStation", args)?;
        Ok(())
    }

    pub fn update(&self, client: &Client) -> Result<()> {
        let args = Query::with("id", self.id)
            .arg("streamUrl", self.stream_url.as_str())
            .arg("name", self.name.as_str())
            .arg(
                "homepageUrl",
                self.homepage_url.as_ref().map(|s| s.as_str()),
            )
            .build();
        client.get("updateInternetRadioStation", args)?;
        Ok(())
    }

    pub fn delete(&self, client: &Client) -> Result<()> {
        client.get("deleteInternetRadioStation", Query::with("id", self.id))?;
        Ok(())
    }
}