base: split `calculate_room_name()`

Split `calculate_room_name()` into a high-level function using Matrix
data types and low-level function containing the core logic using plain
Rust data types. Since the low-level function uses simple data types,
unit testing becomes easier.
master
Austin Ray 2021-05-21 17:25:59 -04:00
parent c90e8ab483
commit 79025e3f40
No known key found for this signature in database
GPG Key ID: 89D6C2B99503DC49
1 changed files with 34 additions and 23 deletions

View File

@ -62,29 +62,11 @@ impl BaseRoomInfo {
invited_member_count: u64, invited_member_count: u64,
heroes: Vec<RoomMember>, heroes: Vec<RoomMember>,
) -> String { ) -> String {
let heroes_count = heroes.len() as u64; calculate_room_name(
let invited_joined = invited_member_count + joined_member_count; joined_member_count,
let invited_joined_minus_one = invited_joined.saturating_sub(1); invited_member_count,
heroes.iter().take(3).map(|mem| mem.name()).collect::<Vec<&str>>(),
if heroes_count >= invited_joined_minus_one { )
let mut names = heroes.iter().take(3).map(|mem| mem.name()).collect::<Vec<&str>>();
// stabilize ordering
names.sort_unstable();
names.join(", ")
} else if heroes_count < invited_joined_minus_one && invited_joined > 1 {
let mut names = heroes.iter().take(3).map(|mem| mem.name()).collect::<Vec<&str>>();
names.sort_unstable();
// TODO: What length does the spec want us to use here and in
// the `else`?
format!(
"{}, and {} others",
names.join(", "),
(joined_member_count + invited_member_count)
)
} else {
"Empty room".to_string()
}
} }
/// Handle a state event for this room and update our info accordingly. /// Handle a state event for this room and update our info accordingly.
@ -165,3 +147,32 @@ impl Default for BaseRoomInfo {
} }
} }
} }
/// Calculate room name according to step 3 of the [naming algorithm.][spec]
///
/// [spec]: <https://matrix.org/docs/spec/client_server/latest#calculating-the-display-name-for-a-room>
fn calculate_room_name(
joined_member_count: u64,
invited_member_count: u64,
heroes: Vec<&str>,
) -> String {
let heroes_count = heroes.len() as u64;
let invited_joined = invited_member_count + joined_member_count;
let invited_joined_minus_one = invited_joined.saturating_sub(1);
if heroes_count >= invited_joined_minus_one {
let mut names = heroes;
// stabilize ordering
names.sort_unstable();
names.join(", ")
} else if heroes_count < invited_joined_minus_one && invited_joined > 1 {
let mut names = heroes;
names.sort_unstable();
// TODO: What length does the spec want us to use here and in
// the `else`?
format!("{}, and {} others", names.join(", "), (joined_member_count + invited_member_count))
} else {
"Empty room".to_string()
}
}