1mod global_setup;
6
7pub(crate) use global_setup::{
8 copy_global_data_srcs_to_map, create_data_conn_from_global_data_src,
9};
10pub use global_setup::{create_static_data_src_container, setup, setup_with_order, uses};
11
12use crate::{
13 AsyncGroup, DataConn, DataConnContainer, DataSrc, DataSrcContainer, DataSrcManager, ErrEntry,
14 SendSyncNonNull,
15};
16
17use std::collections::HashMap;
18use std::sync::Arc;
19use std::{any, mem, ptr};
20
21#[derive(Debug)]
23pub enum DataSrcError {
24 FailToRegisterGlobalDataSrc {
27 name: Arc<str>,
29 },
30
31 FailToSetupGlobalDataSrcs {
34 errors: Vec<ErrEntry>,
36 },
37
38 DuringSetupGlobalDataSrcs,
40
41 AlreadySetupGlobalDataSrcs,
43
44 FailToCastDataConn {
46 name: Arc<str>,
48
49 target_type: &'static str,
51 },
52
53 FailToCreateDataConn {
55 name: Arc<str>,
57
58 data_conn_type: &'static str,
60 },
61
62 NotFoundDataSrcToCreateDataConn {
65 name: Arc<str>,
67
68 data_conn_type: &'static str,
70 },
71}
72
73impl<S, C> DataSrcContainer<S, C>
74where
75 S: DataSrc<C>,
76 C: DataConn + 'static,
77{
78 pub(crate) fn new(name: impl Into<Arc<str>>, data_src: S, local: bool) -> Self {
79 Self {
80 drop_fn: drop_data_src::<S, C>,
81 setup_fn: setup_data_src::<S, C>,
82 close_fn: close_data_src::<S, C>,
83 create_data_conn_fn: create_data_conn::<S, C>,
84 is_data_conn_fn: is_data_conn::<C>,
85
86 local,
87 name: name.into(),
88 data_src,
89 }
90 }
91}
92
93fn drop_data_src<S, C>(ptr: *const DataSrcContainer)
94where
95 S: DataSrc<C>,
96 C: DataConn + 'static,
97{
98 let typed_ptr = ptr as *mut DataSrcContainer<S, C>;
99 drop(unsafe { Box::from_raw(typed_ptr) });
100}
101
102fn setup_data_src<S, C>(ptr: *const DataSrcContainer, ag: &mut AsyncGroup) -> errs::Result<()>
103where
104 S: DataSrc<C>,
105 C: DataConn + 'static,
106{
107 let typed_ptr = ptr as *mut DataSrcContainer<S, C>;
108 unsafe { (*typed_ptr).data_src.setup(ag) }
109}
110
111fn close_data_src<S, C>(ptr: *const DataSrcContainer)
112where
113 S: DataSrc<C>,
114 C: DataConn + 'static,
115{
116 let typed_ptr = ptr as *mut DataSrcContainer<S, C>;
117 unsafe { (*typed_ptr).data_src.close() };
118}
119
120fn create_data_conn<S, C>(ptr: *const DataSrcContainer) -> errs::Result<Box<DataConnContainer<C>>>
121where
122 S: DataSrc<C>,
123 C: DataConn + 'static,
124{
125 let typed_ptr = ptr as *mut DataSrcContainer<S, C>;
126 let conn: Box<C> = unsafe { (*typed_ptr).data_src.create_data_conn() }?;
127 let name = unsafe { &(*typed_ptr).name };
128 Ok(Box::new(DataConnContainer::<C>::new(
129 name.to_string(),
130 conn,
131 )))
132}
133
134fn is_data_conn<C>(type_id: any::TypeId) -> bool
135where
136 C: DataConn + 'static,
137{
138 any::TypeId::of::<C>() == type_id
139}
140
141impl DataSrcManager {
142 pub(crate) const fn new(local: bool) -> Self {
143 Self {
144 vec_unready: Vec::new(),
145 vec_ready: Vec::new(),
146 local,
147 }
148 }
149
150 pub(crate) fn prepend(&mut self, vec: Vec<SendSyncNonNull<DataSrcContainer>>) {
151 self.vec_unready.splice(0..0, vec);
152 }
153
154 pub(crate) fn add<S, C>(&mut self, name: impl Into<Arc<str>>, ds: S)
155 where
156 S: DataSrc<C>,
157 C: DataConn + 'static,
158 {
159 let boxed = Box::new(DataSrcContainer::<S, C>::new(name, ds, self.local));
160 let ptr = ptr::NonNull::from(Box::leak(boxed)).cast::<DataSrcContainer>();
161 self.vec_unready.push(SendSyncNonNull::new(ptr));
162 }
163
164 pub(crate) fn remove(&mut self, name: impl AsRef<str>) {
165 let extracted_vec: Vec<_> = self
166 .vec_ready
167 .extract_if(.., |ssnnptr| {
168 unsafe { &(*ssnnptr.non_null_ptr.as_ptr()).name }.as_ref() == name.as_ref()
169 })
170 .collect();
171
172 for ssnnptr in extracted_vec.iter().rev() {
173 let ptr = ssnnptr.non_null_ptr.as_ptr();
174 let close_fn = unsafe { (*ptr).close_fn };
175 let drop_fn = unsafe { (*ptr).drop_fn };
176 close_fn(ptr);
177 drop_fn(ptr);
178 }
179
180 let extracted_vec: Vec<_> = self
181 .vec_unready
182 .extract_if(.., |ssnnptr| {
183 unsafe { &(*ssnnptr.non_null_ptr.as_ptr()).name }.as_ref() == name.as_ref()
184 })
185 .collect();
186
187 for ssnnptr in extracted_vec.iter().rev() {
188 let ptr = ssnnptr.non_null_ptr.as_ptr();
189 let drop_fn = unsafe { (*ptr).drop_fn };
190 drop_fn(ptr);
191 }
192 }
193
194 pub(crate) fn close(&mut self) {
195 let vec = mem::take(&mut self.vec_ready);
196 for ssnnptr in vec.into_iter().rev() {
197 let ptr = ssnnptr.non_null_ptr.as_ptr();
198 let close_fn = unsafe { (*ptr).close_fn };
199 let drop_fn = unsafe { (*ptr).drop_fn };
200 close_fn(ptr);
201 drop_fn(ptr);
202 }
203 let vec = mem::take(&mut self.vec_unready);
204 for ssnnptr in vec.into_iter().rev() {
205 let ptr = ssnnptr.non_null_ptr.as_ptr();
206 let drop_fn = unsafe { (*ptr).drop_fn };
207 drop_fn(ptr);
208 }
209 }
210
211 pub(crate) fn setup(&mut self, errors: &mut Vec<ErrEntry>) {
212 if self.vec_unready.is_empty() {
213 return;
214 }
215
216 let mut ag = AsyncGroup::new();
217 for (i, ssnnptr) in self.vec_unready.iter().enumerate() {
218 let ptr = ssnnptr.non_null_ptr.as_ptr();
219 let setup_fn = unsafe { (*ptr).setup_fn };
220 let name = unsafe { &(*ptr).name };
221 ag._index = i;
222 ag._name = name.clone();
223 if let Err(err) = setup_fn(ptr, &mut ag) {
224 errors.push(ErrEntry {
225 index: i,
226 name: name.clone(),
227 err,
228 });
229 break;
230 }
231 }
232 let n_done = ag._index;
233 ag.join_and_collect_errors(errors);
234
235 if errors.is_empty() {
236 self.vec_ready.append(&mut self.vec_unready);
237 } else {
238 for ssnnptr in self.vec_unready[0..n_done].iter().rev() {
239 let ptr = ssnnptr.non_null_ptr.as_ptr();
240 let close_fn = unsafe { (*ptr).close_fn };
241 close_fn(ptr);
242 }
243 }
244 }
245
246 pub(crate) fn setup_with_order(&mut self, names: &[&str], errors: &mut Vec<ErrEntry>) {
247 if self.vec_unready.is_empty() {
248 return;
249 }
250
251 let mut index_map: HashMap<&str, usize> = HashMap::with_capacity(names.len());
252 for (i, nm) in names.iter().rev().enumerate() {
254 index_map.insert(*nm, names.len() - 1 - i);
255 }
256
257 let mut ordered_indexes = Vec::<Option<usize>>::with_capacity(self.vec_unready.len());
258 ordered_indexes.resize(names.len(), None);
259
260 for vec_index in 0..self.vec_unready.len() {
261 let ssnnptr = &self.vec_unready[vec_index];
262 let ptr = ssnnptr.non_null_ptr.as_ptr();
263 let name = unsafe { (*ptr).name.clone() };
264 if let Some(order_index) = index_map.remove(name.as_ref()) {
265 ordered_indexes[order_index] = Some(vec_index);
266 } else {
267 ordered_indexes.push(Some(vec_index));
268 }
269 }
270
271 let mut ag = AsyncGroup::new();
272 let mut n_done = 0;
273 for vec_index_opt in ordered_indexes.iter() {
274 if let Some(vec_index) = vec_index_opt {
275 let ssnnptr = &self.vec_unready[*vec_index];
276 let ptr = ssnnptr.non_null_ptr.as_ptr();
277 let setup_fn = unsafe { (*ptr).setup_fn };
278 let name = unsafe { &(*ptr).name };
279 ag._index = *vec_index;
280 ag._name = name.clone();
281 if let Err(err) = setup_fn(ptr, &mut ag) {
282 errors.push(ErrEntry {
283 index: *vec_index,
284 name: name.clone(),
285 err,
286 });
287 break;
288 }
289 }
290 n_done += 1;
291 }
292 ag.join_and_collect_errors(errors);
293
294 if errors.is_empty() {
295 let old_unready = mem::take(&mut self.vec_unready);
296 self.vec_ready
298 .reserve(ordered_indexes.iter().flatten().count());
299 for vec_index in ordered_indexes.iter().flatten() {
300 self.vec_ready.push(old_unready[*vec_index]);
301 }
302 } else {
303 for vec_index in ordered_indexes.iter().take(n_done).flatten().rev() {
304 let ssnnptr = &self.vec_unready[*vec_index];
305 let ptr = ssnnptr.non_null_ptr.as_ptr();
306 let close_fn = unsafe { (*ptr).close_fn };
307 close_fn(ptr);
308 }
309 }
310 }
311
312 pub(crate) fn copy_ds_ready_to_map(&self, index_map: &mut HashMap<Arc<str>, (bool, usize)>) {
313 for (i, ssnnptr) in self.vec_ready.iter().enumerate() {
314 let ptr = ssnnptr.non_null_ptr.as_ptr();
315 let name = unsafe { (*ptr).name.clone() };
316 index_map.insert(name, (self.local, i));
317 }
318 }
319
320 pub(crate) fn create_data_conn<C>(
321 &self,
322 index: usize,
323 name: impl AsRef<str>,
324 ) -> errs::Result<Box<DataConnContainer>>
325 where
326 C: DataConn + 'static,
327 {
328 if let Some(ssnnptr) = self.vec_ready.get(index) {
329 let ptr = ssnnptr.non_null_ptr.as_ptr();
330 let type_id = any::TypeId::of::<C>();
331 let is_fn = unsafe { (*ptr).is_data_conn_fn };
332 let create_data_conn_fn = unsafe { (*ptr).create_data_conn_fn };
333 if !is_fn(type_id) {
334 Err(errs::Err::new(DataSrcError::FailToCastDataConn {
335 name: name.as_ref().into(),
336 target_type: any::type_name::<C>(),
337 }))
338 } else {
339 match create_data_conn_fn(ptr) {
340 Ok(boxed) => Ok(boxed),
341 Err(err) => Err(errs::Err::with_source(
342 DataSrcError::FailToCreateDataConn {
343 name: name.as_ref().into(),
344 data_conn_type: any::type_name::<C>(),
345 },
346 err,
347 )),
348 }
349 }
350 } else {
351 Err(errs::Err::new(
352 DataSrcError::NotFoundDataSrcToCreateDataConn {
353 name: name.as_ref().into(),
354 data_conn_type: any::type_name::<C>(),
355 },
356 ))
357 }
358 }
359}
360
361impl Drop for DataSrcManager {
362 fn drop(&mut self) {
363 self.close();
364 }
365}
366
367#[cfg_attr(coverage_nightly, coverage(off))]
368#[cfg(test)]
369mod tests_of_data_src {
370 use super::*;
371 use std::sync::{Arc, Mutex};
372
373 struct SyncDataConn {}
374 impl SyncDataConn {
375 fn new() -> Self {
376 Self {}
377 }
378 }
379 impl DataConn for SyncDataConn {
380 fn commit(&mut self, _ag: &mut AsyncGroup) -> errs::Result<()> {
381 Ok(())
382 }
383 fn is_committed(&self) -> bool {
384 false
385 }
386 fn rollback(&mut self, _ag: &mut AsyncGroup) -> errs::Result<()> {
387 Ok(())
388 }
389 fn close(&mut self) {}
390 }
391
392 struct AsyncDataConn {}
393 impl AsyncDataConn {
394 fn new() -> Self {
395 Self {}
396 }
397 }
398 impl DataConn for AsyncDataConn {
399 fn commit(&mut self, _ag: &mut AsyncGroup) -> errs::Result<()> {
400 Ok(())
401 }
402 fn is_committed(&self) -> bool {
403 false
404 }
405 fn rollback(&mut self, _ag: &mut AsyncGroup) -> errs::Result<()> {
406 Ok(())
407 }
408 fn close(&mut self) {}
409 }
410
411 struct SyncDataSrc {
412 id: i8,
413 logger: Arc<Mutex<Vec<String>>>,
414 fail_to_setup: bool,
415 fail_to_create_data_conn: bool,
416 }
417 impl SyncDataSrc {
418 fn new(id: i8, logger: Arc<Mutex<Vec<String>>>, fail_to_setup: bool) -> Self {
419 logger
420 .lock()
421 .unwrap()
422 .push(format!("SyncDataSrc::new {}", id));
423 Self {
424 id,
425 logger: logger,
426 fail_to_setup,
427 fail_to_create_data_conn: false,
428 }
429 }
430 fn new_for_fail_to_create_data_conn(id: i8, logger: Arc<Mutex<Vec<String>>>) -> Self {
431 Self {
432 id,
433 logger: logger,
434 fail_to_setup: false,
435 fail_to_create_data_conn: true,
436 }
437 }
438 }
439 impl Drop for SyncDataSrc {
440 fn drop(&mut self) {
441 self.logger
442 .lock()
443 .unwrap()
444 .push(format!("SyncDataSrc::drop {}", self.id));
445 }
446 }
447 impl DataSrc<SyncDataConn> for SyncDataSrc {
448 fn setup(&mut self, _ag: &mut AsyncGroup) -> errs::Result<()> {
449 if self.fail_to_setup {
450 self.logger
451 .lock()
452 .unwrap()
453 .push(format!("SyncDataSrc::setup {} failed", self.id));
454 return Err(errs::Err::new("XXX".to_string()));
455 }
456 self.logger
457 .lock()
458 .unwrap()
459 .push(format!("SyncDataSrc::setup {}", self.id));
460 Ok(())
461 }
462 fn close(&mut self) {
463 self.logger
464 .lock()
465 .unwrap()
466 .push(format!("SyncDataSrc::close {}", self.id));
467 }
468 fn create_data_conn(&mut self) -> errs::Result<Box<SyncDataConn>> {
469 {
470 self.logger
471 .lock()
472 .unwrap()
473 .push(format!("SyncDataSrc::create_data_conn {}", self.id));
474 }
475 if self.fail_to_create_data_conn {
476 return Err(errs::Err::new("eeee".to_string()));
477 }
478 let conn = SyncDataConn::new();
479 Ok(Box::new(conn))
480 }
481 }
482
483 struct AsyncDataSrc {
484 id: i8,
485 fail: bool,
486 logger: Arc<Mutex<Vec<String>>>,
487 wait: u64,
488 }
489 impl AsyncDataSrc {
490 fn new(id: i8, logger: Arc<Mutex<Vec<String>>>, fail: bool, wait: u64) -> Self {
491 logger
492 .lock()
493 .unwrap()
494 .push(format!("AsyncDataSrc::new {}", id));
495 Self {
496 id,
497 fail,
498 logger,
499 wait,
500 }
501 }
502 }
503 impl Drop for AsyncDataSrc {
504 fn drop(&mut self) {
505 self.logger
506 .lock()
507 .unwrap()
508 .push(format!("AsyncDataSrc::drop {}", self.id));
509 }
510 }
511 impl DataSrc<AsyncDataConn> for AsyncDataSrc {
512 fn setup(&mut self, ag: &mut AsyncGroup) -> errs::Result<()> {
513 let logger = self.logger.clone();
514 let fail = self.fail;
515 let id = self.id;
516 let wait = self.wait;
517 ag.add(move || {
518 std::thread::sleep(std::time::Duration::from_millis(wait));
519 let mut logger = logger.lock().unwrap();
520 if fail {
521 logger.push(format!("AsyncDataSrc::setup {} failed to setup", id));
522 return Err(errs::Err::new("XXX".to_string()));
523 }
524 logger.push(format!("AsyncDataSrc::setup {}", id));
525 Ok(())
526 });
527 Ok(())
528 }
529 fn close(&mut self) {
530 self.logger
531 .lock()
532 .unwrap()
533 .push(format!("AsyncDataSrc::close {}", self.id));
534 }
535 fn create_data_conn(&mut self) -> errs::Result<Box<AsyncDataConn>> {
536 {
537 self.logger
538 .lock()
539 .unwrap()
540 .push(format!("AsyncDataSrc::create_data_conn {}", self.id));
541 }
542 let conn = AsyncDataConn::new();
543 Ok(Box::new(conn))
544 }
545 }
546
547 #[test]
548 fn test_of_new() {
549 let manager = DataSrcManager::new(true);
550 assert!(manager.local);
551 assert_eq!(manager.vec_unready.len(), 0);
552 assert_eq!(manager.vec_ready.len(), 0);
553
554 let manager = DataSrcManager::new(false);
555 assert!(!manager.local);
556 assert_eq!(manager.vec_unready.len(), 0);
557 assert_eq!(manager.vec_ready.len(), 0);
558 }
559
560 #[test]
561 fn test_of_prepend() {
562 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
563
564 {
565 let mut vec = Vec::<SendSyncNonNull<DataSrcContainer>>::new();
566
567 let ds = SyncDataSrc::new(1, logger.clone(), false);
568 let boxed = Box::new(DataSrcContainer::new("foo", ds, true));
569 let ptr = ptr::NonNull::from(Box::leak(boxed)).cast::<DataSrcContainer>();
570 vec.push(SendSyncNonNull::new(ptr));
571
572 let ds = AsyncDataSrc::new(2, logger.clone(), false, 0);
573 let boxed = Box::new(DataSrcContainer::new("bar", ds, true));
574 let ptr = ptr::NonNull::from(Box::leak(boxed)).cast::<DataSrcContainer>();
575 vec.push(SendSyncNonNull::new(ptr));
576
577 let mut manager = DataSrcManager::new(true);
578 manager.prepend(vec);
579
580 assert!(manager.local);
581 assert_eq!(manager.vec_unready.len(), 2);
582 assert_eq!(manager.vec_ready.len(), 0);
583
584 assert_eq!(
585 unsafe { manager.vec_unready[0].non_null_ptr.as_ref().name.clone() },
586 "foo".into()
587 );
588 assert_eq!(
589 unsafe { manager.vec_unready[1].non_null_ptr.as_ref().name.clone() },
590 "bar".into()
591 );
592
593 let mut vec = Vec::<SendSyncNonNull<DataSrcContainer>>::new();
594
595 let ds = SyncDataSrc::new(3, logger.clone(), false);
596 let boxed = Box::new(DataSrcContainer::new("baz", ds, true));
597 let ptr = ptr::NonNull::from(Box::leak(boxed)).cast::<DataSrcContainer>();
598 vec.push(SendSyncNonNull::new(ptr));
599
600 let ds = AsyncDataSrc::new(4, logger.clone(), false, 0);
601 let boxed = Box::new(DataSrcContainer::new("qux", ds, true));
602 let ptr = ptr::NonNull::from(Box::leak(boxed)).cast::<DataSrcContainer>();
603 vec.push(SendSyncNonNull::new(ptr));
604
605 manager.prepend(vec);
606
607 assert!(manager.local);
608 assert_eq!(manager.vec_unready.len(), 4);
609 assert_eq!(manager.vec_ready.len(), 0);
610
611 assert_eq!(
612 unsafe { manager.vec_unready[0].non_null_ptr.as_ref().name.clone() },
613 "baz".into()
614 );
615 assert_eq!(
616 unsafe { manager.vec_unready[1].non_null_ptr.as_ref().name.clone() },
617 "qux".into()
618 );
619 assert_eq!(
620 unsafe { manager.vec_unready[2].non_null_ptr.as_ref().name.clone() },
621 "foo".into()
622 );
623 assert_eq!(
624 unsafe { manager.vec_unready[3].non_null_ptr.as_ref().name.clone() },
625 "bar".into()
626 );
627 }
628
629 assert_eq!(
630 *logger.lock().unwrap(),
631 vec![
632 "SyncDataSrc::new 1",
633 "AsyncDataSrc::new 2",
634 "SyncDataSrc::new 3",
635 "AsyncDataSrc::new 4",
636 "AsyncDataSrc::drop 2",
637 "SyncDataSrc::drop 1",
638 "AsyncDataSrc::drop 4",
639 "SyncDataSrc::drop 3",
640 ],
641 );
642 }
643
644 #[test]
645 fn test_of_add() {
646 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
647
648 {
649 let mut manager = DataSrcManager::new(true);
650
651 let ds = SyncDataSrc::new(1, logger.clone(), false);
652 manager.add("foo", ds);
653
654 assert!(manager.local);
655 assert_eq!(manager.vec_unready.len(), 1);
656 assert_eq!(manager.vec_ready.len(), 0);
657
658 assert_eq!(
659 unsafe { manager.vec_unready[0].non_null_ptr.as_ref().name.clone() },
660 "foo".into()
661 );
662
663 let ds = AsyncDataSrc::new(2, logger.clone(), false, 0);
664 manager.add("bar", ds);
665
666 assert!(manager.local);
667 assert_eq!(manager.vec_unready.len(), 2);
668 assert_eq!(manager.vec_ready.len(), 0);
669
670 assert_eq!(
671 unsafe { manager.vec_unready[0].non_null_ptr.as_ref().name.clone() },
672 "foo".into()
673 );
674 assert_eq!(
675 unsafe { manager.vec_unready[1].non_null_ptr.as_ref().name.clone() },
676 "bar".into()
677 );
678 }
679
680 assert_eq!(
681 *logger.lock().unwrap(),
682 vec![
683 "SyncDataSrc::new 1",
684 "AsyncDataSrc::new 2",
685 "AsyncDataSrc::drop 2",
686 "SyncDataSrc::drop 1",
687 ],
688 );
689 }
690
691 #[test]
692 fn test_of_remove() {
693 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
694
695 {
696 let mut manager = DataSrcManager::new(true);
697
698 let ds1 = SyncDataSrc::new(1, logger.clone(), false);
699 let boxed = Box::new(DataSrcContainer::new("foo", ds1, true));
700 let ptr = ptr::NonNull::from(Box::leak(boxed)).cast::<DataSrcContainer>();
701 manager.vec_unready.push(SendSyncNonNull::new(ptr));
702
703 let ds2 = AsyncDataSrc::new(2, logger.clone(), false, 0);
704 let boxed = Box::new(DataSrcContainer::new("bar", ds2, true));
705 let ptr = ptr::NonNull::from(Box::leak(boxed)).cast::<DataSrcContainer>();
706 manager.vec_unready.push(SendSyncNonNull::new(ptr));
707
708 let ds3 = SyncDataSrc::new(3, logger.clone(), false);
709 let boxed = Box::new(DataSrcContainer::new("baz", ds3, true));
710 let ptr = ptr::NonNull::from(Box::leak(boxed)).cast::<DataSrcContainer>();
711 manager.vec_ready.push(SendSyncNonNull::new(ptr));
712
713 let ds4 = AsyncDataSrc::new(4, logger.clone(), false, 0);
714 let boxed = Box::new(DataSrcContainer::new("qux", ds4, true));
715 let ptr = ptr::NonNull::from(Box::leak(boxed)).cast::<DataSrcContainer>();
716 manager.vec_ready.push(SendSyncNonNull::new(ptr));
717
718 assert!(manager.local);
719 assert_eq!(manager.vec_unready.len(), 2);
720 assert_eq!(manager.vec_ready.len(), 2);
721
722 manager.remove("baz");
723 manager.remove("foo");
724 manager.remove("qux");
725 manager.remove("bar");
726 }
727
728 assert_eq!(
729 *logger.lock().unwrap(),
730 vec![
731 "SyncDataSrc::new 1",
732 "AsyncDataSrc::new 2",
733 "SyncDataSrc::new 3",
734 "AsyncDataSrc::new 4",
735 "SyncDataSrc::close 3",
736 "SyncDataSrc::drop 3",
737 "SyncDataSrc::drop 1",
738 "AsyncDataSrc::close 4",
739 "AsyncDataSrc::drop 4",
740 "AsyncDataSrc::drop 2",
741 ],
742 );
743 }
744
745 #[test]
746 fn test_of_close() {
747 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
748
749 {
750 let mut manager = DataSrcManager::new(true);
751
752 let ds1 = SyncDataSrc::new(1, logger.clone(), false);
753 let boxed = Box::new(DataSrcContainer::new("foo", ds1, true));
754 let ptr = ptr::NonNull::from(Box::leak(boxed)).cast::<DataSrcContainer>();
755 manager.vec_unready.push(SendSyncNonNull::new(ptr));
756
757 let ds2 = AsyncDataSrc::new(2, logger.clone(), false, 0);
758 let boxed = Box::new(DataSrcContainer::new("bar", ds2, true));
759 let ptr = ptr::NonNull::from(Box::leak(boxed)).cast::<DataSrcContainer>();
760 manager.vec_unready.push(SendSyncNonNull::new(ptr));
761
762 let ds3 = SyncDataSrc::new(3, logger.clone(), false);
763 let boxed = Box::new(DataSrcContainer::new("baz", ds3, true));
764 let ptr = ptr::NonNull::from(Box::leak(boxed)).cast::<DataSrcContainer>();
765 manager.vec_ready.push(SendSyncNonNull::new(ptr));
766
767 let ds4 = AsyncDataSrc::new(4, logger.clone(), false, 0);
768 let boxed = Box::new(DataSrcContainer::new("qux", ds4, true));
769 let ptr = ptr::NonNull::from(Box::leak(boxed)).cast::<DataSrcContainer>();
770 manager.vec_ready.push(SendSyncNonNull::new(ptr));
771
772 assert!(manager.local);
773 assert_eq!(manager.vec_unready.len(), 2);
774 assert_eq!(manager.vec_ready.len(), 2);
775
776 manager.close();
777 }
778
779 assert_eq!(
780 *logger.lock().unwrap(),
781 vec![
782 "SyncDataSrc::new 1",
783 "AsyncDataSrc::new 2",
784 "SyncDataSrc::new 3",
785 "AsyncDataSrc::new 4",
786 "AsyncDataSrc::close 4",
787 "AsyncDataSrc::drop 4",
788 "SyncDataSrc::close 3",
789 "SyncDataSrc::drop 3",
790 "AsyncDataSrc::drop 2",
791 "SyncDataSrc::drop 1",
792 ],
793 );
794 }
795
796 #[test]
797 fn setup_no_data_src() {
798 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
799
800 {
801 let mut manager = DataSrcManager::new(true);
802
803 assert!(manager.local);
804 assert_eq!(manager.vec_unready.len(), 0);
805 assert_eq!(manager.vec_ready.len(), 0);
806
807 let mut errors = Vec::new();
808 manager.setup(&mut errors);
809
810 assert_eq!(errors.len(), 0);
811
812 assert!(manager.local);
813 assert_eq!(manager.vec_unready.len(), 0);
814 assert_eq!(manager.vec_ready.len(), 0);
815 }
816
817 assert_eq!(logger.lock().unwrap().len(), 0);
818 }
819
820 #[test]
821 fn test_of_setup_and_ok() {
822 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
823
824 {
825 let mut manager = DataSrcManager::new(true);
826
827 let ds1 = SyncDataSrc::new(1, logger.clone(), false);
828 manager.add("foo", ds1);
829
830 let ds2 = SyncDataSrc::new(2, logger.clone(), false);
831 manager.add("bar", ds2);
832
833 assert!(manager.local);
834 assert_eq!(manager.vec_unready.len(), 2);
835 assert_eq!(manager.vec_ready.len(), 0);
836
837 let mut vec = Vec::new();
838 manager.setup(&mut vec);
839
840 assert!(manager.local);
841 assert_eq!(manager.vec_unready.len(), 0);
842 assert_eq!(manager.vec_ready.len(), 2);
843 }
844
845 assert_eq!(
846 *logger.lock().unwrap(),
847 vec![
848 "SyncDataSrc::new 1",
849 "SyncDataSrc::new 2",
850 "SyncDataSrc::setup 1",
851 "SyncDataSrc::setup 2",
852 "SyncDataSrc::close 2",
853 "SyncDataSrc::drop 2",
854 "SyncDataSrc::close 1",
855 "SyncDataSrc::drop 1",
856 ],
857 );
858 }
859
860 #[test]
861 fn test_of_setup_but_error() {
862 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
863
864 {
865 let mut manager = DataSrcManager::new(true);
866
867 let ds1 = SyncDataSrc::new(1, logger.clone(), false);
868 manager.add("foo", ds1);
869
870 let ds2 = SyncDataSrc::new(2, logger.clone(), true);
871 manager.add("bar", ds2);
872
873 let ds3 = SyncDataSrc::new(3, logger.clone(), true);
874 manager.add("bar", ds3);
875
876 assert!(manager.local);
877 assert_eq!(manager.vec_unready.len(), 3);
878 assert_eq!(manager.vec_ready.len(), 0);
879
880 let mut errors = Vec::new();
881 manager.setup(&mut errors);
882
883 assert!(manager.local);
884 assert_eq!(manager.vec_unready.len(), 3);
885 assert_eq!(manager.vec_ready.len(), 0);
886
887 assert_eq!(errors.len(), 1);
888 assert_eq!(errors[0].index, 1);
889 assert_eq!(errors[0].name, "bar".into());
890 #[cfg(unix)]
891 assert_eq!(format!("{:?}", errors[0].err), "errs::Err { reason = alloc::string::String \"XXX\", file = src/data_src/mod.rs, line = 454 }");
892 #[cfg(windows)]
893 assert_eq!(format!("{:?}", errors[0].err), "errs::Err { reason = alloc::string::String \"XXX\", file = src\\data_src\\mod.rs, line = 454 }");
894 }
895
896 assert_eq!(
897 *logger.lock().unwrap(),
898 vec![
899 "SyncDataSrc::new 1",
900 "SyncDataSrc::new 2",
901 "SyncDataSrc::new 3",
902 "SyncDataSrc::setup 1",
903 "SyncDataSrc::setup 2 failed",
904 "SyncDataSrc::close 1",
905 "SyncDataSrc::drop 3",
906 "SyncDataSrc::drop 2",
907 "SyncDataSrc::drop 1",
908 ],
909 );
910 }
911
912 #[test]
913 fn setup_with_order_no_data_src() {
914 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
915
916 {
917 let mut manager = DataSrcManager::new(true);
918
919 assert!(manager.local);
920 assert_eq!(manager.vec_unready.len(), 0);
921 assert_eq!(manager.vec_ready.len(), 0);
922
923 let mut errors = Vec::new();
924 manager.setup_with_order(&["foo", "bar"], &mut errors);
925
926 assert_eq!(errors.len(), 0);
927
928 assert!(manager.local);
929 assert_eq!(manager.vec_unready.len(), 0);
930 assert_eq!(manager.vec_ready.len(), 0);
931 }
932
933 assert_eq!(logger.lock().unwrap().len(), 0);
934 }
935
936 #[test]
937 fn test_of_setup_with_order_and_ok() {
938 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
939
940 {
941 let mut manager = DataSrcManager::new(true);
942
943 let ds1 = SyncDataSrc::new(1, logger.clone(), false);
944 manager.add("foo", ds1);
945
946 let ds2 = SyncDataSrc::new(2, logger.clone(), false);
947 manager.add("bar", ds2);
948
949 let ds3 = SyncDataSrc::new(3, logger.clone(), false);
950 manager.add("baz", ds3);
951
952 assert!(manager.local);
953 assert_eq!(manager.vec_unready.len(), 3);
954 assert_eq!(manager.vec_ready.len(), 0);
955
956 let mut errors = Vec::new();
957 manager.setup_with_order(&["baz", "foo"], &mut errors);
958
959 assert!(manager.local);
960 assert_eq!(manager.vec_unready.len(), 0);
961 assert_eq!(manager.vec_ready.len(), 3);
962
963 assert_eq!(errors.len(), 0);
964 }
965
966 assert_eq!(
967 *logger.lock().unwrap(),
968 vec![
969 "SyncDataSrc::new 1",
970 "SyncDataSrc::new 2",
971 "SyncDataSrc::new 3",
972 "SyncDataSrc::setup 3",
973 "SyncDataSrc::setup 1",
974 "SyncDataSrc::setup 2",
975 "SyncDataSrc::close 2",
976 "SyncDataSrc::drop 2",
977 "SyncDataSrc::close 1",
978 "SyncDataSrc::drop 1",
979 "SyncDataSrc::close 3",
980 "SyncDataSrc::drop 3",
981 ],
982 );
983 }
984
985 #[test]
986 fn test_of_setup_with_order_but_fail() {
987 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
988
989 {
990 let mut manager = DataSrcManager::new(true);
991
992 let ds1 = SyncDataSrc::new(1, logger.clone(), true);
993 manager.add("foo", ds1);
994
995 let ds2 = SyncDataSrc::new(2, logger.clone(), true);
996 manager.add("bar", ds2);
997
998 let ds3 = SyncDataSrc::new(3, logger.clone(), false);
999 manager.add("baz", ds3);
1000
1001 let ds4 = SyncDataSrc::new(4, logger.clone(), false);
1002 manager.add("qux", ds4);
1003
1004 assert!(manager.local);
1005 assert_eq!(manager.vec_unready.len(), 4);
1006 assert_eq!(manager.vec_ready.len(), 0);
1007
1008 let mut errors = Vec::new();
1009 manager.setup_with_order(&["qux", "baz", "foo"], &mut errors);
1010
1011 assert!(manager.local);
1012 assert_eq!(manager.vec_unready.len(), 4);
1013 assert_eq!(manager.vec_ready.len(), 0);
1014
1015 assert_eq!(errors.len(), 1);
1016 assert_eq!(errors[0].index, 0);
1017 assert_eq!(errors[0].name, "foo".into());
1018 #[cfg(unix)]
1019 assert_eq!(format!("{:?}", errors[0].err), "errs::Err { reason = alloc::string::String \"XXX\", file = src/data_src/mod.rs, line = 454 }");
1020 #[cfg(windows)]
1021 assert_eq!(format!("{:?}", errors[0].err), "errs::Err { reason = alloc::string::String \"XXX\", file = src\\data_src\\mod.rs, line = 454 }");
1022 }
1023
1024 assert_eq!(
1025 *logger.lock().unwrap(),
1026 vec![
1027 "SyncDataSrc::new 1",
1028 "SyncDataSrc::new 2",
1029 "SyncDataSrc::new 3",
1030 "SyncDataSrc::new 4",
1031 "SyncDataSrc::setup 4",
1032 "SyncDataSrc::setup 3",
1033 "SyncDataSrc::setup 1 failed",
1034 "SyncDataSrc::close 3",
1035 "SyncDataSrc::close 4",
1036 "SyncDataSrc::drop 4",
1037 "SyncDataSrc::drop 3",
1038 "SyncDataSrc::drop 2",
1039 "SyncDataSrc::drop 1",
1040 ],
1041 );
1042 }
1043
1044 #[test]
1045 fn test_of_setup_with_order_containing_duplicated_name_and_ok() {
1046 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
1047
1048 {
1049 let mut manager = DataSrcManager::new(true);
1050
1051 let ds1 = SyncDataSrc::new(1, logger.clone(), false);
1052 manager.add("foo", ds1);
1053
1054 let ds2 = SyncDataSrc::new(2, logger.clone(), false);
1055 manager.add("bar", ds2);
1056
1057 let ds3 = SyncDataSrc::new(3, logger.clone(), false);
1058 manager.add("baz", ds3);
1059
1060 assert!(manager.local);
1061 assert_eq!(manager.vec_unready.len(), 3);
1062 assert_eq!(manager.vec_ready.len(), 0);
1063
1064 let mut vec = Vec::new();
1065 manager.setup_with_order(&["baz", "baz", "foo"], &mut vec);
1066
1067 assert!(manager.local);
1068 assert_eq!(manager.vec_unready.len(), 0);
1069 assert_eq!(manager.vec_ready.len(), 3);
1070 }
1071
1072 assert_eq!(
1073 *logger.lock().unwrap(),
1074 vec![
1075 "SyncDataSrc::new 1",
1076 "SyncDataSrc::new 2",
1077 "SyncDataSrc::new 3",
1078 "SyncDataSrc::setup 3",
1079 "SyncDataSrc::setup 1",
1080 "SyncDataSrc::setup 2",
1081 "SyncDataSrc::close 2",
1082 "SyncDataSrc::drop 2",
1083 "SyncDataSrc::close 1",
1084 "SyncDataSrc::drop 1",
1085 "SyncDataSrc::close 3",
1086 "SyncDataSrc::drop 3",
1087 ],
1088 );
1089 }
1090
1091 #[test]
1092 fn test_of_setup_with_order_containing_duplicated_name_and_ok_2() {
1093 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
1094
1095 {
1096 let mut manager = DataSrcManager::new(true);
1097
1098 let ds1 = SyncDataSrc::new(1, logger.clone(), false);
1099 manager.add("foo", ds1);
1100
1101 let ds2 = SyncDataSrc::new(2, logger.clone(), false);
1102 manager.add("bar", ds2);
1103
1104 let ds3 = SyncDataSrc::new(3, logger.clone(), false);
1105 manager.add("baz", ds3);
1106
1107 let ds4 = SyncDataSrc::new(4, logger.clone(), false);
1108 manager.add("qux", ds4);
1109
1110 assert!(manager.local);
1111 assert_eq!(manager.vec_unready.len(), 4);
1112 assert_eq!(manager.vec_ready.len(), 0);
1113
1114 let mut vec = Vec::new();
1115 manager.setup_with_order(&["baz", "foo", "baz", "qux"], &mut vec);
1116
1117 assert!(manager.local);
1118 assert_eq!(manager.vec_unready.len(), 0);
1119 assert_eq!(manager.vec_ready.len(), 4);
1120 }
1121
1122 assert_eq!(
1123 *logger.lock().unwrap(),
1124 vec![
1125 "SyncDataSrc::new 1",
1126 "SyncDataSrc::new 2",
1127 "SyncDataSrc::new 3",
1128 "SyncDataSrc::new 4",
1129 "SyncDataSrc::setup 3",
1130 "SyncDataSrc::setup 1",
1131 "SyncDataSrc::setup 4",
1132 "SyncDataSrc::setup 2",
1133 "SyncDataSrc::close 2",
1134 "SyncDataSrc::drop 2",
1135 "SyncDataSrc::close 4",
1136 "SyncDataSrc::drop 4",
1137 "SyncDataSrc::close 1",
1138 "SyncDataSrc::drop 1",
1139 "SyncDataSrc::close 3",
1140 "SyncDataSrc::drop 3",
1141 ],
1142 );
1143 }
1144
1145 #[test]
1146 fn test_of_setup_with_order_buf_one_of_names_is_not_used() {
1147 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
1148
1149 {
1150 let mut manager = DataSrcManager::new(true);
1151
1152 let ds1 = SyncDataSrc::new(1, logger.clone(), false);
1153 manager.add("foo", ds1);
1154
1155 let ds2 = SyncDataSrc::new(2, logger.clone(), false);
1156 manager.add("bar", ds2);
1157
1158 let ds3 = SyncDataSrc::new(3, logger.clone(), false);
1159 manager.add("baz", ds3);
1160
1161 assert!(manager.local);
1162 assert_eq!(manager.vec_unready.len(), 3);
1163 assert_eq!(manager.vec_ready.len(), 0);
1164
1165 let mut vec = Vec::new();
1166 manager.setup_with_order(&["baz", "foo", "xxx"], &mut vec);
1167
1168 assert!(manager.local);
1169 assert_eq!(manager.vec_unready.len(), 0);
1170 assert_eq!(manager.vec_ready.len(), 3);
1171 }
1172
1173 assert_eq!(
1174 *logger.lock().unwrap(),
1175 vec![
1176 "SyncDataSrc::new 1",
1177 "SyncDataSrc::new 2",
1178 "SyncDataSrc::new 3",
1179 "SyncDataSrc::setup 3",
1180 "SyncDataSrc::setup 1",
1181 "SyncDataSrc::setup 2",
1182 "SyncDataSrc::close 2",
1183 "SyncDataSrc::drop 2",
1184 "SyncDataSrc::close 1",
1185 "SyncDataSrc::drop 1",
1186 "SyncDataSrc::close 3",
1187 "SyncDataSrc::drop 3",
1188 ],
1189 );
1190 }
1191
1192 #[test]
1193 fn test_of_setup_with_order_buf_one_of_names_is_not_used_2() {
1194 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
1195
1196 {
1197 let mut manager = DataSrcManager::new(true);
1198
1199 let ds1 = SyncDataSrc::new(1, logger.clone(), false);
1200 manager.add("foo", ds1);
1201
1202 let ds2 = SyncDataSrc::new(2, logger.clone(), false);
1203 manager.add("bar", ds2);
1204
1205 assert!(manager.local);
1206 assert_eq!(manager.vec_unready.len(), 2);
1207 assert_eq!(manager.vec_ready.len(), 0);
1208
1209 let mut errors = Vec::new();
1210 manager.setup_with_order(&["baz", "foo", "xxx"], &mut errors);
1211
1212 assert!(manager.local);
1213 assert_eq!(manager.vec_unready.len(), 0);
1214 assert_eq!(manager.vec_ready.len(), 2);
1215
1216 assert!(errors.is_empty());
1217 }
1218 }
1219
1220 #[test]
1221 fn test_of_copy_ds_ready_to_map() {
1222 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
1223 let mut errors = Vec::new();
1224
1225 let mut index_map = HashMap::<Arc<str>, (bool, usize)>::new();
1226
1227 let manager = DataSrcManager::new(true);
1228 manager.copy_ds_ready_to_map(&mut index_map);
1229 assert!(index_map.is_empty());
1230
1231 let mut manager = DataSrcManager::new(true);
1232 let ds1 = SyncDataSrc::new(1, logger.clone(), false);
1233 manager.add("foo", ds1);
1234 manager.setup(&mut errors);
1235 assert!(errors.is_empty());
1236 manager.copy_ds_ready_to_map(&mut index_map);
1237 assert_eq!(index_map.len(), 1);
1238 assert_eq!(index_map.get("foo").unwrap(), &(true, 0));
1239
1240 let mut manager = DataSrcManager::new(false);
1241 let ds2 = AsyncDataSrc::new(2, logger.clone(), false, 0);
1242 let ds3 = SyncDataSrc::new(3, logger.clone(), false);
1243 manager.add("bar", ds2);
1244 manager.add("baz", ds3);
1245 manager.setup(&mut errors);
1246 assert!(errors.is_empty());
1247 manager.copy_ds_ready_to_map(&mut index_map);
1248 assert_eq!(index_map.len(), 3);
1249 assert_eq!(index_map.get("foo").unwrap(), &(true, 0));
1250 assert_eq!(index_map.get("bar").unwrap(), &(false, 0));
1251 assert_eq!(index_map.get("baz").unwrap(), &(false, 1));
1252 }
1253
1254 #[test]
1255 fn add_copydsreadytomap_remove_copydsreadytomap() {
1256 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
1257 let mut errors = Vec::new();
1258
1259 let mut manager = DataSrcManager::new(true);
1260
1261 let ds1 = SyncDataSrc::new(1, logger.clone(), false);
1262 manager.add("foo", ds1);
1263
1264 let ds2 = SyncDataSrc::new(2, logger.clone(), false);
1265 manager.add("bar", ds2);
1266
1267 manager.setup(&mut errors);
1268 assert!(errors.is_empty());
1269
1270 let mut index_map = HashMap::<Arc<str>, (bool, usize)>::new();
1271 manager.copy_ds_ready_to_map(&mut index_map);
1272 assert_eq!(index_map.len(), 2);
1273 assert_eq!(index_map.get("foo").unwrap(), &(true, 0));
1274 assert_eq!(index_map.get("bar").unwrap(), &(true, 1));
1275
1276 manager.remove("foo");
1277
1278 manager.setup(&mut errors);
1279 assert!(errors.is_empty());
1280
1281 let mut index_map = HashMap::<Arc<str>, (bool, usize)>::new();
1282 manager.copy_ds_ready_to_map(&mut index_map);
1283 assert_eq!(index_map.len(), 1);
1284 assert_eq!(index_map.get("bar").unwrap(), &(true, 0));
1285 }
1286
1287 #[test]
1288 fn test_of_create_data_conn_and_ok() {
1289 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
1290 let mut errors = Vec::new();
1291
1292 let mut manager = DataSrcManager::new(true);
1293 let ds1 = SyncDataSrc::new(1, logger.clone(), false);
1294 manager.add("foo", ds1);
1295 manager.setup(&mut errors);
1296
1297 if let Ok(boxed) = manager.create_data_conn::<SyncDataConn>(0, "foo") {
1298 assert_eq!(boxed.name.clone(), "foo".into());
1299 } else {
1300 panic!();
1301 }
1302 }
1303
1304 #[test]
1305 fn test_of_create_data_conn_but_not_found() {
1306 let mut errors = Vec::new();
1307
1308 let mut manager = DataSrcManager::new(true);
1309 manager.setup(&mut errors);
1310
1311 if let Err(err) = manager.create_data_conn::<SyncDataConn>(0, "foo") {
1312 match err.reason::<DataSrcError>() {
1313 Ok(DataSrcError::NotFoundDataSrcToCreateDataConn {
1314 name,
1315 data_conn_type,
1316 }) => {
1317 assert_eq!(*name, "foo".into());
1318 assert_eq!(
1319 *data_conn_type,
1320 "sabi::data_src::tests_of_data_src::SyncDataConn"
1321 );
1322 }
1323 _ => panic!(),
1324 }
1325 } else {
1326 panic!();
1327 }
1328 }
1329
1330 #[test]
1331 fn test_of_create_data_conn_but_fail_to_cast() {
1332 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
1333 let mut errors = Vec::new();
1334
1335 let mut manager = DataSrcManager::new(true);
1336 let ds1 = SyncDataSrc::new(1, logger.clone(), false);
1337 manager.add("foo", ds1);
1338 manager.setup(&mut errors);
1339
1340 if let Err(err) = manager.create_data_conn::<AsyncDataConn>(0, "foo") {
1341 match err.reason::<DataSrcError>() {
1342 Ok(DataSrcError::FailToCastDataConn { name, target_type }) => {
1343 assert_eq!(*name, "foo".into());
1344 assert_eq!(
1345 *target_type,
1346 "sabi::data_src::tests_of_data_src::AsyncDataConn"
1347 );
1348 }
1349 _ => panic!(),
1350 }
1351 } else {
1352 panic!();
1353 }
1354 }
1355
1356 #[test]
1357 fn test_of_create_data_conn_but_fail_to_create() {
1358 let logger = Arc::new(Mutex::new(Vec::<String>::new()));
1359 let mut errors = Vec::new();
1360
1361 let mut manager = DataSrcManager::new(true);
1362 let ds1 = SyncDataSrc::new_for_fail_to_create_data_conn(1, logger.clone());
1363 manager.add("foo", ds1);
1364 manager.setup(&mut errors);
1365
1366 if let Err(err) = manager.create_data_conn::<SyncDataConn>(0, "foo") {
1367 match err.reason::<DataSrcError>() {
1368 Ok(DataSrcError::FailToCreateDataConn {
1369 name,
1370 data_conn_type,
1371 }) => {
1372 assert_eq!(*name, "foo".into());
1373 assert_eq!(
1374 *data_conn_type,
1375 "sabi::data_src::tests_of_data_src::SyncDataConn"
1376 );
1377 }
1378 _ => panic!(),
1379 }
1380 } else {
1381 panic!();
1382 }
1383 }
1384}