1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use crate::cell::{Cell, CellAttributes};
use crate::emoji::Presentation;
#[derive(Debug)]
pub enum CellRef<'a> {
CellRef {
cell_index: usize,
cell: &'a Cell,
},
ClusterRef {
cell_index: usize,
text: &'a str,
width: usize,
attrs: &'a CellAttributes,
},
}
impl<'a> CellRef<'a> {
pub fn cell_index(&self) -> usize {
match self {
Self::ClusterRef { cell_index, .. } | Self::CellRef { cell_index, .. } => *cell_index,
}
}
pub fn str(&self) -> &str {
match self {
Self::CellRef { cell, .. } => cell.str(),
Self::ClusterRef { text, .. } => text,
}
}
pub fn width(&self) -> usize {
match self {
Self::CellRef { cell, .. } => cell.width(),
Self::ClusterRef { width, .. } => *width,
}
}
pub fn attrs(&self) -> &CellAttributes {
match self {
Self::CellRef { cell, .. } => cell.attrs(),
Self::ClusterRef { attrs, .. } => attrs,
}
}
pub fn presentation(&self) -> Presentation {
match self {
Self::CellRef { cell, .. } => cell.presentation(),
Self::ClusterRef { text, .. } => match Presentation::for_grapheme(text) {
(_, Some(variation)) => variation,
(presentation, None) => presentation,
},
}
}
pub fn as_cell(&self) -> Cell {
match self {
Self::CellRef { cell, .. } => (*cell).clone(),
Self::ClusterRef {
text, width, attrs, ..
} => Cell::new_grapheme_with_width(text, *width, (*attrs).clone()),
}
}
pub fn same_contents(&self, other: &Self) -> bool {
self.str() == other.str() && self.width() == other.width() && self.attrs() == other.attrs()
}
}