link.rs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. use util::SpotifyId;
  2. use session::Session;
  3. use metadata::{MetadataRef, Album, Artist, Track};
  4. #[derive(Debug,Clone)]
  5. pub enum Link {
  6. Track {
  7. id: SpotifyId,
  8. offset: u32,
  9. },
  10. Album {
  11. id: SpotifyId,
  12. },
  13. Artist {
  14. id: SpotifyId,
  15. },
  16. /*
  17. Search,
  18. Playlist,
  19. Profile,
  20. Starred,
  21. LocalTrack,
  22. Image,
  23. */
  24. }
  25. impl Link {
  26. pub fn from_str(uri: &str) -> Result<Link, ()> {
  27. let mut parts = uri.split(':');
  28. if parts.next() != Some("spotify") {
  29. return Err(())
  30. }
  31. match parts.next() {
  32. Some("track") => parts.next()
  33. .map(SpotifyId::from_base62)
  34. .map(|id| Link::Track {
  35. id: id,
  36. offset: 0,
  37. })
  38. .ok_or(()),
  39. Some("album") => parts.next()
  40. .map(SpotifyId::from_base62)
  41. .map(|id| Link::Album {
  42. id: id,
  43. })
  44. .ok_or(()),
  45. Some("artist") => parts.next()
  46. .map(SpotifyId::from_base62)
  47. .map(|id| Link::Artist {
  48. id: id,
  49. })
  50. .ok_or(()),
  51. _ => Err(())
  52. }
  53. }
  54. pub fn as_track(&self, session: &Session) -> Option<MetadataRef<Track>> {
  55. match *self {
  56. Link::Track { id, .. } => Some(session.metadata::<Track>(id)),
  57. _ => None,
  58. }
  59. }
  60. pub fn as_album(&self, session: &Session) -> Option<MetadataRef<Album>> {
  61. match *self {
  62. Link::Album { id, .. } => Some(session.metadata::<Album>(id)),
  63. _ => None,
  64. }
  65. }
  66. pub fn as_artist(&self, session: &Session) -> Option<MetadataRef<Artist>> {
  67. match *self {
  68. Link::Artist { id, .. } => Some(session.metadata::<Artist>(id)),
  69. _ => None,
  70. }
  71. }
  72. }