From 67a31dbebdd7fa305b99215d240c32f95d2aecfa Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Fri, 29 Dec 2023 11:49:24 +0000 Subject: [PATCH] Now we try to actually fetch a feed. It doesn't work! JSON parsing error. --- src/client.rs | 18 +++++++++--------- src/file.rs | 38 ++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/menu.rs | 3 ++- src/tui.rs | 26 ++++++++++++++++++-------- 5 files changed, 68 insertions(+), 18 deletions(-) create mode 100644 src/file.rs diff --git a/src/client.rs b/src/client.rs index 91111dd..cabbe33 100644 --- a/src/client.rs +++ b/src/client.rs @@ -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 index 0000000..7f9b701 --- /dev/null +++ b/src/file.rs @@ -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 { + client.fetch_feed(&id, FeedExtend::Initial)?; + + Ok(FeedFile { + id: id, + }) + } +} + +impl ActivityState for FeedFile { + fn draw(&self, _w: usize, _h: usize) + -> (Vec, 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, ClientError> +{ + let file = FeedFile::new(FeedId::Home, client)?; + Ok(Box::new(file)) +} diff --git a/src/lib.rs b/src/lib.rs index 0ea6840..aa2a62d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,3 +11,4 @@ pub mod client; pub mod activity_stack; pub mod tui; pub mod menu; +pub mod file; diff --git a/src/menu.rs b/src/menu.rs index 20cf350..d5be77a 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -181,7 +181,8 @@ pub fn main_menu() -> Box { 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); diff --git a/src/tui.rs b/src/tui.rs index 35e7005..ab11d73 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -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, } -fn new_activity_state(activity: Activity, _client: &mut Client) -> +fn new_activity_state(activity: Activity, client: &mut Client) -> Box { - 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 { -- 2.30.2