fix overflow panic when shrink column (#138)

This commit is contained in:
Clément DOUIN 2021-05-03 22:10:03 +02:00
parent df39d5b364
commit d5ed69ebf9
No known key found for this signature in database
GPG key ID: 69C9B9CFFDEE2DEF
2 changed files with 38 additions and 13 deletions

View file

@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- Table with subject containing `\r` or `\n`[#141]
- Overflow panic when shrink column [#138]
## [0.3.0] - 2021-04-28
@ -229,4 +230,5 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
[#131]: https://github.com/soywod/himalaya/issues/131
[#132]: https://github.com/soywod/himalaya/issues/132
[#133]: https://github.com/soywod/himalaya/issues/133
[#138]: https://github.com/soywod/himalaya/issues/138
[#141]: https://github.com/soywod/himalaya/issues/141

View file

@ -2,6 +2,9 @@ use log::{debug, trace};
use std::fmt;
use unicode_width::UnicodeWidthStr;
const DEFAULT_TERM_WIDTH: usize = 80;
const MAX_SHRINK_WIDTH: usize = 5;
#[derive(Debug)]
pub struct Style(u8, u8, u8);
@ -148,7 +151,7 @@ where
fn max_width() -> usize {
terminal_size::terminal_size()
.map(|(w, _)| w.0 as usize)
.unwrap_or(80)
.unwrap_or(DEFAULT_TERM_WIDTH)
}
fn build(items: &[Self]) -> Vec<Vec<String>> {
@ -191,11 +194,15 @@ where
let shrink_width = table_width - Self::max_width();
trace!("shrink_width: {}", shrink_width);
let cell_width = cell_widths[i] - shrink_width;
let cell_is_overflowing = cell.unicode_width() > cell_width;
let cell_width = if shrink_width + MAX_SHRINK_WIDTH < cell_widths[i] {
cell_widths[i] - shrink_width
} else {
MAX_SHRINK_WIDTH
};
trace!("cell_width: {}", cell_width);
trace!("cell unicode_width: {}", cell.unicode_width());
let cell_is_overflowing = cell.unicode_width() > cell_width;
if cell_is_overflowing {
trace!("cell is overflowing");
@ -346,13 +353,13 @@ mod tests {
}
#[test]
fn shrink() {
fn basic_shrink() {
let items = vec![
Item::new(1, "short", "desc"),
Item::new(2, "loooooong", "desc"),
Item::new(3, "shriiiiink", "desc"),
Item::new(4, "shriiiiiiiiiink", "desc"),
Item::new(5, "", "desc"),
Item::new(1, "", "desc"),
Item::new(2, "short", "desc"),
Item::new(3, "loooooong", "desc"),
Item::new(4, "shriiiiink", "desc"),
Item::new(5, "shriiiiiiiiiink", "desc"),
Item::new(6, "😍😍😍😍", "desc"),
Item::new(7, "😍😍😍😍😍", "desc"),
Item::new(8, "!😍😍😍😍😍", "desc"),
@ -360,11 +367,11 @@ mod tests {
let table = vec![
vec!["ID ", "NAME ", "DESC "],
vec!["1 ", "short ", "desc "],
vec!["2 ", "loooooong ", "desc "],
vec!["3 ", "shriiiii… ", "desc "],
vec!["1 ", " ", "desc "],
vec!["2 ", "short ", "desc "],
vec!["3 ", "loooooong ", "desc "],
vec!["4 ", "shriiiii… ", "desc "],
vec!["5 ", " ", "desc "],
vec!["5 ", "shriiiii… ", "desc "],
vec!["6 ", "😍😍😍😍 ", "desc "],
vec!["7 ", "😍😍😍😍… ", "desc "],
vec!["8 ", "!😍😍😍… ", "desc "],
@ -372,4 +379,20 @@ mod tests {
assert_eq!(table, Table::build(&items));
}
#[test]
fn max_shrink_width() {
let items = vec![
Item::new(1111, "shriiiiiiiink", "desc very looong"),
Item::new(2222, "shriiiiiiiink", "desc very loooooooooong"),
];
let table = vec![
vec!["ID ", "NAME ", "DESC "],
vec!["1111 ", "shri… ", "desc very looong "],
vec!["2222 ", "shri… ", "desc very loooooooooong "],
];
assert_eq!(table, Table::build(&items));
}
}