aopt_core/value/
accessor.rs1use std::any::type_name;
2use std::ffi::{OsStr, OsString};
3use std::ops::{Deref, DerefMut};
4
5use super::AnyValue;
6use super::ErasedValue;
7use super::RawValParser;
8use super::ValInitializer;
9use super::ValStorer;
10use super::ValValidator;
11
12use crate::ctx::Ctx;
13use crate::error;
14use crate::map::ErasedTy;
15use crate::opt::Action;
16use crate::Error;
17
18#[derive(Debug)]
95pub struct ValAccessor {
96 any_value: AnyValue,
97
98 rawval: Vec<OsString>,
99
100 storer: ValStorer,
101
102 initializer: ValInitializer,
103}
104
105impl Default for ValAccessor {
106 fn default() -> Self {
107 Self::fallback::<String>()
108 }
109}
110
111impl ValAccessor {
112 pub fn new(storer: ValStorer, initializer: ValInitializer) -> Self {
113 Self {
114 any_value: AnyValue::default(),
115 rawval: vec![],
116 storer,
117 initializer,
118 }
119 }
120
121 pub fn new_validator<U: ErasedTy + RawValParser>(
122 validator: ValValidator<U>,
123 initializer: ValInitializer,
124 ) -> Self {
125 Self {
126 any_value: AnyValue::default(),
127 rawval: vec![],
128 storer: ValStorer::new_validator(validator),
129 initializer,
130 }
131 }
132
133 pub fn fallback<U: ErasedTy + RawValParser>() -> Self {
134 Self {
135 any_value: AnyValue::default(),
136 rawval: vec![],
137 storer: ValStorer::fallback::<U>(),
138 initializer: ValInitializer::fallback(),
139 }
140 }
141
142 pub fn with_storer(mut self, storer: ValStorer) -> Self {
143 self.storer = storer;
144 self
145 }
146
147 pub fn with_initializer(mut self, initializer: ValInitializer) -> Self {
148 self.initializer = initializer;
149 self
150 }
151
152 pub fn set_storer(&mut self, storer: ValStorer) -> &mut Self {
153 self.storer = storer;
154 self
155 }
156
157 pub fn set_initializer(&mut self, initializer: ValInitializer) -> &mut Self {
158 self.initializer = initializer;
159 self
160 }
161
162 pub fn storer(&self) -> &ValStorer {
163 &self.storer
164 }
165
166 pub fn initializer(&self) -> &ValInitializer {
167 &self.initializer
168 }
169
170 pub fn storer_mut(&mut self) -> &mut ValStorer {
171 &mut self.storer
172 }
173
174 pub fn initializer_mut(&mut self) -> &mut ValInitializer {
175 &mut self.initializer
176 }
177
178 pub fn handlers(&mut self) -> (&mut Vec<OsString>, &mut AnyValue) {
179 (&mut self.rawval, &mut self.any_value)
180 }
181
182 pub fn store_all(
185 &mut self,
186 arg: Option<&OsStr>,
187 ctx: &Ctx,
188 act: &Action,
189 ) -> Result<bool, Error> {
190 match self.store(arg, ctx, act) {
191 Ok(_) => {
192 if let Some(raw) = arg {
193 self.rawval.push(raw.to_os_string());
194 }
195 Ok(true)
196 }
197 Err(e) => Err(e),
198 }
199 }
200}
201
202impl Deref for ValAccessor {
203 type Target = AnyValue;
204
205 fn deref(&self) -> &Self::Target {
206 &self.any_value
207 }
208}
209
210impl DerefMut for ValAccessor {
211 fn deref_mut(&mut self) -> &mut Self::Target {
212 &mut self.any_value
213 }
214}
215
216impl ErasedValue for ValAccessor {
217 fn initialize(&mut self) -> Result<(), Error> {
218 let handler = &mut self.any_value;
219
220 self.initializer.invoke(handler)
221 }
222
223 fn store(&mut self, arg: Option<&OsStr>, ctx: &Ctx, act: &Action) -> Result<(), Error> {
224 let handler = &mut self.any_value;
225
226 self.storer.invoke(arg, ctx, act, handler)
227 }
228
229 fn store_act<U: ErasedTy>(&mut self, val: U, _: &Ctx, act: &Action) -> Result<(), Error> {
230 let handler = &mut self.any_value;
231 let value = val;
232
233 match act {
234 Action::Set => {
235 handler.set(vec![value]);
236 }
237 Action::App => {
238 handler.push(value);
239 }
240 Action::Pop => {
241 handler.pop::<U>();
242 }
243 Action::Cnt => {
244 handler.entry::<u64>().or_insert(vec![0])[0] += 1;
245 }
246 Action::Clr => {
247 handler.remove::<U>();
248 }
249 Action::Null => {
250 }
252 }
253 Ok(())
254 }
255
256 fn val<U: ErasedTy>(&self) -> Result<&U, Error> {
257 self.any_value.val()
258 }
259
260 fn val_mut<U: ErasedTy>(&mut self) -> Result<&mut U, Error> {
261 self.any_value.val_mut()
262 }
263
264 fn vals<U: ErasedTy>(&self) -> Result<&Vec<U>, Error> {
265 self.any_value.vals()
266 }
267
268 fn vals_mut<U: ErasedTy>(&mut self) -> Result<&mut Vec<U>, Error> {
269 self.any_value.vals_mut()
270 }
271
272 fn take_val<U: ErasedTy>(&mut self) -> Result<U, Error> {
273 self.any_value.pop().ok_or_else(|| {
274 error!(
275 "can not take more value for type `{:?}` in ErasedVal(take_val)",
276 type_name::<U>()
277 )
278 })
279 }
280
281 fn take_vals<U: ErasedTy>(&mut self) -> Result<Vec<U>, Error> {
282 self.any_value.remove().ok_or_else(|| {
283 error!(
284 "can not take more values for type `{:?}` in ErasedVal(take_vals)",
285 type_name::<U>()
286 )
287 })
288 }
289
290 fn rawval(&self) -> Result<&OsString, Error> {
291 self.rawval
292 .last()
293 .ok_or_else(|| error!("no more raw value in accessor"))
294 }
295
296 fn rawval_mut(&mut self) -> Result<&mut OsString, Error> {
297 self.rawval
298 .last_mut()
299 .ok_or_else(|| error!("no more raw value in accessor"))
300 }
301
302 fn rawvals(&self) -> Result<&Vec<OsString>, Error> {
303 Ok(&self.rawval)
304 }
305
306 fn rawvals_mut(&mut self) -> Result<&mut Vec<OsString>, Error> {
307 Ok(&mut self.rawval)
308 }
309
310 fn take_rawval<U: ErasedTy>(&mut self) -> Result<OsString, Error> {
311 self.rawval
312 .pop()
313 .ok_or_else(|| error!("no more raw value in accessor"))
314 }
315
316 fn take_rawvals<U: ErasedTy>(&mut self) -> Result<Vec<OsString>, Error> {
317 Ok(std::mem::take(&mut self.rawval))
318 }
319}