summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs89
1 files changed, 35 insertions, 54 deletions
diff --git a/src/main.rs b/src/main.rs
index 65de274..8c94843 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,47 +1,7 @@
1use chrono::{naive::Days, prelude::*};
1use clap::{Args, Parser, Subcommand, ValueEnum}; 2use clap::{Args, Parser, Subcommand, ValueEnum};
2use syn::{manager::Manager, PrintResult}; 3use syn::{manager::Manager, PrintResult};
3 4
4// #[tokio::main(flavor = "current_thread")]
5// async fn main() {
6// let mut manager = Manager::load().unwrap();
7//
8// let feeds = vec![
9// "https://peppe.rs/index.xml",
10// "https://jvns.ca/atom.xml",
11// // "https://www.youtube.com/feeds/videos.xml?channel_id=UCuTaETsuCOkJ0H_GAztWt0Q",
12// ];
13//
14// for f in feeds {
15// match manager.add_feed(f).await {
16// Ok(s) => println!("{s}"),
17// Err(e) => println!("{e}"),
18// }
19// }
20//
21// for entry in manager.list_entries() {
22// println!("{entry}");
23// }
24//
25// match manager.store() {
26// Ok(s) => println!("{s}"),
27// Err(e) => eprintln!("{e}"),
28// }
29//
30// // let mut feed = Feed::new(url);
31//
32// // feed.resolve().await.unwrap();
33//
34// // let last_read = DateTime::parse_from_rfc2822("Mon, 16 Mar 2020 18:30:00 +0000")
35// // .unwrap()
36// // .with_timezone(&Utc);
37//
38// // feed.last_read = last_read;
39//
40// // for i in feed.unread().unwrap() {
41// // println!("{}", i.title.as_ref().unwrap().content)
42// // }
43// }
44
45#[derive(Parser)] 5#[derive(Parser)]
46#[command(author, version, about, long_about = None)] 6#[command(author, version, about, long_about = None)]
47struct Cli { 7struct Cli {
@@ -51,20 +11,31 @@ struct Cli {
51 11
52#[derive(Subcommand)] 12#[derive(Subcommand)]
53enum Command { 13enum Command {
14 /// track a new feed
54 Add(AddCommand), 15 Add(AddCommand),
55 List(ListCommand), 16 /// list all entries in reverse chronological order
17 ListEntries(ListEntriesCommand),
18 /// list all feeds in reverse chronological order
19 ListFeeds,
20 /// refresh feeds
56 Pull(PullCommand), 21 Pull(PullCommand),
57} 22}
58 23
24impl Default for Command {
25 fn default() -> Self {
26 Self::ListEntries(ListEntriesCommand { cutoff: None })
27 }
28}
29
59#[derive(Args)] 30#[derive(Args)]
60struct AddCommand { 31struct AddCommand {
61 url: String, 32 url: String,
62} 33}
63 34
64#[derive(Args)] 35#[derive(Args)]
65struct ListCommand { 36struct ListEntriesCommand {
66 #[arg(value_enum)] 37 #[arg(value_name = "CUTOFF")]
67 target: ListTarget, 38 cutoff: Option<u64>,
68} 39}
69 40
70#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)] 41#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
@@ -81,8 +52,8 @@ struct PullCommand {
81#[tokio::main(flavor = "current_thread")] 52#[tokio::main(flavor = "current_thread")]
82async fn main() { 53async fn main() {
83 let opts = Cli::parse(); 54 let opts = Cli::parse();
84 match &opts.command { 55 match &opts.command.unwrap_or_default() {
85 Some(Command::Add(AddCommand { url })) => { 56 Command::Add(AddCommand { url }) => {
86 let mut manager = Manager::load().unwrap_or_else(|e| { 57 let mut manager = Manager::load().unwrap_or_else(|e| {
87 eprintln!("{e}"); 58 eprintln!("{e}");
88 Manager::default() 59 Manager::default()
@@ -91,17 +62,28 @@ async fn main() {
91 manager.add_feed(&url).await.print(); 62 manager.add_feed(&url).await.print();
92 manager.store().print(); 63 manager.store().print();
93 } 64 }
94 Some(Command::List(ListCommand { target })) => { 65 Command::ListFeeds => {
66 let manager = Manager::load().unwrap_or_else(|e| {
67 eprintln!("{e}");
68 Manager::default()
69 });
70 manager.list_feeds().for_each(|f| println!("{f}"));
71 }
72 Command::ListEntries(ListEntriesCommand { cutoff }) => {
95 let manager = Manager::load().unwrap_or_else(|e| { 73 let manager = Manager::load().unwrap_or_else(|e| {
96 eprintln!("{e}"); 74 eprintln!("{e}");
97 Manager::default() 75 Manager::default()
98 }); 76 });
99 match target { 77 manager
100 ListTarget::Feeds => manager.list_feeds().for_each(|f| println!("{f}")), 78 .list_entries()
101 ListTarget::Entries => manager.list_entries().for_each(|f| println!("{f}")), 79 .filter(|entry| {
102 } 80 cutoff
81 .map(|c| Utc::now() - Days::new(c) <= entry.published)
82 .unwrap_or(true)
83 })
84 .for_each(|f| println!("{f}"));
103 } 85 }
104 Some(Command::Pull(PullCommand { .. })) => { 86 Command::Pull(PullCommand { .. }) => {
105 let mut manager = Manager::load().unwrap_or_else(|e| { 87 let mut manager = Manager::load().unwrap_or_else(|e| {
106 eprintln!("{e}"); 88 eprintln!("{e}");
107 Manager::default() 89 Manager::default()
@@ -112,6 +94,5 @@ async fn main() {
112 errors.iter().for_each(PrintResult::print); 94 errors.iter().for_each(PrintResult::print);
113 manager.store().print(); 95 manager.store().print();
114 } 96 }
115 _ => {}
116 } 97 }
117} 98}