use util::SpotifyId; use session::Session; use metadata::{MetadataRef, Album, Artist, Track}; #[derive(Debug,Clone)] pub enum Link { Track { id: SpotifyId, offset: u32, }, Album { id: SpotifyId, }, Artist { id: SpotifyId, }, /* Search, Playlist, Profile, Starred, LocalTrack, Image, */ } impl Link { pub fn from_str(uri: &str) -> Result { let mut parts = uri.split(':'); if parts.next() != Some("spotify") { return Err(()) } match parts.next() { Some("track") => parts.next() .map(SpotifyId::from_base62) .map(|id| Link::Track { id: id, offset: 0, }) .ok_or(()), Some("album") => parts.next() .map(SpotifyId::from_base62) .map(|id| Link::Album { id: id, }) .ok_or(()), Some("artist") => parts.next() .map(SpotifyId::from_base62) .map(|id| Link::Artist { id: id, }) .ok_or(()), _ => Err(()) } } pub fn as_track(&self, session: &Session) -> Option> { match *self { Link::Track { id, .. } => Some(session.metadata::(id)), _ => None, } } pub fn as_album(&self, session: &Session) -> Option> { match *self { Link::Album { id, .. } => Some(session.metadata::(id)), _ => None, } } pub fn as_artist(&self, session: &Session) -> Option> { match *self { Link::Artist { id, .. } => Some(session.metadata::(id)), _ => None, } } }