spo_rhai/module/resolvers/
collection.rs1use crate::{
2 Engine, ModuleResolver, Position, RhaiResultOf, SharedModule, StaticVec, ERR,
3 STATIC_VEC_INLINE_SIZE,
4};
5#[cfg(feature = "no_std")]
6use std::prelude::v1::*;
7use std::{ops::AddAssign, slice::Iter};
8
9#[derive(Default)]
27pub struct ModuleResolversCollection(StaticVec<Box<dyn ModuleResolver>>);
28
29impl ModuleResolversCollection {
30 #[inline(always)]
47 #[must_use]
48 pub const fn new() -> Self {
49 Self(StaticVec::new_const())
50 }
51 #[inline(always)]
53 pub fn push(&mut self, resolver: impl ModuleResolver + 'static) -> &mut Self {
54 self.0.push(Box::new(resolver));
55 self
56 }
57 #[inline(always)]
63 pub fn insert(&mut self, index: usize, resolver: impl ModuleResolver + 'static) -> &mut Self {
64 self.0.insert(index, Box::new(resolver));
65 self
66 }
67 #[inline(always)]
69 pub fn pop(&mut self) -> Option<Box<dyn ModuleResolver>> {
70 self.0.pop()
71 }
72 #[inline(always)]
78 pub fn remove(&mut self, index: usize) -> Box<dyn ModuleResolver> {
79 self.0.remove(index)
80 }
81 #[inline]
83 pub fn iter(&self) -> impl Iterator<Item = &dyn ModuleResolver> {
84 self.0.iter().map(<_>::as_ref)
85 }
86 #[inline(always)]
88 pub fn clear(&mut self) -> &mut Self {
89 self.0.clear();
90 self
91 }
92 #[inline(always)]
94 #[must_use]
95 pub fn is_empty(&self) -> bool {
96 self.0.is_empty()
97 }
98 #[inline(always)]
100 #[must_use]
101 pub fn len(&self) -> usize {
102 self.0.len()
103 }
104 #[inline]
107 pub fn append(&mut self, other: Self) -> &mut Self {
108 self.0.extend(other.0);
109 self
110 }
111}
112
113impl IntoIterator for ModuleResolversCollection {
114 type Item = Box<dyn ModuleResolver>;
115 type IntoIter = smallvec::IntoIter<[Box<dyn ModuleResolver>; STATIC_VEC_INLINE_SIZE]>;
116
117 #[inline(always)]
118 #[must_use]
119 fn into_iter(self) -> Self::IntoIter {
120 self.0.into_iter()
121 }
122}
123
124impl<'a> IntoIterator for &'a ModuleResolversCollection {
125 type Item = &'a Box<dyn ModuleResolver>;
126 type IntoIter = Iter<'a, Box<dyn ModuleResolver>>;
127
128 #[inline(always)]
129 fn into_iter(self) -> Self::IntoIter {
130 self.0.iter()
131 }
132}
133
134impl Extend<Box<dyn ModuleResolver>> for ModuleResolversCollection {
135 #[inline(always)]
136 fn extend<T: IntoIterator<Item = Box<dyn ModuleResolver>>>(&mut self, iter: T) {
137 self.0.extend(iter);
138 }
139}
140
141impl<M: ModuleResolver + 'static> AddAssign<M> for ModuleResolversCollection {
142 #[inline(always)]
143 fn add_assign(&mut self, rhs: M) {
144 self.push(rhs);
145 }
146}
147
148impl ModuleResolver for ModuleResolversCollection {
149 fn resolve(
150 &self,
151 engine: &Engine,
152 source_path: Option<&str>,
153 path: &str,
154 pos: Position,
155 ) -> RhaiResultOf<SharedModule> {
156 for resolver in &self.0 {
157 match resolver.resolve(engine, source_path, path, pos) {
158 Ok(module) => return Ok(module),
159 Err(err) => match *err {
160 ERR::ErrorModuleNotFound(..) => continue,
161 ERR::ErrorInModule(_, err, _) => return Err(err),
162 _ => unreachable!("ModuleResolver::resolve returns error that is not ErrorModuleNotFound or ErrorInModule"),
163 },
164 }
165 }
166
167 Err(ERR::ErrorModuleNotFound(path.into(), pos).into())
168 }
169}