chiark / gitweb /
More ColouredString streamlining.
authorSimon Tatham <anakin@pobox.com>
Thu, 11 Jan 2024 07:45:28 +0000 (07:45 +0000)
committerSimon Tatham <anakin@pobox.com>
Thu, 11 Jan 2024 07:51:20 +0000 (07:51 +0000)
By making Paragraph::add() take a general impl ColouredStringCommon,
we can get rid of a lot of no-longer-necessary &.

src/text.rs

index fdcc67e6ac7cf12f81c824fc0d1f90549007646b..0caf31ef64c6818adef8427de1a0330af30ce397 100644 (file)
@@ -432,7 +432,8 @@ impl Paragraph {
         self
     }
 
-    pub fn push_text(&mut self, text: &ColouredString, squash_spaces: bool) {
+    pub fn push_text(&mut self, text: impl ColouredStringCommon,
+                     squash_spaces: bool) {
         for ch in text.chars() {
             if let Some(curr_word) = self.words.last_mut() {
                 let is_space = ch.is_space();
@@ -447,7 +448,7 @@ impl Paragraph {
         }
     }
 
-    pub fn add(mut self, text: &ColouredString) -> Self {
+    pub fn add(mut self, text: impl ColouredStringCommon) -> Self {
         self.push_text(text, false);
         self
     }
@@ -507,7 +508,7 @@ fn test_para_build() {
             laterindent: 4,
             wrap: true,
         });
-    assert_eq!(Paragraph::new().add(&ColouredString::plain("foo bar baz")),
+    assert_eq!(Paragraph::new().add(ColouredString::plain("foo bar baz")),
                Paragraph {
             words: vec! {
                 ColouredString::plain("foo"),
@@ -521,8 +522,8 @@ fn test_para_build() {
             wrap: true,
         });
     assert_eq!(Paragraph::new()
-               .add(&ColouredString::plain("foo ba"))
-               .add(&ColouredString::plain("r baz")),
+               .add(ColouredString::plain("foo ba"))
+               .add(ColouredString::plain("r baz")),
                Paragraph {
             words: vec! {
                 ColouredString::plain("foo"),
@@ -535,7 +536,7 @@ fn test_para_build() {
             laterindent: 0,
             wrap: true,
         });
-    assert_eq!(Paragraph::new().add(&ColouredString::general(
+    assert_eq!(Paragraph::new().add(ColouredString::general(
                 "  foo  bar  baz  ", "abcdefghijklmnopq")),
                Paragraph {
             words: vec! {
@@ -607,7 +608,7 @@ impl TextFragment for Paragraph {
 
 #[test]
 fn test_para_wrap() {
-    let p = Paragraph::new().add(&ColouredString::plain(
+    let p = Paragraph::new().add(ColouredString::plain(
             "the quick brown fox  jumps over  the lazy dog"));
     assert_eq!(p.render(16), vec! {
             ColouredString::plain("the quick brown"),
@@ -615,7 +616,7 @@ fn test_para_wrap() {
             ColouredString::plain("the lazy dog"),
         });
 
-    let p = Paragraph::new().add(&ColouredString::plain(
+    let p = Paragraph::new().add(ColouredString::plain(
             "  one supercalifragilisticexpialidocious word"));
     assert_eq!(p.render(15), vec! {
             ColouredString::plain("  one"),
@@ -623,21 +624,21 @@ fn test_para_wrap() {
             ColouredString::plain("word"),
         });
 
-    let p = Paragraph::new().add(&ColouredString::plain(
+    let p = Paragraph::new().add(ColouredString::plain(
             "  supercalifragilisticexpialidocious word"));
     assert_eq!(p.render(15), vec! {
             ColouredString::plain("  supercalifragilisticexpialidocious"),
             ColouredString::plain("word"),
         });
 
-    let p = Paragraph::new().add(&ColouredString::plain(
+    let p = Paragraph::new().add(ColouredString::plain(
             "the quick brown fox  jumps over  the lazy dog"))
         .set_wrap(false);
     assert_eq!(p.render(15), vec! {
             ColouredString::plain("the quick brown fox  jumps over  the lazy dog"),
         });
 
-    let p = Paragraph::new().add(&ColouredString::plain(
+    let p = Paragraph::new().add(ColouredString::plain(
             "the quick brown fox jumps over the lazy dog"))
         .set_indent(4, 2);
     assert_eq!(p.render(15), vec! {
@@ -932,7 +933,7 @@ pub struct InReplyToLine {
 
 impl InReplyToLine {
     pub fn new(post: Paragraph) -> Self {
-        let mut para = Paragraph::new().add(&ColouredString::plain("Re: "));
+        let mut para = Paragraph::new().add(ColouredString::plain("Re: "));
         let currlen = para.words.len();
         para.push_para(&post);
         para.delete_mention_words_from(currlen);
@@ -942,7 +943,7 @@ impl InReplyToLine {
     pub fn from_id(id: &str, client: &mut Client) -> Self {
         let parent_text = match client.status_by_id(id) {
             Ok(st) => Html::new(&st.content).to_para(),
-            Err(e) => Paragraph::new().add(&ColouredString::plain(
+            Err(e) => Paragraph::new().add(ColouredString::plain(
                 &format!("[unavailable: {}]", e)
             )),
         };
@@ -1143,7 +1144,7 @@ fn test_notification_log() {
                                           "%Y-%m-%d %H:%M:%S")
         .unwrap().and_local_timezone(Local).unwrap().with_timezone(&Utc);
 
-    let post = Paragraph::new().add(&ColouredString::general(
+    let post = Paragraph::new().add(ColouredString::general(
         "@stoat @weasel take a look at this otter! @badger might also like it",
         "@@@@@@ @@@@@@@                            @@@@@@@                   ",
     ));
@@ -1251,7 +1252,7 @@ impl Media {
                     .split('\n')
                     .map(|x| Paragraph::new()
                          .set_indent(2, 2)
-                         .add(&ColouredString::uniform(x, 'm')))
+                         .add(ColouredString::uniform(x, 'm')))
                     .collect();
                 trim_para_list(&mut paras);
                 paras
@@ -1789,9 +1790,9 @@ impl StatusDisplay {
 
         let warning = if st.sensitive {
             let mut para = Paragraph::new();
-            para = para.add(&ColouredString::uniform("Content note:", 'r'));
+            para = para.add(ColouredString::uniform("Content note:", 'r'));
             para.end_word();
-            para = para.add(&ColouredString::plain(&st.spoiler_text));
+            para = para.add(ColouredString::plain(&st.spoiler_text));
             Some(para)
         } else {
             None
@@ -1929,7 +1930,7 @@ impl TextFragment for StatusDisplay {
                 let option = Paragraph::new().set_indent(0, 2).add(
                     &ColouredString::uniform(
                         if voted {"[X]"} else {"[ ]"}, 'H'))
-                    .add(&desc);
+                    .add(desc);
                 let push_fragment_opt_highlight = if highlighting_this_option {
                     push_fragment_highlighted
                 } else {
@@ -2026,36 +2027,36 @@ pub struct DetailedStatusDisplay {
 impl DetailedStatusDisplay {
     pub fn new(st: Status, client: &mut Client) -> Self {
         let id = Paragraph::new()
-            .add(&ColouredString::plain("Post id: "))
-            .add(&ColouredString::plain(&st.id));
+            .add(ColouredString::plain("Post id: "))
+            .add(ColouredString::plain(&st.id));
         let webstatus = st.url.as_ref().map(
             |s| Paragraph::new()
-                .add(&ColouredString::plain("On the web: "))
-                .add(&ColouredString::uniform(&client.fq(s), 'u')));
+                .add(ColouredString::plain("On the web: "))
+                .add(ColouredString::uniform(&client.fq(s), 'u')));
 
         let creation = Paragraph::new()
-            .add(&ColouredString::plain("Creation time: "))
-            .add(&ColouredString::plain(&format_date(st.created_at)));
+            .add(ColouredString::plain("Creation time: "))
+            .add(ColouredString::plain(&format_date(st.created_at)));
         let lastedit = Paragraph::new()
-            .add(&ColouredString::plain("Last edit time: "))
+            .add(ColouredString::plain("Last edit time: "))
             .add(&st.edited_at.map_or_else(
                 || ColouredString::uniform("none", '0'),
                 |date| ColouredString::plain(&format_date(date))));
         let reply_to = Paragraph::new()
-            .add(&ColouredString::plain("Reply to post: "))
+            .add(ColouredString::plain("Reply to post: "))
             .add(&st.in_reply_to_id.as_ref().map_or_else(
                 || ColouredString::uniform("none", '0'),
                 |s| ColouredString::plain(s)));
         let reply_to_id = st.in_reply_to_id.clone();
         let reply_to_user = Paragraph::new()
-            .add(&ColouredString::plain("Reply to account: "))
+            .add(ColouredString::plain("Reply to account: "))
             .add(&st.in_reply_to_account_id.as_ref().map_or_else(
                 || ColouredString::uniform("none", '0'),
                 |s| ColouredString::plain(s)));
         let reply_to_user_id = st.in_reply_to_account_id.clone();
 
         let language = Paragraph::new()
-            .add(&ColouredString::plain("Language: "))
+            .add(ColouredString::plain("Language: "))
             .add(&st.language.as_ref().map_or_else(
                 || ColouredString::uniform("none", '0'),
                 |s| ColouredString::plain(s)));
@@ -2065,7 +2066,7 @@ impl DetailedStatusDisplay {
             true => ColouredString::uniform("yes", 'r'),
         };
         let sensitive = Paragraph::new()
-            .add(&ColouredString::plain("Sensitive: "))
+            .add(ColouredString::plain("Sensitive: "))
             .add(&sens_str);
         let opt_spoiler = if st.spoiler_text.is_empty() {
             None
@@ -2073,24 +2074,24 @@ impl DetailedStatusDisplay {
             Some(&st.spoiler_text)
         };
         let spoiler = Paragraph::new().set_indent(0, 2)
-            .add(&ColouredString::plain("Spoiler text: "))
+            .add(ColouredString::plain("Spoiler text: "))
             .add(&opt_spoiler.as_ref().map_or_else(
                 || ColouredString::uniform("none", '0'),
                 |s| ColouredString::plain(s)));
 
         let replies = Paragraph::new()
-            .add(&ColouredString::plain(
+            .add(ColouredString::plain(
                 &format!("Replies: {}", st.replies_count)));
         let boosts = Paragraph::new()
-            .add(&ColouredString::plain(
+            .add(ColouredString::plain(
                 &format!("Boosts: {}", st.reblogs_count)));
         let favourites = Paragraph::new()
-            .add(&ColouredString::plain(
+            .add(ColouredString::plain(
                 &format!("Favourites: {}", st.favourites_count)));
 
         let mentions: Vec<_> = st.mentions.iter().map(|m| {
             let para = Paragraph::new().set_indent(2, 2)
-                .add(&ColouredString::uniform(&client.fq(&m.acct), 'f'));
+                .add(ColouredString::uniform(&client.fq(&m.acct), 'f'));
             (para, m.id.to_owned())
         }).collect();
         let mentions_header = if mentions.is_empty() {
@@ -2101,12 +2102,12 @@ impl DetailedStatusDisplay {
         };
 
         let client_name = Paragraph::new()
-            .add(&ColouredString::plain("Client name: "))
+            .add(ColouredString::plain("Client name: "))
             .add(&st.application.as_ref().map_or_else(
                 || ColouredString::uniform("none", '0'),
                 |app| ColouredString::plain(&app.name)));
         let client_url = Paragraph::new()
-            .add(&ColouredString::plain("Client website: "))
+            .add(ColouredString::plain("Client website: "))
             .add(&st.application.as_ref()
                  .and_then(|app| app.website.as_ref())
                  .map_or_else(
@@ -2116,7 +2117,7 @@ impl DetailedStatusDisplay {
         let sd = StatusDisplay::new(st, client);
         let urls: Vec<_> = sd.list_urls().iter().map(|u| {
             Paragraph::new().set_indent(2, 4)
-                .add(&ColouredString::uniform(u, 'u'))
+                .add(ColouredString::uniform(u, 'u'))
         }).collect();
         let urls_header = if urls.is_empty() {
             None
@@ -2314,58 +2315,58 @@ pub struct ExamineUserDisplay {
 impl ExamineUserDisplay {
     pub fn new(ac: Account, client: &mut Client) -> Result<Self, ClientError> {
         let name = Paragraph::new()
-            .add(&ColouredString::plain("Account name: "))
-            .add(&ColouredString::uniform(&client.fq(&ac.acct), 'f'));
+            .add(ColouredString::plain("Account name: "))
+            .add(ColouredString::uniform(&client.fq(&ac.acct), 'f'));
         let webaccount = Paragraph::new()
-            .add(&ColouredString::plain("On the web: "))
-            .add(&ColouredString::uniform(&client.fq(&ac.url), 'u'));
+            .add(ColouredString::plain("On the web: "))
+            .add(ColouredString::uniform(&client.fq(&ac.url), 'u'));
 
         let dispname = Paragraph::new()
-            .add(&ColouredString::plain("Display name: "))
-            .add(&ColouredString::plain(&ac.display_name));
+            .add(ColouredString::plain("Display name: "))
+            .add(ColouredString::plain(&ac.display_name));
         let bio_header = Paragraph::new()
-            .add(&ColouredString::plain("Bio:"));
+            .add(ColouredString::plain("Bio:"));
         let bio = Html::new(&ac.note);
 
         let info_header = Paragraph::new()
-            .add(&ColouredString::plain("Information:"));
+            .add(ColouredString::plain("Information:"));
         let info_fields = ac.fields.iter().map(|field| {
             let colour = if field.verified_at.is_some() { 'f' } else { ' ' };
             let title_text = field.name.trim();
             let title_text = title_text.strip_suffix(':').unwrap_or(title_text);
             let title_text = title_text.to_owned() + ":";
             let title = Paragraph::new()
-                .add(&ColouredString::uniform(&title_text, colour))
+                .add(ColouredString::uniform(&title_text, colour))
                 .set_indent(2, 2);
             let content = Html::new(&field.value);
             (title, content)
         }).collect();
 
         let id = Paragraph::new()
-            .add(&ColouredString::plain("Account id: "))
-            .add(&ColouredString::plain(&ac.id));
+            .add(ColouredString::plain("Account id: "))
+            .add(ColouredString::plain(&ac.id));
         let creation = Paragraph::new()
-            .add(&ColouredString::plain("Account created: "))
+            .add(ColouredString::plain("Account created: "))
             .add(&Self::format_option_approx_date(Some(ac.created_at)));
         let last_post = Paragraph::new()
-            .add(&ColouredString::plain("Latest post: "))
+            .add(ColouredString::plain("Latest post: "))
             .add(&Self::format_option_approx_date(ac.last_status_at));
         let post_count = Paragraph::new()
-            .add(&ColouredString::plain(
+            .add(ColouredString::plain(
                 &format!("Number of posts: {}", ac.statuses_count)));
         let followers_count = Paragraph::new()
-            .add(&ColouredString::plain(
+            .add(ColouredString::plain(
                 &format!("Number of followers: {}", ac.followers_count)));
         let following_count = Paragraph::new()
-            .add(&ColouredString::plain(
+            .add(ColouredString::plain(
                 &format!("Number of users followed: {}", ac.following_count)));
 
         let mut flags = Vec::new();
         if ac.locked {
             flags.push(Paragraph::new()
-                       .add(&ColouredString::plain("This account is "))
-                       .add(&ColouredString::uniform("locked", 'r'))
-                       .add(&ColouredString::plain(
+                       .add(ColouredString::plain("This account is "))
+                       .add(ColouredString::uniform("locked", 'r'))
+                       .add(ColouredString::plain(
                            " (you can't follow it without its permission).")));
         }
         if ac.suspended.unwrap_or(false) {
@@ -2390,9 +2391,9 @@ impl ExamineUserDisplay {
         }
         if let Some(moved_to) = ac.moved {
             flags.push(Paragraph::new()
-                       .add(&ColouredString::uniform(
+                       .add(ColouredString::uniform(
                            "This account has moved to:", 'r'))
-                       .add(&ColouredString::plain(
+                       .add(ColouredString::plain(
                            &format!(" {}", client.fq(&moved_to.acct)))));
         }