Add link API.

This commit is contained in:
Paul Lietar 2016-01-26 22:25:13 +00:00
parent f822031ce3
commit 9747bbc470
2 changed files with 84 additions and 0 deletions

View file

@ -41,5 +41,6 @@ pub mod metadata;
pub mod player;
pub mod session;
pub mod spirc;
pub mod link;
mod stream;
mod zeroconf;

83
src/link.rs Normal file
View file

@ -0,0 +1,83 @@
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<Link, ()> {
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<MetadataRef<Track>> {
match *self {
Link::Track { id, .. } => Some(session.metadata::<Track>(id)),
_ => None,
}
}
pub fn as_album(&self, session: &Session) -> Option<MetadataRef<Album>> {
match *self {
Link::Album { id, .. } => Some(session.metadata::<Album>(id)),
_ => None,
}
}
pub fn as_artist(&self, session: &Session) -> Option<MetadataRef<Artist>> {
match *self {
Link::Artist { id, .. } => Some(session.metadata::<Artist>(id)),
_ => None,
}
}
}