diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 89 |
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 @@ | |||
1 | use chrono::{naive::Days, prelude::*}; | ||
1 | use clap::{Args, Parser, Subcommand, ValueEnum}; | 2 | use clap::{Args, Parser, Subcommand, ValueEnum}; |
2 | use syn::{manager::Manager, PrintResult}; | 3 | use 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)] |
47 | struct Cli { | 7 | struct Cli { |
@@ -51,20 +11,31 @@ struct Cli { | |||
51 | 11 | ||
52 | #[derive(Subcommand)] | 12 | #[derive(Subcommand)] |
53 | enum Command { | 13 | enum 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 | ||
24 | impl Default for Command { | ||
25 | fn default() -> Self { | ||
26 | Self::ListEntries(ListEntriesCommand { cutoff: None }) | ||
27 | } | ||
28 | } | ||
29 | |||
59 | #[derive(Args)] | 30 | #[derive(Args)] |
60 | struct AddCommand { | 31 | struct AddCommand { |
61 | url: String, | 32 | url: String, |
62 | } | 33 | } |
63 | 34 | ||
64 | #[derive(Args)] | 35 | #[derive(Args)] |
65 | struct ListCommand { | 36 | struct 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")] |
82 | async fn main() { | 53 | async 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 | } |