chiark / gitweb /
Now we try to actually fetch a feed.
authorSimon Tatham <anakin@pobox.com>
Fri, 29 Dec 2023 11:49:24 +0000 (11:49 +0000)
committerSimon Tatham <anakin@pobox.com>
Fri, 29 Dec 2023 18:17:34 +0000 (18:17 +0000)
It doesn't work! JSON parsing error.

src/client.rs
src/file.rs [new file with mode: 0644]
src/lib.rs
src/menu.rs
src/tui.rs

index 91111dd2f2be5ab1e017c477886684612c808901..cabbe335e4388ce431be72f376c7e88592cbf146 100644 (file)
@@ -204,16 +204,16 @@ impl Client {
         Ok(st)
     }
 
-    pub fn fetch_feed(&mut self, id: FeedId, ext: FeedExtend) ->
+    pub fn fetch_feed(&mut self, id: &FeedId, ext: FeedExtend) ->
         Result<(), ClientError>
     {
         if ext == FeedExtend::Initial {
-            if self.feeds.contains_key(&id) {
+            if self.feeds.contains_key(id) {
                 // No need to fetch the initial contents - we already have some
                 return Ok(());
             }
         } else {
-            assert!(self.feeds.contains_key(&id),
+            assert!(self.feeds.contains_key(id),
                     "Shouldn't be extending a feed we've never fetched")
         }
 
@@ -228,10 +228,10 @@ impl Client {
             FeedId::Hashtag(ref tag) => {
                 Req::get(&format!("timelines/tag/{}", &tag))
             },
-            FeedId::User(ref id, boosts, replies) => {
+            FeedId::User(id, boosts, replies) => {
                 Req::get(&format!("accounts/{}/statuses", id))
-                    .param("exclude_reblogs", boosts == Boosts::Hide)
-                    .param("exclude_replies", replies == Replies::Hide)
+                    .param("exclude_reblogs", *boosts == Boosts::Hide)
+                    .param("exclude_replies", *replies == Replies::Hide)
             },
         };
 
@@ -263,19 +263,19 @@ impl Client {
         let ids = sts.iter().rev().map(|st| st.id.clone()).collect();
         match ext {
             FeedExtend::Initial => {
-                self.feeds.insert(id, Feed {
+                self.feeds.insert(id.clone(), Feed {
                     ids: ids,
                     origin: 0,
                 });
             },
             FeedExtend::Future => {
-                let feed = self.feeds.get_mut(&id).unwrap();
+                let feed = self.feeds.get_mut(id).unwrap();
                 for id in ids.iter() {
                     feed.ids.push_back(id.to_string());
                 }
             },
             FeedExtend::Past => {
-                let feed = self.feeds.get_mut(&id).unwrap();
+                let feed = self.feeds.get_mut(id).unwrap();
                 for id in ids.iter().rev() {
                     feed.ids.push_front(id.to_string());
                     feed.origin += 1;
diff --git a/src/file.rs b/src/file.rs
new file mode 100644 (file)
index 0000000..7f9b701
--- /dev/null
@@ -0,0 +1,38 @@
+use super::client::{Client, ClientError, FeedId, FeedExtend};
+use super::coloured_string::ColouredString;
+use super::tui::{
+    ActivityState, CursorPosition, LogicalAction,
+    OurKey,
+};
+
+struct FeedFile {
+    id: FeedId,
+}
+
+impl FeedFile {
+    fn new(id: FeedId, client: &mut Client) -> Result<Self, ClientError> {
+        client.fetch_feed(&id, FeedExtend::Initial)?;
+
+        Ok(FeedFile {
+            id: id,
+        })
+    }
+}
+
+impl ActivityState for FeedFile {
+    fn draw(&self, _w: usize, _h: usize)
+            -> (Vec<ColouredString>, CursorPosition) {
+        (Vec::new(), CursorPosition::None) // FIXME
+    }
+
+    fn handle_keypress(&mut self, _key: OurKey) -> LogicalAction {
+        LogicalAction::Nothing // FIXME
+    }
+}
+
+pub fn home_timeline(client: &mut Client) ->
+    Result<Box<dyn ActivityState>, ClientError>
+{
+    let file = FeedFile::new(FeedId::Home, client)?;
+    Ok(Box::new(file))
+}
index 0ea68400d73e9d4b809312b1654f22b5ee2543fa..aa2a62d418a465a7982246d8c92f638af59e3ea0 100644 (file)
@@ -11,3 +11,4 @@ pub mod client;
 pub mod activity_stack;
 pub mod tui;
 pub mod menu;
+pub mod file;
index 20cf35077be42285f7e49726580efbe9b1431641..d5be77a79216d9fccf257756e15779be4a0f0a79 100644 (file)
@@ -181,7 +181,8 @@ pub fn main_menu() -> Box<dyn ActivityState> {
     let mut menu = Menu::new(
         ColouredString::uniform("Mastodonochrome Main Menu", 'H'), true);
 
-    menu.add_action(Pr('H'), "Home timeline", LogicalAction::NYI);
+    menu.add_action(Pr('H'), "Home timeline", LogicalAction::Goto(
+        NonUtilityActivity::HomeTimelineFile.into()));
     menu.add_blank_line();
     menu.add_action(Pr('P'), "Public timeline (all servers)",
                     LogicalAction::NYI);
index 35e70054d21970aa86e35d6bf6256eff9a81f130..ab11d73dc43799b7cdf95c38f9403faddf570f0b 100644 (file)
@@ -17,6 +17,7 @@ use super::activity_stack::*;
 use super::client::Client;
 use super::coloured_string::{ColouredString, ColouredStringSlice};
 use super::menu::*;
+use super::file::*;
 use super::auth::AuthError;
 
 fn ratatui_style_from_colour(colour: char) -> Style {
@@ -346,17 +347,26 @@ struct TuiLogicalState {
     activity_state: Box<dyn ActivityState>,
 }
 
-fn new_activity_state(activity: Activity, _client: &mut Client) ->
+fn new_activity_state(activity: Activity, client: &mut Client) ->
     Box<dyn ActivityState>
 {
-    match activity {
-        Activity::NonUtil(NonUtilityActivity::MainMenu) => main_menu(),
-        Activity::Util(UtilityActivity::UtilsMenu) => utils_menu(),
-        Activity::Util(UtilityActivity::ExitMenu) => exit_menu(),
-        Activity::Util(UtilityActivity::LogsMenu1) => logs_menu_1(),
-        Activity::Util(UtilityActivity::LogsMenu2) => logs_menu_2(),
+    let result = match activity {
+        Activity::NonUtil(NonUtilityActivity::MainMenu) =>
+            Ok(main_menu()),
+        Activity::Util(UtilityActivity::UtilsMenu) =>
+            Ok(utils_menu()),
+        Activity::Util(UtilityActivity::ExitMenu) =>
+            Ok(exit_menu()),
+        Activity::Util(UtilityActivity::LogsMenu1) =>
+            Ok(logs_menu_1()),
+        Activity::Util(UtilityActivity::LogsMenu2) =>
+            Ok(logs_menu_2()),
+        Activity::NonUtil(NonUtilityActivity::HomeTimelineFile) =>
+            home_timeline(client),
         _ => panic!("FIXME"),
-    }
+    };
+
+    result.expect("FIXME: need to implement the Error Log here")
 }
 
 impl TuiLogicalState {