scratch_test_value/texts/
nth_letter.rs1use 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}