aboutsummaryrefslogtreecommitdiffstats
path: root/src/unicode.rs
blob: 7897792835abdda960e046980339466db1744be2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use std::convert::TryInto as _;
use unicode_width::UnicodeWidthChar as _;

// soft hyphen is defined as width 1, but in a terminal setting it should
// always be width 0
pub fn char_width(c: char) -> u16 {
    match c {
        '\u{00ad}' => 0,
        _ => c.width().unwrap_or(0).try_into().unwrap(),
    }
}

// strings in this context should always be an arbitrary character followed by
// zero or more zero-width characters, so we should only have to look at the
// first character
pub fn str_width(s: &str) -> u16 {
    s.chars().next().map_or(0, char_width)
}