investments 4.16.1

Helps you with managing your investments
Documentation
use crate::core::{EmptyResult, GenericResult};

use super::encoding::TaxStatementType;
use super::parser::{TaxStatementReader, TaxStatementWriter};
use super::types::Integer;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CountryCode {
    Russia,
    Usa,
    Other(Integer),
}

impl CountryCode {
    pub fn new(country: &str) -> GenericResult<CountryCode> {
        Ok(CountryCode::from_code(get_code(country)?.into()))
    }

    fn from_code(code: Integer) -> CountryCode {
        match code {
            643 => CountryCode::Russia,
            840 => CountryCode::Usa,
            code => CountryCode::Other(code),
        }
    }

    fn to_code(self) -> Integer {
        match self {
            CountryCode::Russia => 643,
            CountryCode::Usa => 840,
            CountryCode::Other(code) => code,
        }
    }
}

impl TaxStatementType for CountryCode {
    fn read(reader: &mut TaxStatementReader) -> GenericResult<CountryCode> {
        Ok(CountryCode::from_code(reader.read_value()?))
    }

    fn write(&self, writer: &mut TaxStatementWriter) -> EmptyResult {
        writer.write_value(&self.to_code())?;
        Ok(())
    }
}

fn get_code(country: &str) -> GenericResult<u16> {
    Ok(match country {
        // https://ru.wikipedia.org/wiki/Общероссийский_классификатор_стран_мира
        // cat countries | sed -r 's/^.*\.svg\s+//' | awk -F '\t' '{ printf "\"%s\" => %3d, // %s\n", $3, $5, $1 }'
        "AB" => 895, // АБХАЗИЯ
        "AU" =>  36, // АВСТРАЛИЯ
        "AT" =>  40, // АВСТРИЯ
        "AZ" =>  31, // АЗЕРБАЙДЖАН
        "AL" =>   8, // АЛБАНИЯ
        "DZ" =>  12, // АЛЖИР
        "AS" =>  16, // АМЕРИКАНСКОЕ САМОА
        "AI" => 660, // АНГИЛЬЯ
        "AO" =>  24, // АНГОЛА
        "AD" =>  20, // АНДОРРА
        "AQ" =>  10, // АНТАРКТИДА
        "AG" =>  28, // АНТИГУА И БАРБУДА
        "AR" =>  32, // АРГЕНТИНА
        "AM" =>  51, // АРМЕНИЯ
        "AW" => 533, // АРУБА
        "AF" =>   4, // АФГАНИСТАН
        "BS" =>  44, // БАГАМЫ
        "BD" =>  50, // БАНГЛАДЕШ
        "BB" =>  52, // БАРБАДОС
        "BH" =>  48, // БАХРЕЙН
        "BY" => 112, // БЕЛАРУСЬ
        "BZ" =>  84, // БЕЛИЗ
        "BE" =>  56, // БЕЛЬГИЯ
        "BJ" => 204, // БЕНИН
        "BM" =>  60, // БЕРМУДЫ
        "BG" => 100, // БОЛГАРИЯ
        "BO" =>  68, // БОЛИВИЯ, МНОГОНАЦИОНАЛЬНОЕ ГОСУДАРСТВО
        "BQ" => 535, // БОНЭЙР, СИНТ-ЭСТАТИУС И САБА
        "BA" =>  70, // БОСНИЯ И ГЕРЦЕГОВИНА
        "BW" =>  72, // БОТСВАНА
        "BR" =>  76, // БРАЗИЛИЯ
        "IO" =>  86, // БРИТАНСКАЯ ТЕРРИТОРИЯ В ИНДИЙСКОМ ОКЕАНЕ
        "BN" =>  96, // БРУНЕЙ-ДАРУССАЛАМ
        "BF" => 854, // БУРКИНА-ФАСО
        "BI" => 108, // БУРУНДИ
        "BT" =>  64, // БУТАН
        "VU" => 548, // ВАНУАТУ
        "HU" => 348, // ВЕНГРИЯ
        "VE" => 862, // ВЕНЕСУЭЛА (БОЛИВАРИАНСКАЯ РЕСПУБЛИКА)
        "VG" =>  92, // ВИРГИНСКИЕ ОСТРОВА, БРИТАНСКИЕ
        "VI" => 850, // ВИРГИНСКИЕ ОСТРОВА, США
        "VN" => 704, // ВЬЕТНАМ
        "GA" => 266, // ГАБОН
        "HT" => 332, // ГАИТИ
        "GY" => 328, // ГАЙАНА
        "GM" => 270, // ГАМБИЯ
        "GH" => 288, // ГАНА
        "GP" => 312, // ГВАДЕЛУПА
        "GT" => 320, // ГВАТЕМАЛА
        "GN" => 324, // ГВИНЕЯ
        "GW" => 624, // ГВИНЕЯ-БИСАУ
        "DE" => 276, // ГЕРМАНИЯ
        "GG" => 831, // ГЕРНСИ
        "GI" => 292, // ГИБРАЛТАР
        "HN" => 340, // ГОНДУРАС
        "HK" => 344, // ГОНКОНГ
        "GD" => 308, // ГРЕНАДА
        "GL" => 304, // ГРЕНЛАНДИЯ
        "GR" => 300, // ГРЕЦИЯ
        "GE" => 268, // ГРУЗИЯ
        "GU" => 316, // ГУАМ
        "DK" => 208, // ДАНИЯ
        "JE" => 832, // ДЖЕРСИ
        "DJ" => 262, // ДЖИБУТИ
        "DM" => 212, // ДОМИНИКА
        "DO" => 214, // ДОМИНИКАНСКАЯ РЕСПУБЛИКА
        "EG" => 818, // ЕГИПЕТ
        "ZM" => 894, // ЗАМБИЯ
        "EH" => 732, // ЗАПАДНАЯ САХАРА
        "ZW" => 716, // ЗИМБАБВЕ
        "IL" => 376, // ИЗРАИЛЬ
        "IN" => 356, // ИНДИЯ
        "ID" => 360, // ИНДОНЕЗИЯ
        "JO" => 400, // ИОРДАНИЯ
        "IQ" => 368, // ИРАК
        "IR" => 364, // ИРАН (ИСЛАМСКАЯ РЕСПУБЛИКА)
        "IE" => 372, // ИРЛАНДИЯ
        "IS" => 352, // ИСЛАНДИЯ
        "ES" => 724, // ИСПАНИЯ
        "IT" => 380, // ИТАЛИЯ
        "YE" => 887, // ЙЕМЕН
        "CV" => 132, // КАБО-ВЕРДЕ
        "KZ" => 398, // КАЗАХСТАН
        "KH" => 116, // КАМБОДЖА
        "CM" => 120, // КАМЕРУН
        "CA" => 124, // КАНАДА
        "QA" => 634, // КАТАР
        "KE" => 404, // КЕНИЯ
        "CY" => 196, // КИПР
        "KG" => 417, // КИРГИЗИЯ
        "KI" => 296, // КИРИБАТИ
        "CN" => 156, // КИТАЙ
        "CC" => 166, // КОКОСОВЫЕ (КИЛИНГ) ОСТРОВА
        "CO" => 170, // КОЛУМБИЯ
        "KM" => 174, // КОМОРЫ
        "CG" => 178, // КОНГО
        "CD" => 180, // КОНГО, ДЕМОКРАТИЧЕСКАЯ РЕСПУБЛИКА
        "KP" => 408, // КОРЕЯ, НАРОДНО-ДЕМОКРАТИЧЕСКАЯ РЕСПУБЛИКА
        "KR" => 410, // КОРЕЯ, РЕСПУБЛИКА
        "CR" => 188, // КОСТА-РИКА
        "CI" => 384, // КОТ Д’ИВУАР
        "CU" => 192, // КУБА
        "KW" => 414, // КУВЕЙТ
        "CW" => 531, // КЮРАСАО
        "LA" => 418, // ЛАОССКАЯ НАРОДНО-ДЕМОКРАТИЧЕСКАЯ РЕСПУБЛИКА
        "LV" => 428, // ЛАТВИЯ
        "LS" => 426, // ЛЕСОТО
        "LR" => 430, // ЛИБЕРИЯ
        "LB" => 422, // ЛИВАН
        "LY" => 434, // ЛИВИЯ
        "LT" => 440, // ЛИТВА
        "LI" => 438, // ЛИХТЕНШТЕЙН
        "LU" => 442, // ЛЮКСЕМБУРГ
        "MU" => 480, // МАВРИКИЙ
        "MR" => 478, // МАВРИТАНИЯ
        "MG" => 450, // МАДАГАСКАР
        "YT" => 175, // МАЙОТТА
        "MO" => 446, // МАКАО
        "MW" => 454, // МАЛАВИ
        "MY" => 458, // МАЛАЙЗИЯ
        "ML" => 466, // МАЛИ
        "UM" => 581, // МАЛЫЕ ТИХООКЕАНСКИЕ ОТДАЛЕННЫЕ ОСТРОВА СОЕДИНЕННЫХ ШТАТОВ
        "MV" => 462, // МАЛЬДИВЫ
        "MT" => 470, // МАЛЬТА
        "MA" => 504, // МАРОККО
        "MQ" => 474, // МАРТИНИКА
        "MH" => 584, // МАРШАЛЛОВЫ ОСТРОВА
        "MX" => 484, // МЕКСИКА
        "FM" => 583, // МИКРОНЕЗИЯ, ФЕДЕРАТИВНЫЕ ШТАТЫ
        "MZ" => 508, // МОЗАМБИК
        "MD" => 498, // МОЛДОВА, РЕСПУБЛИКА
        "MC" => 492, // МОНАКО
        "MN" => 496, // МОНГОЛИЯ
        "MS" => 500, // МОНТСЕРРАТ
        "MM" => 104, // МЬЯНМА
        "NA" => 516, // НАМИБИЯ
        "NR" => 520, // НАУРУ
        "NP" => 524, // НЕПАЛ
        "NE" => 562, // НИГЕР
        "NG" => 566, // НИГЕРИЯ
        "NL" => 528, // НИДЕРЛАНДЫ
        "NI" => 558, // НИКАРАГУА
        "NU" => 570, // НИУЭ
        "NZ" => 554, // НОВАЯ ЗЕЛАНДИЯ
        "NC" => 540, // НОВАЯ КАЛЕДОНИЯ
        "NO" => 578, // НОРВЕГИЯ
        "AE" => 784, // ОБЪЕДИНЕННЫЕ АРАБСКИЕ ЭМИРАТЫ
        "OM" => 512, // ОМАН
        "KY" => 136, // ОСТРОВА КАЙМАН
        "CK" => 184, // ОСТРОВА КУКА
        "TC" => 796, // ОСТРОВА ТЕРКС И КАЙКОС
        "BV" =>  74, // ОСТРОВ БУВЕ
        "IM" => 833, // ОСТРОВ МЭН
        "NF" => 574, // ОСТРОВ НОРФОЛК
        "CX" => 162, // ОСТРОВ РОЖДЕСТВА
        "HM" => 334, // ОСТРОВ ХЕРД И ОСТРОВА МАКДОНАЛЬД
        "PK" => 586, // ПАКИСТАН
        "PW" => 585, // ПАЛАУ
        "PS" => 275, // ПАЛЕСТИНА, ГОСУДАРСТВО
        "PA" => 591, // ПАНАМА
        "VA" => 336, // ПАПСКИЙ ПРЕСТОЛ (ГОСУДАРСТВО — ГОРОД ВАТИКАН)
        "PG" => 598, // ПАПУА НОВАЯ ГВИНЕЯ
        "PY" => 600, // ПАРАГВАЙ
        "PE" => 604, // ПЕРУ
        "PN" => 612, // ПИТКЭРН
        "PL" => 616, // ПОЛЬША
        "PT" => 620, // ПОРТУГАЛИЯ
        "PR" => 630, // ПУЭРТО-РИКО
        "RE" => 638, // РЕЮНЬОН
        "RU" => 643, // РОССИЯ
        "RW" => 646, // РУАНДА
        "RO" => 642, // РУМЫНИЯ
        "WS" => 882, // САМОА
        "SM" => 674, // САН-МАРИНО
        "ST" => 678, // САН-ТОМЕ И ПРИНСИПИ
        "SA" => 682, // САУДОВСКАЯ АРАВИЯ
        "SH" => 654, // СВЯТАЯ ЕЛЕНА, ОСТРОВ ВОЗНЕСЕНИЯ, ТРИСТАН-ДА-КУНЬЯ
        "MK" => 807, // СЕВЕРНАЯ МАКЕДОНИЯ
        "MP" => 580, // СЕВЕРНЫЕ МАРИАНСКИЕ ОСТРОВА
        "SC" => 690, // СЕЙШЕЛЫ
        "BL" => 652, // СЕН-БАРТЕЛЕМИ
        "MF" => 663, // СЕН-МАРТЕН (французская часть)
        "SX" => 534, // СЕН-МАРТЕН (нидерландская часть)
        "SN" => 686, // СЕНЕГАЛ
        "VC" => 670, // СЕНТ-ВИНСЕНТ И ГРЕНАДИНЫ
        "KN" => 659, // СЕНТ-КИТС И НЕВИС
        "LC" => 662, // СЕНТ-ЛЮСИЯ
        "PM" => 666, // СЕН-ПЬЕР И МИКЕЛОН
        "RS" => 688, // СЕРБИЯ
        "SG" => 702, // СИНГАПУР
        "SY" => 760, // СИРИЙСКАЯ АРАБСКАЯ РЕСПУБЛИКА
        "SK" => 703, // СЛОВАКИЯ
        "SI" => 705, // СЛОВЕНИЯ
        "GB" => 826, // СОЕДИНЕННОЕ КОРОЛЕВСТВО
        "US" => 840, // СОЕДИНЕННЫЕ ШТАТЫ
        "SB" =>  90, // СОЛОМОНОВЫ ОСТРОВА
        "SO" => 706, // СОМАЛИ
        "SD" => 729, // СУДАН
        "SR" => 740, // СУРИНАМ
        "SL" => 694, // СЬЕРРА-ЛЕОНЕ
        "TJ" => 762, // ТАДЖИКИСТАН
        "TH" => 764, // ТАИЛАНД
        "TW" => 158, // ТАЙВАНЬ (КИТАЙ)
        "TZ" => 834, // ТАНЗАНИЯ, ОБЪЕДИНЕННАЯ РЕСПУБЛИКА
        "TL" => 626, // ТИМОР-ЛЕСТЕ
        "TG" => 768, // ТОГО
        "TK" => 772, // ТОКЕЛАУ
        "TO" => 776, // ТОНГА
        "TT" => 780, // ТРИНИДАД И ТОБАГО
        "TV" => 798, // ТУВАЛУ
        "TN" => 788, // ТУНИС
        "TM" => 795, // ТУРКМЕНИЯ
        "TR" => 792, // ТУРЦИЯ
        "UG" => 800, // УГАНДА
        "UZ" => 860, // УЗБЕКИСТАН
        "UA" => 804, // УКРАИНА
        "WF" => 876, // УОЛЛИС И ФУТУНА
        "UY" => 858, // УРУГВАЙ
        "FO" => 234, // ФАРЕРСКИЕ ОСТРОВА
        "FJ" => 242, // ФИДЖИ
        "PH" => 608, // ФИЛИППИНЫ
        "FI" => 246, // ФИНЛЯНДИЯ
        "FK" => 238, // ФОЛКЛЕНДСКИЕ ОСТРОВА (МАЛЬВИНСКИЕ)
        "FR" => 250, // ФРАНЦИЯ
        "GF" => 254, // ФРАНЦУЗСКАЯ ГВИАНА
        "PF" => 258, // ФРАНЦУЗСКАЯ ПОЛИНЕЗИЯ
        "TF" => 260, // ФРАНЦУЗСКИЕ ЮЖНЫЕ ТЕРРИТОРИИ
        "HR" => 191, // ХОРВАТИЯ
        "CF" => 140, // ЦЕНТРАЛЬНО-АФРИКАНСКАЯ РЕСПУБЛИКА
        "TD" => 148, // ЧАД
        "ME" => 499, // ЧЕРНОГОРИЯ
        "CZ" => 203, // ЧЕХИЯ
        "CL" => 152, // ЧИЛИ
        "CH" => 756, // ШВЕЙЦАРИЯ
        "SE" => 752, // ШВЕЦИЯ
        "SJ" => 744, // ШПИЦБЕРГЕН И ЯН МАЙЕН
        "LK" => 144, // ШРИ-ЛАНКА
        "EC" => 218, // ЭКВАДОР
        "GQ" => 226, // ЭКВАТОРИАЛЬНАЯ ГВИНЕЯ
        "AX" => 248, // ЭЛАНДСКИЕ ОСТРОВА
        "SV" => 222, // ЭЛЬ-САЛЬВАДОР
        "ER" => 232, // ЭРИТРЕЯ
        "SZ" => 748, // ЭСВАТИНИ
        "EE" => 233, // ЭСТОНИЯ
        "ET" => 231, // ЭФИОПИЯ
        "ZA" => 710, // ЮЖНАЯ АФРИКА
        "GS" => 239, // ЮЖНАЯ ДЖОРДЖИЯ И ЮЖНЫЕ САНДВИЧЕВЫ ОСТРОВА
        "OS" => 896, // ЮЖНАЯ ОСЕТИЯ
        "SS" => 728, // ЮЖНЫЙ СУДАН
        "JM" => 388, // ЯМАЙКА
        "JP" => 392, // ЯПОНИЯ
        _ => return Err!("Unknown country code: {:?}", country),
    })
}