| 341 | } |
| 342 | |
| 343 | pub fn try_get_chars(s: &str, range: impl RangeBounds<usize>) -> Option<&str> { |
| 344 | let mut chars = s.chars(); |
| 345 | let start = match range.start_bound() { |
| 346 | Bound::Included(&i) => i, |
| 347 | Bound::Excluded(&i) => i + 1, |
| 348 | Bound::Unbounded => 0, |
| 349 | }; |
| 350 | for _ in 0..start { |
| 351 | chars.next()?; |
| 352 | } |
| 353 | let s = chars.as_str(); |
| 354 | let range_len = match range.end_bound() { |
| 355 | Bound::Included(&i) => i + 1 - start, |
| 356 | Bound::Excluded(&i) => i - start, |
| 357 | Bound::Unbounded => return Some(s), |
| 358 | }; |
| 359 | char_range_end(s, range_len).map(|end| &s[..end]) |
| 360 | } |
| 361 | |
| 362 | pub fn get_chars(s: &str, range: impl RangeBounds<usize>) -> &str { |
| 363 | try_get_chars(s, range).unwrap() |