link_cli/sequences/
unicode_symbol_to_char_converter.rs1use 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}