PostReplyMenu(String),
ThreadFile(String, bool),
UserOptions(String),
+ InstanceRules,
}
#[derive(PartialEq, Eq, Debug, Clone)]
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,
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
+ }
+}
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")
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!
}