Skip to main content

link_cli/sequences/
string_to_unicode_sequence_converter.rs

1use crate::link_storage::LinkStorage;
2use crate::sequences::{BalancedVariantConverter, CharToUnicodeSymbolConverter};
3
4#[derive(Clone, Copy, Debug)]
5pub struct StringToUnicodeSequenceConverter {
6    char_to_unicode_symbol_converter: CharToUnicodeSymbolConverter,
7    balanced_variant_converter: BalancedVariantConverter,
8    unicode_sequence_type: u32,
9}
10
11impl StringToUnicodeSequenceConverter {
12    pub fn new(
13        char_to_unicode_symbol_converter: CharToUnicodeSymbolConverter,
14        balanced_variant_converter: BalancedVariantConverter,
15        unicode_sequence_type: u32,
16    ) -> Self {
17        Self {
18            char_to_unicode_symbol_converter,
19            balanced_variant_converter,
20            unicode_sequence_type,
21        }
22    }
23
24    pub fn convert(&self, links: &mut LinkStorage, content: &str) -> u32 {
25        let symbols = content
26            .encode_utf16()
27            .map(|code_unit| {
28                self.char_to_unicode_symbol_converter
29                    .convert(links, code_unit)
30            })
31            .collect::<Vec<_>>();
32
33        if symbols.is_empty() {
34            return self.unicode_sequence_type;
35        }
36
37        let sequence = self.balanced_variant_converter.convert(links, &symbols);
38        links.get_or_create(sequence, self.unicode_sequence_type)
39    }
40}