/// Given a `Span` and a string, form the resulting string selected exclusively (as in `[start..end`]) by the `Span`
/// Given a `Span` and a string, form the resulting string selected inclusively (as in `[start..=end]`) by the `Span`
if let (Some(start), Some(end)) = (self.start.grapheme_index(s), self.end.grapheme_index(s))
/// Given a string `ron`, a [`SpannedResult`], and a substring, verify that trying to parse `ron` results in an error
/// equal to the [`SpannedResult`] with a Span that exclusively (as in `[start..end]`) selects that substring.
/// Note that there are two versions of this helper, inclusive and exclusive. This is because while the parser cursor
/// arithmetic that computes span positions always produces exclusive spans (as in `[start..end]`),
/// when doing validation against a target substring, the inclusive check including the final grapheme that triggered
/// Meanwhile, if the parser threw an EOF, for example, there is no final grapheme to check, and so
pub fn check_error_span_exclusive<T: serde::de::DeserializeOwned + PartialEq + core::fmt::Debug>(
/// Given a string `ron`, a [`SpannedResult`], and a substring, verify that trying to parse `ron` results in an error
/// equal to the [`SpannedResult`] with a Span that inclusively (as in `[start..=end`]) selects that substring.
pub fn check_error_span_inclusive<T: serde::de::DeserializeOwned + PartialEq + core::fmt::Debug>(