Skip to main content

scratch_test_value/texts/
nth_letter.rs

1use crate::{
2    QuirkSink, SValue,
3    quirks::{NumberTooBigForIntQ, SValueToNumberQ},
4};
5
6#[allow(clippy::enum_variant_names)]
7pub enum NthLetterOfTextQ {
8    PositionIsNotInt(SValue),
9    PositionZero,
10    PositionNegative(i64),
11    PositionTooBig(i64),
12}
13impl SValue {
14    #[allow(unused)]
15    pub fn nth_letter_of_me<Q>(&self, one_based_n: &SValue, sink: &mut Q) -> SValue
16    where
17        Q: QuirkSink<NthLetterOfTextQ>
18            + QuirkSink<SValueToNumberQ>
19            + QuirkSink<NumberTooBigForIntQ>,
20    {
21        let letter_pos = one_based_n.floor(sink).int_or_border(sink);
22        let string = self.as_text();
23        if !one_based_n.is_int() {
24            sink.put(NthLetterOfTextQ::PositionIsNotInt(one_based_n.clone()));
25        } else if letter_pos < 0 {
26            sink.put(NthLetterOfTextQ::PositionNegative(letter_pos));
27        } else if letter_pos == 0 {
28            sink.put(NthLetterOfTextQ::PositionZero);
29        } else if letter_pos as usize <= string.len() {
30            let zero_based = (letter_pos - 1) as usize;
31            if let Some(d) = string.chars().nth(zero_based) {
32                return SValue::Text(d.to_string().into());
33            }
34        } else {
35            sink.put(NthLetterOfTextQ::PositionTooBig(letter_pos));
36        }
37
38        SValue::Text("".into())
39    }
40}