tree_table/types/
extensions.rs1use crate::IndexCell;
2use crate::str_err;
3use alloc::format;
4use alloc::rc::Rc;
5use alloc::string::String;
6use alloc::vec::Vec;
7use hashbrown::HashMap;
8
9pub trait GetResultExt {
10 fn get_res(&self, key: &str) -> Result<&usize, String>;
11}
12impl GetResultExt for HashMap<Rc<str>, usize> {
13 fn get_res(&self, key: &str) -> Result<&usize, String> {
14 self.get(key)
15 .ok_or_else(|| str_err!("Key '{}' not found", key))
16 }
17}
18
19pub trait GetCellResultExt {
20 fn get_res(&self, index: usize) -> Result<&IndexCell, String>;
21}
22impl GetCellResultExt for Vec<IndexCell> {
23 fn get_res(&self, index: usize) -> Result<&IndexCell, String> {
24 let len = self.len();
25 self.get(index)
26 .ok_or_else(|| str_err!("Index {} out of bounds (len: {})", index, len))
27 }
28}
29
30pub trait GetCellMutResultExt {
31 fn get_res_mut(&mut self, index: usize) -> Result<&mut IndexCell, String>;
32}
33impl GetCellMutResultExt for Vec<IndexCell> {
34 fn get_res_mut(&mut self, index: usize) -> Result<&mut IndexCell, String> {
35 let len = self.len();
36 self.get_mut(index)
37 .ok_or_else(|| str_err!("Index {} out of bounds (len: {})", index, len))
38 }
39}
40
41pub trait TrySetExt<T> {
42 fn try_set(&mut self, index: usize, value: T) -> Result<(), String>;
43}
44
45impl<T> TrySetExt<T> for Vec<T> {
46 fn try_set(&mut self, index: usize, value: T) -> Result<(), String> {
47 if index < self.len() {
48 self[index] = value;
49 Ok(())
50 } else {
51 Err(format!(
52 "index {} out of bounds for length {}",
53 index,
54 self.len()
55 ))
56 }
57 }
58}
59
60impl GetCellResultExt for [IndexCell] {
61 fn get_res(&self, index: usize) -> Result<&IndexCell, String> {
62 let len = self.len();
63 self.get(index)
64 .ok_or_else(|| str_err!("Index {} out of bounds (len: {})", index, len))
65 }
66}
67
68impl GetCellMutResultExt for [IndexCell] {
69 fn get_res_mut(&mut self, index: usize) -> Result<&mut IndexCell, String> {
70 let len = self.len();
71 self.get_mut(index)
72 .ok_or_else(|| str_err!("Index {} out of bounds (len: {})", index, len))
73 }
74}
75
76impl<T> TrySetExt<T> for [T] {
77 fn try_set(&mut self, index: usize, value: T) -> Result<(), String> {
78 if index < self.len() {
79 self[index] = value;
80 Ok(())
81 } else {
82 Err(format!(
83 "index {} out of bounds for length {}",
84 index,
85 self.len()
86 ))
87 }
88 }
89}