Skip to content

Commit e218a01

Browse files
Merge pull request #37 from jamesbt365/arraystring
remove useless allocations
2 parents f3568e7 + 35971b3 commit e218a01

File tree

5 files changed

+64
-24
lines changed

5 files changed

+64
-24
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,4 @@ octocrab = "0.19.0"
2222
reqwest = "0.11.22"
2323
hex = "0.4.3"
2424
to-arraystring = "0.1.3"
25+
arrayvec = "0.7.4"

src/commands/mod.rs

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ pub(crate) const ACCENT_COLOUR: Colour = Colour(0x8957e5);
55
pub(crate) const OK_COLOUR: Colour = Colour(0x2ecc71);
66
pub(crate) const ERROR_COLOUR: Colour = Colour(0xe74c3c);
77

8+
use arrayvec::ArrayString;
9+
use to_arraystring::ToArrayString;
10+
811
use crate::{Context, Error};
912

1013
use poise::serenity_prelude::{
@@ -64,20 +67,43 @@ pub async fn interaction_err(ctx: &serenity::Context, press: &ComponentInteracti
6467
let _ = press.create_response(ctx, builder).await;
6568
}
6669

67-
pub async fn paginate_lists<U, E>(
68-
ctx: poise::Context<'_, U, E>,
70+
enum Kind {
71+
Next,
72+
Previous,
73+
}
74+
75+
impl Kind {
76+
fn from_id(id: &str, ctx_id: &str) -> Option<Self> {
77+
let this = match id.strip_prefix(ctx_id)? {
78+
"next" => Self::Next,
79+
"prev" => Self::Previous,
80+
_ => return None,
81+
};
82+
83+
Some(this)
84+
}
85+
}
86+
87+
pub async fn paginate_lists(
88+
ctx: crate::Context<'_>,
6989
pages: &[Vec<(String, String, bool)>],
7090
embed_title: &str,
7191
) -> Result<(), Error> {
72-
let ctx_id = ctx.id();
73-
let prev_button_id = format!("{ctx_id}prev");
74-
let next_button_id = format!("{ctx_id}next");
92+
let ctx_id = ctx.id().to_arraystring();
93+
94+
let mut prev_button_id = ArrayString::<24>::new();
95+
prev_button_id.push_str(&ctx_id);
96+
prev_button_id.push_str("prev");
97+
98+
let mut next_button_id = ArrayString::<24>::new();
99+
next_button_id.push_str(&ctx_id);
100+
next_button_id.push_str("next");
75101

76102
let colour = Colour::TEAL;
77103

78104
let components = CreateActionRow::Buttons(vec![
79-
CreateButton::new(&prev_button_id).emoji('◀'),
80-
CreateButton::new(&next_button_id).emoji('▶'),
105+
CreateButton::new(&*prev_button_id).emoji('◀'),
106+
CreateButton::new(&*next_button_id).emoji('▶'),
81107
]);
82108
let mut current_page = 0;
83109

@@ -113,15 +139,17 @@ pub async fn paginate_lists<U, E>(
113139
.timeout(std::time::Duration::from_secs(180))
114140
.await
115141
{
116-
if press.data.custom_id == next_button_id {
117-
current_page += 1;
118-
if current_page >= pages.len() {
119-
current_page = 0;
142+
match Kind::from_id(&press.data.custom_id, &ctx_id) {
143+
Some(Kind::Next) => {
144+
current_page += 1;
145+
if current_page >= pages.len() {
146+
current_page = 0;
147+
}
148+
}
149+
Some(Kind::Previous) => {
150+
current_page = current_page.checked_sub(1).unwrap_or(pages.len() - 1);
120151
}
121-
} else if press.data.custom_id == prev_button_id {
122-
current_page = current_page.checked_sub(1).unwrap_or(pages.len() - 1);
123-
} else {
124-
continue;
152+
None => continue,
125153
}
126154

127155
press

src/events/issues/mod.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::time::Duration;
22

33
use crate::{commands::interaction_err, structures::Embeddable, Data};
44

5+
use arrayvec::ArrayString;
56
use poise::serenity_prelude::{
67
self as serenity, ButtonStyle, Context, CreateActionRow, CreateButton, CreateEmbed,
78
CreateInteractionResponse, Message, Permissions,
@@ -43,18 +44,26 @@ pub async fn message(data: &Data, ctx: &Context, message: &Message) {
4344
// we can avoid even a stack allocation! (thanks gnome)
4445
let ctx_id = message.id.get().to_arraystring();
4546

46-
let remove_id = format!("{ctx_id}delete");
47-
let hide_body_id = format!("{ctx_id}hide_body");
47+
// we know the max size so we don't need to allocate.
48+
// 20 + 6
49+
let mut remove_id = ArrayString::<26>::new();
50+
remove_id.push_str(&ctx_id);
51+
remove_id.push_str("delete");
4852

49-
let remove = CreateActionRow::Buttons(vec![CreateButton::new(&remove_id)
53+
// 20 + 9
54+
let mut hide_body_id = ArrayString::<29>::new();
55+
hide_body_id.push_str(&ctx_id);
56+
hide_body_id.push_str("hide_body");
57+
58+
let remove = CreateActionRow::Buttons(vec![CreateButton::new(&*remove_id)
5059
.label("delete")
5160
.style(ButtonStyle::Danger)]);
5261

5362
let components = serenity::CreateActionRow::Buttons(vec![
54-
CreateButton::new(&remove_id)
63+
CreateButton::new(&*remove_id)
5564
.label("delete")
5665
.style(ButtonStyle::Danger),
57-
CreateButton::new(&hide_body_id).label("hide body"),
66+
CreateButton::new(&*hide_body_id).label("hide body"),
5867
]);
5968

6069
let content: serenity::CreateMessage = serenity::CreateMessage::default()

src/events/issues/utils.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use octocrab::models::{issues::Issue, pulls::PullRequest};
22
use poise::serenity_prelude::{Colour, CreateEmbed, CreateEmbedAuthor};
33

44
use crate::structures::Embeddable;
5+
use std::fmt::Write;
56

67
const OPEN_COLOUR: Colour = Colour::new(0x238636);
78
const RESOLVED_COLOUR: Colour = Colour::new(0x8957e5);
@@ -47,9 +48,9 @@ impl Document for Issue {
4748
fn get_content(&self) -> String {
4849
let body = self.body.as_deref().unwrap_or_default();
4950

50-
let mut description = String::default();
51+
let mut description = String::new();
5152
for line in body.split('\n').take(15) {
52-
description.push_str(&format!("{line}\n"));
53+
writeln!(description, "{line}").unwrap();
5354
}
5455

5556
description.shrink_to(4096);
@@ -123,9 +124,9 @@ impl Document for PullRequest {
123124
fn get_content(&self) -> String {
124125
let body = self.body.as_deref().unwrap_or_default();
125126

126-
let mut content = String::default();
127+
let mut content = String::new();
127128
for line in body.split('\n').take(15) {
128-
content.push_str(&format!("{line}\n"));
129+
writeln!(content, "{line}").unwrap();
129130
}
130131

131132
content.shrink_to(4096);

0 commit comments

Comments
 (0)