Skip to main content

tree_table/types/
extensions.rs

1use 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}