1use std::sync::Arc;
2
3#[derive(Clone, Debug)]
4pub struct HighlightMap(Arc<[HighlightId]>);
5
6#[derive(Clone, Copy, Debug, PartialEq, Eq)]
7pub struct HighlightId(pub u32);
8
9const DEFAULT_SYNTAX_HIGHLIGHT_ID: HighlightId = HighlightId(u32::MAX);
10
11impl HighlightMap {
12 #[inline]
13 pub fn from_ids(highlight_ids: impl IntoIterator<Item = HighlightId>) -> Self {
14 Self(highlight_ids.into_iter().collect())
15 }
16
17 #[inline]
18 pub fn get(&self, capture_id: u32) -> HighlightId {
19 self.0
20 .get(capture_id as usize)
21 .copied()
22 .unwrap_or(DEFAULT_SYNTAX_HIGHLIGHT_ID)
23 }
24}
25
26impl HighlightId {
27 pub const TABSTOP_INSERT_ID: HighlightId = HighlightId(u32::MAX - 1);
28 pub const TABSTOP_REPLACE_ID: HighlightId = HighlightId(u32::MAX - 2);
29
30 #[inline]
31 pub fn is_default(&self) -> bool {
32 *self == DEFAULT_SYNTAX_HIGHLIGHT_ID
33 }
34}
35
36impl Default for HighlightMap {
37 fn default() -> Self {
38 Self(Arc::new([]))
39 }
40}
41
42impl Default for HighlightId {
43 fn default() -> Self {
44 DEFAULT_SYNTAX_HIGHLIGHT_ID
45 }
46}
47
48impl From<HighlightId> for usize {
49 fn from(value: HighlightId) -> Self {
50 value.0 as usize
51 }
52}