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();
}
}
- pub fn add(mut self, text: &ColouredString) -> Self {
+ pub fn add(mut self, text: impl ColouredStringCommon) -> Self {
self.push_text(text, false);
self
}
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"),
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"),
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! {
#[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"),
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"),
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! {
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);
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)
)),
};
"%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",
"@@@@@@ @@@@@@@ @@@@@@@ ",
));
.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
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
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 {
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)));
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
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() {
};
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(
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
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) {
}
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)))));
}