diff --git a/core/src/spotify_id.rs b/core/src/spotify_id.rs index 6adc0206..17327b47 100644 --- a/core/src/spotify_id.rs +++ b/core/src/spotify_id.rs @@ -1,4 +1,4 @@ -use std; +use std::convert::TryInto; use std::fmt; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] @@ -8,42 +8,24 @@ pub enum SpotifyAudioType { NonPlayable, } -impl SpotifyAudioType { - fn from_str(src: &str) -> SpotifyAudioType { - match src { +impl From<&str> for SpotifyAudioType { + fn from(v: &str) -> Self { + match v { "track" => SpotifyAudioType::Track, "episode" => SpotifyAudioType::Podcast, _ => SpotifyAudioType::NonPlayable, } } +} - fn to_str(self) -> &'static str { +impl Into<&str> for SpotifyAudioType { + fn into(self) -> &'static str { match self { SpotifyAudioType::Track => "track", SpotifyAudioType::Podcast => "episode", SpotifyAudioType::NonPlayable => "unknown", } } - - fn len(self) -> usize { - match self { - SpotifyAudioType::Track => 5, - SpotifyAudioType::Podcast => 7, - SpotifyAudioType::NonPlayable => 7, - } - } -} - -impl std::convert::From<&str> for SpotifyAudioType { - fn from(v: &str) -> Self { - SpotifyAudioType::from_str(v) - } -} - -impl std::convert::Into<&str> for SpotifyAudioType { - fn into(self) -> &'static str { - self.to_str() - } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] @@ -119,14 +101,10 @@ impl SpotifyId { /// /// The resulting `SpotifyId` will default to a `SpotifyAudioType::TRACK`. pub fn from_raw(src: &[u8]) -> Result { - if src.len() != SpotifyId::SIZE { - return Err(SpotifyIdError); - }; - - let mut dst = [0u8; SpotifyId::SIZE]; - dst.copy_from_slice(src); - - Ok(SpotifyId::as_track(u128::from_be_bytes(dst))) + match src.try_into() { + Ok(dst) => Ok(SpotifyId::as_track(u128::from_be_bytes(dst))), + Err(_) => Err(SpotifyIdError), + } } /// Parses a [Spotify URI] into a `SpotifyId`. @@ -143,10 +121,7 @@ impl SpotifyId { return Err(SpotifyIdError); } - let mut id = match SpotifyId::from_base62(&src[id_i..]) { - Ok(v) => v, - Err(e) => return Err(e), - }; + let mut id = SpotifyId::from_base62(&src[id_i..])?; // Slice offset by 8 as we are skipping the "spotify:" prefix. id.audio_type = src[8..id_i - 1].into(); @@ -225,10 +200,11 @@ impl SpotifyId { pub fn to_uri(&self) -> String { // 8 chars for the "spotify:" prefix + 1 colon + 22 chars base62 encoded ID = 31 // + unknown size audio_type. - let mut dst = String::with_capacity(31 + self.audio_type.len()); + let audio_type: &str = self.audio_type.into(); + let mut dst = String::with_capacity(31 + audio_type.len()); dst.push_str("spotify:"); - dst.push_str(self.audio_type.into()); - dst.push_str(":"); + dst.push_str(audio_type); + dst.push(':'); dst.push_str(&self.to_base62()); dst