chiark / gitweb /
Activity to view the instance rules.
authorSimon Tatham <anakin@pobox.com>
Fri, 19 Jan 2024 08:52:30 +0000 (08:52 +0000)
committerSimon Tatham <anakin@pobox.com>
Sat, 20 Jan 2024 10:18:24 +0000 (10:18 +0000)
This isn't used by anything yet, but it will be, when I implement
account registration directly from the client.

src/activity_stack.rs
src/file.rs
src/text.rs
src/tui.rs
src/types.rs

index f746c06271a5098281838c3f795ee1ed76c93836..2eaa5a02b02a27802318a03cda86ab6020e725a6 100644 (file)
@@ -32,6 +32,7 @@ pub enum UtilityActivity {
     PostReplyMenu(String),
     ThreadFile(String, bool),
     UserOptions(String),
+    InstanceRules,
 }
 
 #[derive(PartialEq, Eq, Debug, Clone)]
index 548048a30240e776e637539b72a42f584e98b98d..1e0994fd973e80a950c750b6a770180af6fd24cc 100644 (file)
@@ -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<Self::Item, ClientError> {
+        let inst = client.instance()?;
+        Ok(InstanceRulesDisplay::new(inst))
+    }
+}
+
+pub fn view_instance_rules(
+    client: &mut Client,
+) -> Result<Box<dyn ActivityState>, 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<RefCell<HashSet<String>>>,
     client: &mut Client,
index 09863303db79dceeabcf63f11b1d72cdcfdc1116..880c9913574add1768913679544d9b3dc99adf37 100644 (file)
@@ -3311,3 +3311,51 @@ impl TextFragment for ExamineUserDisplay {
         lines
     }
 }
+
+pub struct InstanceRulesDisplay {
+    desc: Paragraph,
+    rules: Vec<Paragraph>,
+    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<Highlight>,
+        _style: &dyn DisplayStyleGetter,
+    ) -> Vec<ColouredString> {
+        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
+    }
+}
index e7c7ede2b5b43c45d11185bc5816ac68ede0e871..1a6944841755ee07b5acc55563d0648a58a39ad2 100644 (file)
@@ -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")
index 20b8d40b762e80f53d02eee13f9678654a065b2b..3a4f009d6734f8a52d1d1105628baee5fd76811d 100644 (file)
@@ -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<InstanceRule>,
     // FIXME: lots of things are missing from here!
 }