1#![doc = include_str!("../README.md")]
4
5use iso10383_types::{Category, Kind, Mic, Status};
6use serde::{Deserialize, Serialize};
7use std::{
8 cell::RefCell,
9 collections::HashMap,
10 sync::atomic::{AtomicBool, Ordering},
11};
12
13#[derive(Debug, Default, Deserialize, Serialize)]
15pub struct MicList {
16 #[serde(alias = "ISO10383_MIC")]
17 mics: Vec<MicRecord>,
18 #[serde(skip)]
19 by_mics: RefCell<HashMap<String, MicRecord>>,
20 #[serde(skip)]
21 by_mics_loaded: AtomicBool,
22}
23
24impl MicList {
25 fn update_cache(&self) {
26 if self.by_mics_loaded.load(Ordering::Acquire) {
27 return;
28 }
29
30 for mic in &self.mics {
31 self.by_mics
32 .borrow_mut()
33 .insert(mic.name.clone(), mic.clone());
34 }
35 self.by_mics_loaded.store(true, Ordering::Release);
36 }
37
38 pub fn len(&self) -> usize {
40 self.update_cache();
41
42 self.mics.len()
43 }
44
45 pub fn is_empty(&self) -> bool {
47 self.update_cache();
48
49 self.mics.is_empty()
50 }
51
52 pub fn mics(&self) -> &[MicRecord] {
54 &self.mics
55 }
56}
57
58#[derive(Clone, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
60pub struct MicRecord {
61 #[serde(alias = "MIC")]
63 pub mic: Mic,
64
65 #[serde(alias = "OPERATING_x0020_MIC")]
67 pub operating_mic: Mic,
68
69 #[serde(alias = "OPRT_x002F_SGMT")]
71 pub kind: Kind,
72
73 #[serde(alias = "MARKET_x0020_NAME-INSTITUTION_x0020_DESCRIPTION")]
75 pub name: String,
76
77 #[serde(alias = "LEGAL_x0020_ENTITY_x0020_NAME")]
79 pub legal_entity_name: Option<String>,
80
81 #[serde(alias = "LEI")]
86 pub legal_entity_id: Option<String>,
87
88 #[serde(alias = "MARKET_x0020_CATEGORY_x0020_CODE")]
90 pub category: Category,
91
92 #[serde(alias = "ACRONYM")]
94 pub acronym: Option<String>,
95
96 #[serde(alias = "ISO_x0020_COUNTRY_x0020_CODE_x0020__x0028_ISO_x0020_3166_x0029_")]
98 pub country: String,
99
100 #[serde(alias = "CITY")]
102 pub city: String,
103
104 #[serde(alias = "WEBSITE")]
106 pub website: Option<String>,
107
108 #[serde(alias = "STATUS")]
110 pub status: Status,
111
112 #[serde(alias = "CREATION_x0020_DATE")]
114 pub creation_date: String,
115
116 #[serde(alias = "LAST_x0020_UPDATE_x0020_DATE")]
118 pub last_update_date: String,
119
120 #[serde(alias = "LAST_x0020_VALIDATION_x0020_DATE")]
122 pub last_validation_date: Option<String>,
123
124 #[serde(alias = "EXPIRY_x0020_DATE")]
126 pub expiry_date: Option<String>,
127
128 #[serde(alias = "COMMENTS")]
130 pub comments: Option<String>,
131}