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