1use std::str;
18
19#[derive(Copy, Clone, Eq, PartialEq, Serialize, Deserialize, Hash, Debug)]
20pub struct Code {
21 pub(crate) value: u16,
23
24 pub(crate) source: Source,
26}
27
28#[derive(Eq, PartialEq, Copy, Clone, Serialize, Deserialize, Hash, Debug)]
31#[serde(rename_all = "snake_case")]
32pub enum Source {
33 Plus,
36
37 Idd,
40
41 Number,
45
46 Default,
53}
54
55impl Default for Source {
56 fn default() -> Self {
57 Source::Default
58 }
59}
60
61impl Code {
62 pub fn value(&self) -> u16 {
64 self.value
65 }
66
67 pub fn source(&self) -> Source {
69 self.source
70 }
71}
72
73impl Into<u16> for Code {
74 fn into(self) -> u16 {
75 self.value
76 }
77}
78
79#[derive(Eq, PartialEq, Copy, Clone, Serialize, Deserialize, Hash, Debug)]
81pub enum Id {
82 AC,
83 AD,
84 AE,
85 AF,
86 AG,
87 AI,
88 AL,
89 AM,
90 AO,
91 AR,
92 AS,
93 AT,
94 AU,
95 AW,
96 AX,
97 AZ,
98 BA,
99 BB,
100 BD,
101 BE,
102 BF,
103 BG,
104 BH,
105 BI,
106 BJ,
107 BL,
108 BM,
109 BN,
110 BO,
111 BQ,
112 BR,
113 BS,
114 BT,
115 BW,
116 BY,
117 BZ,
118 CA,
119 CC,
120 CD,
121 CF,
122 CG,
123 CH,
124 CI,
125 CK,
126 CL,
127 CM,
128 CN,
129 CO,
130 CR,
131 CU,
132 CV,
133 CW,
134 CX,
135 CY,
136 CZ,
137 DE,
138 DJ,
139 DK,
140 DM,
141 DO,
142 DZ,
143 EC,
144 EE,
145 EG,
146 EH,
147 ER,
148 ES,
149 ET,
150 FI,
151 FJ,
152 FK,
153 FM,
154 FO,
155 FR,
156 GA,
157 GB,
158 GD,
159 GE,
160 GF,
161 GG,
162 GH,
163 GI,
164 GL,
165 GM,
166 GN,
167 GP,
168 GQ,
169 GR,
170 GT,
171 GU,
172 GW,
173 GY,
174 HK,
175 HN,
176 HR,
177 HT,
178 HU,
179 ID,
180 IE,
181 IL,
182 IM,
183 IN,
184 IO,
185 IQ,
186 IR,
187 IS,
188 IT,
189 JE,
190 JM,
191 JO,
192 JP,
193 KE,
194 KG,
195 KH,
196 KI,
197 KM,
198 KN,
199 KP,
200 KR,
201 KW,
202 KY,
203 KZ,
204 LA,
205 LB,
206 LC,
207 LI,
208 LK,
209 LR,
210 LS,
211 LT,
212 LU,
213 LV,
214 LY,
215 MA,
216 MC,
217 MD,
218 ME,
219 MF,
220 MG,
221 MH,
222 MK,
223 ML,
224 MM,
225 MN,
226 MO,
227 MP,
228 MQ,
229 MR,
230 MS,
231 MT,
232 MU,
233 MV,
234 MW,
235 MX,
236 MY,
237 MZ,
238 NA,
239 NC,
240 NE,
241 NF,
242 NG,
243 NI,
244 NL,
245 NO,
246 NP,
247 NR,
248 NU,
249 NZ,
250 OM,
251 PA,
252 PE,
253 PF,
254 PG,
255 PH,
256 PK,
257 PL,
258 PM,
259 PR,
260 PS,
261 PT,
262 PW,
263 PY,
264 QA,
265 RE,
266 RO,
267 RS,
268 RU,
269 RW,
270 SA,
271 SB,
272 SC,
273 SD,
274 SE,
275 SG,
276 SH,
277 SI,
278 SJ,
279 SK,
280 SL,
281 SM,
282 SN,
283 SO,
284 SR,
285 SS,
286 ST,
287 SV,
288 SX,
289 SY,
290 SZ,
291 TA,
292 TC,
293 TD,
294 TG,
295 TH,
296 TJ,
297 TK,
298 TL,
299 TM,
300 TN,
301 TO,
302 TR,
303 TT,
304 TV,
305 TW,
306 TZ,
307 UA,
308 UG,
309 US,
310 UY,
311 UZ,
312 VA,
313 VC,
314 VE,
315 VG,
316 VI,
317 VN,
318 VU,
319 WF,
320 WS,
321 XK,
322 YE,
323 YT,
324 ZA,
325 ZM,
326 ZW,
327}
328
329pub use self::Id::*;
330
331impl str::FromStr for Id {
332 type Err = ();
333
334 fn from_str(value: &str) -> Result<Id, ()> {
335 match value {
336 "AC" => Ok(Id::AC),
337 "AD" => Ok(Id::AD),
338 "AE" => Ok(Id::AE),
339 "AF" => Ok(Id::AF),
340 "AG" => Ok(Id::AG),
341 "AI" => Ok(Id::AI),
342 "AL" => Ok(Id::AL),
343 "AM" => Ok(Id::AM),
344 "AO" => Ok(Id::AO),
345 "AR" => Ok(Id::AR),
346 "AS" => Ok(Id::AS),
347 "AT" => Ok(Id::AT),
348 "AU" => Ok(Id::AU),
349 "AW" => Ok(Id::AW),
350 "AX" => Ok(Id::AX),
351 "AZ" => Ok(Id::AZ),
352 "BA" => Ok(Id::BA),
353 "BB" => Ok(Id::BB),
354 "BD" => Ok(Id::BD),
355 "BE" => Ok(Id::BE),
356 "BF" => Ok(Id::BF),
357 "BG" => Ok(Id::BG),
358 "BH" => Ok(Id::BH),
359 "BI" => Ok(Id::BI),
360 "BJ" => Ok(Id::BJ),
361 "BL" => Ok(Id::BL),
362 "BM" => Ok(Id::BM),
363 "BN" => Ok(Id::BN),
364 "BO" => Ok(Id::BO),
365 "BQ" => Ok(Id::BQ),
366 "BR" => Ok(Id::BR),
367 "BS" => Ok(Id::BS),
368 "BT" => Ok(Id::BT),
369 "BW" => Ok(Id::BW),
370 "BY" => Ok(Id::BY),
371 "BZ" => Ok(Id::BZ),
372 "CA" => Ok(Id::CA),
373 "CC" => Ok(Id::CC),
374 "CD" => Ok(Id::CD),
375 "CF" => Ok(Id::CF),
376 "CG" => Ok(Id::CG),
377 "CH" => Ok(Id::CH),
378 "CI" => Ok(Id::CI),
379 "CK" => Ok(Id::CK),
380 "CL" => Ok(Id::CL),
381 "CM" => Ok(Id::CM),
382 "CN" => Ok(Id::CN),
383 "CO" => Ok(Id::CO),
384 "CR" => Ok(Id::CR),
385 "CU" => Ok(Id::CU),
386 "CV" => Ok(Id::CV),
387 "CW" => Ok(Id::CW),
388 "CX" => Ok(Id::CX),
389 "CY" => Ok(Id::CY),
390 "CZ" => Ok(Id::CZ),
391 "DE" => Ok(Id::DE),
392 "DJ" => Ok(Id::DJ),
393 "DK" => Ok(Id::DK),
394 "DM" => Ok(Id::DM),
395 "DO" => Ok(Id::DO),
396 "DZ" => Ok(Id::DZ),
397 "EC" => Ok(Id::EC),
398 "EE" => Ok(Id::EE),
399 "EG" => Ok(Id::EG),
400 "EH" => Ok(Id::EH),
401 "ER" => Ok(Id::ER),
402 "ES" => Ok(Id::ES),
403 "ET" => Ok(Id::ET),
404 "FI" => Ok(Id::FI),
405 "FJ" => Ok(Id::FJ),
406 "FK" => Ok(Id::FK),
407 "FM" => Ok(Id::FM),
408 "FO" => Ok(Id::FO),
409 "FR" => Ok(Id::FR),
410 "GA" => Ok(Id::GA),
411 "GB" => Ok(Id::GB),
412 "GD" => Ok(Id::GD),
413 "GE" => Ok(Id::GE),
414 "GF" => Ok(Id::GF),
415 "GG" => Ok(Id::GG),
416 "GH" => Ok(Id::GH),
417 "GI" => Ok(Id::GI),
418 "GL" => Ok(Id::GL),
419 "GM" => Ok(Id::GM),
420 "GN" => Ok(Id::GN),
421 "GP" => Ok(Id::GP),
422 "GQ" => Ok(Id::GQ),
423 "GR" => Ok(Id::GR),
424 "GT" => Ok(Id::GT),
425 "GU" => Ok(Id::GU),
426 "GW" => Ok(Id::GW),
427 "GY" => Ok(Id::GY),
428 "HK" => Ok(Id::HK),
429 "HN" => Ok(Id::HN),
430 "HR" => Ok(Id::HR),
431 "HT" => Ok(Id::HT),
432 "HU" => Ok(Id::HU),
433 "ID" => Ok(Id::ID),
434 "IE" => Ok(Id::IE),
435 "IL" => Ok(Id::IL),
436 "IM" => Ok(Id::IM),
437 "IN" => Ok(Id::IN),
438 "IO" => Ok(Id::IO),
439 "IQ" => Ok(Id::IQ),
440 "IR" => Ok(Id::IR),
441 "IS" => Ok(Id::IS),
442 "IT" => Ok(Id::IT),
443 "JE" => Ok(Id::JE),
444 "JM" => Ok(Id::JM),
445 "JO" => Ok(Id::JO),
446 "JP" => Ok(Id::JP),
447 "KE" => Ok(Id::KE),
448 "KG" => Ok(Id::KG),
449 "KH" => Ok(Id::KH),
450 "KI" => Ok(Id::KI),
451 "KM" => Ok(Id::KM),
452 "KN" => Ok(Id::KN),
453 "KP" => Ok(Id::KP),
454 "KR" => Ok(Id::KR),
455 "KW" => Ok(Id::KW),
456 "KY" => Ok(Id::KY),
457 "KZ" => Ok(Id::KZ),
458 "LA" => Ok(Id::LA),
459 "LB" => Ok(Id::LB),
460 "LC" => Ok(Id::LC),
461 "LI" => Ok(Id::LI),
462 "LK" => Ok(Id::LK),
463 "LR" => Ok(Id::LR),
464 "LS" => Ok(Id::LS),
465 "LT" => Ok(Id::LT),
466 "LU" => Ok(Id::LU),
467 "LV" => Ok(Id::LV),
468 "LY" => Ok(Id::LY),
469 "MA" => Ok(Id::MA),
470 "MC" => Ok(Id::MC),
471 "MD" => Ok(Id::MD),
472 "ME" => Ok(Id::ME),
473 "MF" => Ok(Id::MF),
474 "MG" => Ok(Id::MG),
475 "MH" => Ok(Id::MH),
476 "MK" => Ok(Id::MK),
477 "ML" => Ok(Id::ML),
478 "MM" => Ok(Id::MM),
479 "MN" => Ok(Id::MN),
480 "MO" => Ok(Id::MO),
481 "MP" => Ok(Id::MP),
482 "MQ" => Ok(Id::MQ),
483 "MR" => Ok(Id::MR),
484 "MS" => Ok(Id::MS),
485 "MT" => Ok(Id::MT),
486 "MU" => Ok(Id::MU),
487 "MV" => Ok(Id::MV),
488 "MW" => Ok(Id::MW),
489 "MX" => Ok(Id::MX),
490 "MY" => Ok(Id::MY),
491 "MZ" => Ok(Id::MZ),
492 "NA" => Ok(Id::NA),
493 "NC" => Ok(Id::NC),
494 "NE" => Ok(Id::NE),
495 "NF" => Ok(Id::NF),
496 "NG" => Ok(Id::NG),
497 "NI" => Ok(Id::NI),
498 "NL" => Ok(Id::NL),
499 "NO" => Ok(Id::NO),
500 "NP" => Ok(Id::NP),
501 "NR" => Ok(Id::NR),
502 "NU" => Ok(Id::NU),
503 "NZ" => Ok(Id::NZ),
504 "OM" => Ok(Id::OM),
505 "PA" => Ok(Id::PA),
506 "PE" => Ok(Id::PE),
507 "PF" => Ok(Id::PF),
508 "PG" => Ok(Id::PG),
509 "PH" => Ok(Id::PH),
510 "PK" => Ok(Id::PK),
511 "PL" => Ok(Id::PL),
512 "PM" => Ok(Id::PM),
513 "PR" => Ok(Id::PR),
514 "PS" => Ok(Id::PS),
515 "PT" => Ok(Id::PT),
516 "PW" => Ok(Id::PW),
517 "PY" => Ok(Id::PY),
518 "QA" => Ok(Id::QA),
519 "RE" => Ok(Id::RE),
520 "RO" => Ok(Id::RO),
521 "RS" => Ok(Id::RS),
522 "RU" => Ok(Id::RU),
523 "RW" => Ok(Id::RW),
524 "SA" => Ok(Id::SA),
525 "SB" => Ok(Id::SB),
526 "SC" => Ok(Id::SC),
527 "SD" => Ok(Id::SD),
528 "SE" => Ok(Id::SE),
529 "SG" => Ok(Id::SG),
530 "SH" => Ok(Id::SH),
531 "SI" => Ok(Id::SI),
532 "SJ" => Ok(Id::SJ),
533 "SK" => Ok(Id::SK),
534 "SL" => Ok(Id::SL),
535 "SM" => Ok(Id::SM),
536 "SN" => Ok(Id::SN),
537 "SO" => Ok(Id::SO),
538 "SR" => Ok(Id::SR),
539 "SS" => Ok(Id::SS),
540 "ST" => Ok(Id::ST),
541 "SV" => Ok(Id::SV),
542 "SX" => Ok(Id::SX),
543 "SY" => Ok(Id::SY),
544 "SZ" => Ok(Id::SZ),
545 "TA" => Ok(Id::TA),
546 "TC" => Ok(Id::TC),
547 "TD" => Ok(Id::TD),
548 "TG" => Ok(Id::TG),
549 "TH" => Ok(Id::TH),
550 "TJ" => Ok(Id::TJ),
551 "TK" => Ok(Id::TK),
552 "TL" => Ok(Id::TL),
553 "TM" => Ok(Id::TM),
554 "TN" => Ok(Id::TN),
555 "TO" => Ok(Id::TO),
556 "TR" => Ok(Id::TR),
557 "TT" => Ok(Id::TT),
558 "TV" => Ok(Id::TV),
559 "TW" => Ok(Id::TW),
560 "TZ" => Ok(Id::TZ),
561 "UA" => Ok(Id::UA),
562 "UG" => Ok(Id::UG),
563 "US" => Ok(Id::US),
564 "UY" => Ok(Id::UY),
565 "UZ" => Ok(Id::UZ),
566 "VA" => Ok(Id::VA),
567 "VC" => Ok(Id::VC),
568 "VE" => Ok(Id::VE),
569 "VG" => Ok(Id::VG),
570 "VI" => Ok(Id::VI),
571 "VN" => Ok(Id::VN),
572 "VU" => Ok(Id::VU),
573 "WF" => Ok(Id::WF),
574 "WS" => Ok(Id::WS),
575 "XK" => Ok(Id::XK),
576 "YE" => Ok(Id::YE),
577 "YT" => Ok(Id::YT),
578 "ZA" => Ok(Id::ZA),
579 "ZM" => Ok(Id::ZM),
580 "ZW" => Ok(Id::ZW),
581 _ => Err(()),
582 }
583 }
584}
585
586impl AsRef<str> for Id {
587 fn as_ref(&self) -> &str {
588 match *self {
589 Id::AC => "AC",
590 Id::AD => "AD",
591 Id::AE => "AE",
592 Id::AF => "AF",
593 Id::AG => "AG",
594 Id::AI => "AI",
595 Id::AL => "AL",
596 Id::AM => "AM",
597 Id::AO => "AO",
598 Id::AR => "AR",
599 Id::AS => "AS",
600 Id::AT => "AT",
601 Id::AU => "AU",
602 Id::AW => "AW",
603 Id::AX => "AX",
604 Id::AZ => "AZ",
605 Id::BA => "BA",
606 Id::BB => "BB",
607 Id::BD => "BD",
608 Id::BE => "BE",
609 Id::BF => "BF",
610 Id::BG => "BG",
611 Id::BH => "BH",
612 Id::BI => "BI",
613 Id::BJ => "BJ",
614 Id::BL => "BL",
615 Id::BM => "BM",
616 Id::BN => "BN",
617 Id::BO => "BO",
618 Id::BQ => "BQ",
619 Id::BR => "BR",
620 Id::BS => "BS",
621 Id::BT => "BT",
622 Id::BW => "BW",
623 Id::BY => "BY",
624 Id::BZ => "BZ",
625 Id::CA => "CA",
626 Id::CC => "CC",
627 Id::CD => "CD",
628 Id::CF => "CF",
629 Id::CG => "CG",
630 Id::CH => "CH",
631 Id::CI => "CI",
632 Id::CK => "CK",
633 Id::CL => "CL",
634 Id::CM => "CM",
635 Id::CN => "CN",
636 Id::CO => "CO",
637 Id::CR => "CR",
638 Id::CU => "CU",
639 Id::CV => "CV",
640 Id::CW => "CW",
641 Id::CX => "CX",
642 Id::CY => "CY",
643 Id::CZ => "CZ",
644 Id::DE => "DE",
645 Id::DJ => "DJ",
646 Id::DK => "DK",
647 Id::DM => "DM",
648 Id::DO => "DO",
649 Id::DZ => "DZ",
650 Id::EC => "EC",
651 Id::EE => "EE",
652 Id::EG => "EG",
653 Id::EH => "EH",
654 Id::ER => "ER",
655 Id::ES => "ES",
656 Id::ET => "ET",
657 Id::FI => "FI",
658 Id::FJ => "FJ",
659 Id::FK => "FK",
660 Id::FM => "FM",
661 Id::FO => "FO",
662 Id::FR => "FR",
663 Id::GA => "GA",
664 Id::GB => "GB",
665 Id::GD => "GD",
666 Id::GE => "GE",
667 Id::GF => "GF",
668 Id::GG => "GG",
669 Id::GH => "GH",
670 Id::GI => "GI",
671 Id::GL => "GL",
672 Id::GM => "GM",
673 Id::GN => "GN",
674 Id::GP => "GP",
675 Id::GQ => "GQ",
676 Id::GR => "GR",
677 Id::GT => "GT",
678 Id::GU => "GU",
679 Id::GW => "GW",
680 Id::GY => "GY",
681 Id::HK => "HK",
682 Id::HN => "HN",
683 Id::HR => "HR",
684 Id::HT => "HT",
685 Id::HU => "HU",
686 Id::ID => "ID",
687 Id::IE => "IE",
688 Id::IL => "IL",
689 Id::IM => "IM",
690 Id::IN => "IN",
691 Id::IO => "IO",
692 Id::IQ => "IQ",
693 Id::IR => "IR",
694 Id::IS => "IS",
695 Id::IT => "IT",
696 Id::JE => "JE",
697 Id::JM => "JM",
698 Id::JO => "JO",
699 Id::JP => "JP",
700 Id::KE => "KE",
701 Id::KG => "KG",
702 Id::KH => "KH",
703 Id::KI => "KI",
704 Id::KM => "KM",
705 Id::KN => "KN",
706 Id::KP => "KP",
707 Id::KR => "KR",
708 Id::KW => "KW",
709 Id::KY => "KY",
710 Id::KZ => "KZ",
711 Id::LA => "LA",
712 Id::LB => "LB",
713 Id::LC => "LC",
714 Id::LI => "LI",
715 Id::LK => "LK",
716 Id::LR => "LR",
717 Id::LS => "LS",
718 Id::LT => "LT",
719 Id::LU => "LU",
720 Id::LV => "LV",
721 Id::LY => "LY",
722 Id::MA => "MA",
723 Id::MC => "MC",
724 Id::MD => "MD",
725 Id::ME => "ME",
726 Id::MF => "MF",
727 Id::MG => "MG",
728 Id::MH => "MH",
729 Id::MK => "MK",
730 Id::ML => "ML",
731 Id::MM => "MM",
732 Id::MN => "MN",
733 Id::MO => "MO",
734 Id::MP => "MP",
735 Id::MQ => "MQ",
736 Id::MR => "MR",
737 Id::MS => "MS",
738 Id::MT => "MT",
739 Id::MU => "MU",
740 Id::MV => "MV",
741 Id::MW => "MW",
742 Id::MX => "MX",
743 Id::MY => "MY",
744 Id::MZ => "MZ",
745 Id::NA => "NA",
746 Id::NC => "NC",
747 Id::NE => "NE",
748 Id::NF => "NF",
749 Id::NG => "NG",
750 Id::NI => "NI",
751 Id::NL => "NL",
752 Id::NO => "NO",
753 Id::NP => "NP",
754 Id::NR => "NR",
755 Id::NU => "NU",
756 Id::NZ => "NZ",
757 Id::OM => "OM",
758 Id::PA => "PA",
759 Id::PE => "PE",
760 Id::PF => "PF",
761 Id::PG => "PG",
762 Id::PH => "PH",
763 Id::PK => "PK",
764 Id::PL => "PL",
765 Id::PM => "PM",
766 Id::PR => "PR",
767 Id::PS => "PS",
768 Id::PT => "PT",
769 Id::PW => "PW",
770 Id::PY => "PY",
771 Id::QA => "QA",
772 Id::RE => "RE",
773 Id::RO => "RO",
774 Id::RS => "RS",
775 Id::RU => "RU",
776 Id::RW => "RW",
777 Id::SA => "SA",
778 Id::SB => "SB",
779 Id::SC => "SC",
780 Id::SD => "SD",
781 Id::SE => "SE",
782 Id::SG => "SG",
783 Id::SH => "SH",
784 Id::SI => "SI",
785 Id::SJ => "SJ",
786 Id::SK => "SK",
787 Id::SL => "SL",
788 Id::SM => "SM",
789 Id::SN => "SN",
790 Id::SO => "SO",
791 Id::SR => "SR",
792 Id::SS => "SS",
793 Id::ST => "ST",
794 Id::SV => "SV",
795 Id::SX => "SX",
796 Id::SY => "SY",
797 Id::SZ => "SZ",
798 Id::TA => "TA",
799 Id::TC => "TC",
800 Id::TD => "TD",
801 Id::TG => "TG",
802 Id::TH => "TH",
803 Id::TJ => "TJ",
804 Id::TK => "TK",
805 Id::TL => "TL",
806 Id::TM => "TM",
807 Id::TN => "TN",
808 Id::TO => "TO",
809 Id::TR => "TR",
810 Id::TT => "TT",
811 Id::TV => "TV",
812 Id::TW => "TW",
813 Id::TZ => "TZ",
814 Id::UA => "UA",
815 Id::UG => "UG",
816 Id::US => "US",
817 Id::UY => "UY",
818 Id::UZ => "UZ",
819 Id::VA => "VA",
820 Id::VC => "VC",
821 Id::VE => "VE",
822 Id::VG => "VG",
823 Id::VI => "VI",
824 Id::VN => "VN",
825 Id::VU => "VU",
826 Id::WF => "WF",
827 Id::WS => "WS",
828 Id::XK => "XK",
829 Id::YE => "YE",
830 Id::YT => "YT",
831 Id::ZA => "ZA",
832 Id::ZM => "ZM",
833 Id::ZW => "ZW",
834 }
835 }
836}