aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs26
-rw-r--r--src/structs.rs54
2 files changed, 80 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..8c0ec89
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,26 @@
+extern crate rss;
+
+mod structs;
+
+use std::fs::File;
+use std::io::BufReader;
+use rss::{Channel, Item};
+use structs::*;
+
+fn main() {
+ let file = File::open("rss.xml").unwrap();
+ let channel = Channel::read_from(BufReader::new(file)).unwrap();
+ let podcast = Podcast::from(channel);
+
+ for title in podcast.list_titles() {
+ println!("{}", title);
+ }
+ let ep = &podcast.episodes()[0];
+ println!(
+ "{}",
+ match ep.download_url() {
+ Some(val) => val,
+ None => "",
+ }
+ );
+}
diff --git a/src/structs.rs b/src/structs.rs
new file mode 100644
index 0000000..626072b
--- /dev/null
+++ b/src/structs.rs
@@ -0,0 +1,54 @@
+use std::fs::File;
+use std::io::BufReader;
+use rss::{Channel, Item};
+
+pub struct Podcast(Channel);
+
+pub struct Episode(Item);
+
+impl From<Channel> for Podcast {
+ fn from(channel: Channel) -> Podcast {
+ Podcast(channel)
+ }
+}
+
+impl From<Item> for Episode {
+ fn from(item: Item) -> Episode {
+ Episode(item)
+ }
+}
+
+impl Podcast {
+ pub fn episodes(&self) -> Vec<Episode> {
+ let mut result = Vec::new();
+
+ let items = self.0.items().to_vec();
+ for item in items {
+ result.push(Episode::from(item));
+ }
+ result
+ }
+
+
+ pub fn list_titles(&self) -> Vec<&str> {
+ let mut result = Vec::new();
+
+ let items = self.0.items();
+ for item in items {
+ match item.title() {
+ Some(val) => result.push(val),
+ None => (),
+ }
+ }
+ result
+ }
+}
+
+impl Episode {
+ pub fn download_url(&self) -> Option<&str> {
+ match self.0.enclosure() {
+ Some(val) => Some(val.url()),
+ None => None,
+ }
+ }
+}