From 8ebe8ac0c1c189f418a0d5a1ede9c8c838c2a9f3 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Fri, 19 Jan 2024 08:52:30 +0000 Subject: [PATCH] Activity to view the instance rules. This isn't used by anything yet, but it will be, when I implement account registration directly from the client. --- src/activity_stack.rs | 1 + src/file.rs | 34 ++++++++++++++++++++++++++++++ src/text.rs | 48 +++++++++++++++++++++++++++++++++++++++++++ src/tui.rs | 3 +++ src/types.rs | 8 ++++++++ 5 files changed, 94 insertions(+) diff --git a/src/activity_stack.rs b/src/activity_stack.rs index f746c06..2eaa5a0 100644 --- a/src/activity_stack.rs +++ b/src/activity_stack.rs @@ -32,6 +32,7 @@ pub enum UtilityActivity { PostReplyMenu(String), ThreadFile(String, bool), UserOptions(String), + InstanceRules, } #[derive(PartialEq, Eq, Debug, Clone)] diff --git a/src/file.rs b/src/file.rs index 548048a..1e0994f 100644 --- a/src/file.rs +++ b/src/file.rs @@ -2076,6 +2076,40 @@ pub fn view_single_post( Ok(Box::new(file)) } +struct InstanceRulesFileType; +impl FileType for InstanceRulesFileType { + type Item = InstanceRulesDisplay; + + fn get_from_client( + _id: &str, + client: &mut Client, + ) -> Result { + let inst = client.instance()?; + Ok(InstanceRulesDisplay::new(inst)) + } +} + +pub fn view_instance_rules( + client: &mut Client, +) -> Result, ClientError> { + let inst = client.instance()?; + let title = ColouredString::uniform( + &format!("Rules for Mastodon instance {}", inst.domain), + 'H', + ); + + let file = File::new( + client, + StaticSource::singleton("unused".to_owned()), + title, + InstanceRulesFileType, + Some(&FilePosition::item_top(isize::MIN).into()), + None, + false, + )?; + Ok(Box::new(file)) +} + pub fn view_thread( unfolded: Rc>>, client: &mut Client, diff --git a/src/text.rs b/src/text.rs index 0986330..880c991 100644 --- a/src/text.rs +++ b/src/text.rs @@ -3311,3 +3311,51 @@ impl TextFragment for ExamineUserDisplay { lines } } + +pub struct InstanceRulesDisplay { + desc: Paragraph, + rules: Vec, + blank: BlankLine, +} + +impl InstanceRulesDisplay { + pub fn new(inst: Instance) -> Self { + let desc = + Paragraph::new().add(ColouredString::plain(&inst.description)); + + let rules = inst + .rules + .iter() + .map(|r| { + Paragraph::new().add(ColouredString::plain(&format!( + "{}. {}", + &r.id, &r.text + ))) + }) + .collect(); + + InstanceRulesDisplay { + desc, + rules, + blank: BlankLine::new(), + } + } +} + +impl TextFragment for InstanceRulesDisplay { + fn render_highlighted( + &self, + width: usize, + _highlight: Option, + _style: &dyn DisplayStyleGetter, + ) -> Vec { + let mut lines = Vec::new(); + + push_fragment(&mut lines, self.desc.render(width)); + for rule in self.rules.iter() { + push_fragment(&mut lines, self.blank.render(width)); + push_fragment(&mut lines, rule.render(width)); + } + lines + } +} diff --git a/src/tui.rs b/src/tui.rs index e7c7ede..1a69448 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -1029,6 +1029,9 @@ impl TuiLogicalState { Activity::Util(UtilityActivity::UserOptions(ref id)) => { user_options_menu(client, id) } + Activity::Util(UtilityActivity::InstanceRules) => { + view_instance_rules(client) + } }; result.expect("FIXME: need to implement the Error Log here") diff --git a/src/types.rs b/src/types.rs index 20b8d40..3a4f009 100644 --- a/src/types.rs +++ b/src/types.rs @@ -373,10 +373,18 @@ pub struct InstanceConfig { pub urls: InstanceUrlConfig, } +#[derive(Deserialize, Debug, Clone)] +pub struct InstanceRule { + pub id: String, + pub text: String, +} + #[derive(Deserialize, Debug, Clone)] pub struct Instance { pub domain: String, + pub description: String, pub configuration: InstanceConfig, + pub rules: Vec, // FIXME: lots of things are missing from here! } -- 2.30.2