Skip to main content

link_cli/sequences/
unicode_symbol_to_char_converter.rs

1use anyhow::{bail, Result};
2
3use crate::link_storage::LinkStorage;
4use crate::sequences::{RawNumberToAddressConverter, TargetMatcher};
5
6#[derive(Clone, Copy, Debug)]
7pub struct UnicodeSymbolToCharConverter {
8    number_to_address_converter: RawNumberToAddressConverter,
9    unicode_symbol_criterion_matcher: TargetMatcher,
10}
11
12impl UnicodeSymbolToCharConverter {
13    pub fn new(
14        number_to_address_converter: RawNumberToAddressConverter,
15        unicode_symbol_criterion_matcher: TargetMatcher,
16    ) -> Self {
17        Self {
18            number_to_address_converter,
19            unicode_symbol_criterion_matcher,
20        }
21    }
22
23    pub fn convert(&self, links: &LinkStorage, symbol: u32) -> Result<u16> {
24        if !self
25            .unicode_symbol_criterion_matcher
26            .is_matched(links, symbol)
27        {
28            bail!("Specified link {symbol} is not a Unicode symbol.");
29        }
30
31        let Some(link) = links.get(symbol) else {
32            bail!("Unicode symbol link {symbol} does not exist.");
33        };
34        let code_unit = self.number_to_address_converter.convert(link.source);
35        Ok(u16::try_from(code_unit)?)
36    }
37}