From bc7d90793bbb5aba22e51bc689a6a7ff9df309e3 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Fri, 26 Jan 2024 07:40:01 +0000 Subject: [PATCH] Add a text::ErrorLogEntry type to format errors. This works towards implementing the TUI Error Log instead of panicking or terminating with a deliberate error message. --- src/text.rs | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) diff --git a/src/text.rs b/src/text.rs index 7b28033..be1ab9e 100644 --- a/src/text.rs +++ b/src/text.rs @@ -3335,3 +3335,131 @@ impl TextFragment for InstanceRulesDisplay { lines } } + +pub struct ErrorLogEntry { + sep: SeparatorLine, + title: Paragraph, + paras: Vec, + blank: BlankLine, +} + +impl ErrorLogEntry { + pub fn new(err: ClientError, date: DateTime) -> Self { + let sep = SeparatorLine::new(Some(date), false, false); + let blank = BlankLine::new(); + let mut paras = Vec::new(); + let mut title = Paragraph::new().add(ColouredString::plain("Type: ")); + + fn log_msg(paras: &mut Vec, msg: String) { + paras.push(Paragraph::new().add(ColouredString::plain(&msg))); + } + fn log_status( + paras: &mut Vec, + status: reqwest::StatusCode, + ) { + paras.push(Paragraph::new().add(ColouredString::plain(&format!( + "HTTP status: {}", + status.to_string() + )))) + } + fn log_url(paras: &mut Vec, url: String) { + paras.push( + Paragraph::new() + .add(ColouredString::plain("while fetching URL: ")) + .add(ColouredString::uniform(&url, 'u')), + ) + } + + match err { + ClientError::Internal(msg) => { + title.push_text( + ColouredString::uniform("internal error", 'r'), + false, + ); + log_msg(&mut paras, msg); + } + ClientError::UrlParse(url, msg) => { + title.push_text( + ColouredString::plain("URL parsing error"), + false, + ); + log_msg(&mut paras, msg); + log_url(&mut paras, url); + } + ClientError::UrlFetchNet(url, msg) => { + title.push_text(ColouredString::plain("network error"), false); + log_msg(&mut paras, msg); + log_url(&mut paras, url); + } + ClientError::UrlFetchHTTP(url, status) => { + title.push_text(ColouredString::plain("HTTP error"), false); + log_status(&mut paras, status); + log_url(&mut paras, url); + } + ClientError::UrlFetchHTTPRich(url, status, msg) => { + title.push_text( + ColouredString::plain("error from Mastodon server"), + false, + ); + log_msg(&mut paras, msg); + log_status(&mut paras, status); + log_url(&mut paras, url); + } + ClientError::JSONParse(url, msg) => { + title.push_text( + ColouredString::plain("JSON parsing error"), + false, + ); + log_msg(&mut paras, msg); + log_url(&mut paras, url); + } + ClientError::LinkParse(url, msg) => { + title.push_text( + ColouredString::plain("Link header parsing error"), + false, + ); + log_msg(&mut paras, msg); + log_url(&mut paras, url); + } + ClientError::UrlConsistency(url, msg) => { + title.push_text( + ColouredString::plain("server data consistency error"), + false, + ); + log_msg(&mut paras, msg); + log_url(&mut paras, url); + } + ClientError::Consistency(msg) => { + title.push_text( + ColouredString::plain("server data consistency error"), + false, + ); + log_msg(&mut paras, msg); + } + } + + ErrorLogEntry { + sep, + title, + paras, + blank, + } + } +} + +impl TextFragment for ErrorLogEntry { + fn render_highlighted( + &self, + width: usize, + _highlight: Option, + _style: &dyn DisplayStyleGetter, + ) -> Vec { + let mut lines = Vec::new(); + push_fragment(&mut lines, self.sep.render(width)); + push_fragment(&mut lines, self.title.render(width)); + push_fragment(&mut lines, self.blank.render(width)); + push_fragment(&mut lines, self.paras.render(width)); + push_fragment(&mut lines, self.blank.render(width)); + lines + } +} -- 2.30.2