ソースを参照

Add link API.

Paul Lietar 9 年 前
コミット
9747bbc470
2 ファイル変更84 行追加0 行削除
  1. 1 0
      src/lib.rs
  2. 83 0
      src/link.rs

+ 1 - 0
src/lib.rs

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

+ 83 - 0
src/link.rs

@@ -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,
+        }
+    }
+}
+