use std::convert::TryFrom;


#[derive(Debug)]
pub enum MonsterParseError {
    UnknownMonster(String),
}


#[derive(Debug, Copy, Clone)]
pub enum MonsterType {
    Hildebear,
    SandRappy,
    RagRappy,
    Monest,
    SavageWolf,
    BarbarousWolf,
    Booma,
    Gobooma,
    Gigobooma,
    GrassAssassin,
    DelLily,
    PoisonLily,
    NanoDragon,
    EvilShark,
    PalShark,
    GuilShark,
    PofuillySlime,
    PanArms,
    Hidoom,
    Migium,
    Dubchic,
    Gillchic,
    Garanz,
    SinowBeat,
    SinowGold,
    Canadine,
    RingCanadine,
    Canane,
    DubchicSwitch,
    Delsaber,
    ChaosSorcerer,
    BeeR,
    BeeL,
    DarkGunner,
    ChaosBringer,
    DarkBelra,
    Dimenian,
    LaDimenian,
    SoDimenian,
    Bulclaw,
    Claw,
    Dragon,
    GalGryphon,
    DeRolLe,
    DeRolLeBody,
    DeRolLeMine,
    VolOptPartA,
    VolOptPillar,
    VolOptMonitor,
    VolOptAmp,
    VolOptCore,
    VolOptUnused,
    VolOpt,
    DarkFalz,
    DarkFalz1,
    DarkFalz2,
    DarkFalz3,
    Darvant,
    UltDarvant,
    Olga,
    BarbaRay,
    GolDragon,
    SinowBeril,
    SinowSpigell,
    Merillias,
    Meriltas,
    Mericarol,
    Merikle,
    Mericus,
    UlGibbon,
    ZolGibbon,
    Gibbles,
    Gee,
    GiGue,
    Deldepth,
    Delbiter,
    Dolmdarl,
    Dolmolm,
    Morfos,
    ReconBox,
    Epsilon,
    SinowZoa,
    SinowZele,
    IllGill,
    Astark,
    SatelliteLizard,
    Yowie,
    MerissaA,
    Girtablulu,
    Zu,
    Boota,
    ZeBoota,
    BaBoota,
    Dorphon,
    Goran,
    PyroGoran,
    GoranDetonator,
    SaintMillion,
    Shambertin,

    Mothmant,
}


impl TryFrom<&str> for MonsterType {
    type Error = MonsterParseError;

    fn try_from(monster: &str) -> Result<MonsterType, MonsterParseError> {
        match monster {
            "Booma" | "Bartle" => Ok(MonsterType::Booma),
            "Gobooma" | "Barble" => Ok(MonsterType::Gobooma),
            "Gigobooma" | "Tollaw" => Ok(MonsterType::Gigobooma),
            // etc...
            _ => Err(MonsterParseError::UnknownMonster(monster.to_owned()))
        }
    }



    
}