From 6d9eeab67f1c4d5c0cf5f572c6b2fb1039bd0cb8 Mon Sep 17 00:00:00 2001 From: fabolous005 Date: Sun, 19 Nov 2023 20:58:09 +0100 Subject: [PATCH] move parse function into parse.rs + minor bugfix in digit parsing --- src/main.rs | 205 ++------------------------------------------------- src/parse.rs | 188 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 195 insertions(+), 198 deletions(-) create mode 100644 src/parse.rs diff --git a/src/main.rs b/src/main.rs index 40b5b4a..250fd60 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,11 @@ #![allow(clippy::unnecessary_unwrap)] -use std::env; -use periodic_table::Element; +mod parse; + +use parse::parse; +use std::env; + -#[derive(Debug)] -struct ElementNr<'a> { - element : &'a Element, - nr : u32 -} fn main() { let mut args = vec![]; @@ -15,195 +13,6 @@ fn main() { args.push(argument); } - let mut char_before: Option = None; - let mut element: Option<&Element> = None; - let mut element_line: Vec = vec![]; - let mut temp = false; - - let input = args[1].to_string(); - for char in input.chars() { - // println!(); - if char.is_ascii_alphabetic() { - // println!("matched alphabetic"); - if char_before.is_some() { - // println!("char_before is {char_before:?}"); - let mut short = char_before.unwrap().to_uppercase().next().unwrap().to_string(); - short.push(char.to_uppercase().next().unwrap()); - // println!("{}", short); - element = match short.as_str() { - "AC" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::AC) }, - "AG" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::AG) }, - "AL" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::AL) }, - "AM" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::AM) }, - "AR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::AR) }, - "AS" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::AS) }, - "AT" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::AT) }, - "AU" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::AU) }, - "BA" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::BA) }, - "BE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::BE) }, - "BH" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::BH) }, - "BI" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::BI) }, - "BK" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::BK) }, - "BR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::BR) }, - "CA" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CA) }, - "CD" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CD) }, - "CE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CE) }, - "CF" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CF) }, - "CL" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CL) }, - "CM" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CM) }, - "CN" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CN) }, - "CO" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CO) }, - "CR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CR) }, - "CS" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CS) }, - "CU" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CU) }, - "DB" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::DB) }, - "DS" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::DS) }, - "DY" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::DY) }, - "ER" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::ER) }, - "ES" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::ES) }, - "EU" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::EU) }, - "FE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::FE) }, - "FL" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::FL) }, - "FM" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::FM) }, - "FR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::FR) }, - "GA" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::GA) }, - "GD" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::GD) }, - "GE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::GE) }, - "HE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::HE) }, - "HF" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::HF) }, - "HG" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::HG) }, - "HO" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::HO) }, - "HS" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::HS) }, - "IN" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::IN) }, - "IR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::IR) }, - "KR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::KR) }, - "LA" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::LA) }, - "LI" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::LI) }, - "LR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::LR) }, - "LU" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::LU) }, - "LV" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::LV) }, - "MC" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::MC) }, - "MD" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::MD) }, - "MG" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::MG) }, - "MN" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::MN) }, - "MO" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::MO) }, - "MT" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::MT) }, - "NA" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::NA) }, - "NB" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::NB) }, - "ND" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::ND) }, - "NE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::NE) }, - "NH" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::NH) }, - "NI" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::NI) }, - "NO" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::NO) }, - "NP" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::NP) }, - "OG" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::OG) }, - "OS" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::OS) }, - "PA" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::PA) }, - "PB" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::PB) }, - "PD" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::PD) }, - "PM" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::PM) }, - "PO" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::PO) }, - "PR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::PR) }, - "PT" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::PT) }, - "PU" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::PU) }, - "RA" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::RA) }, - "RB" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::RB) }, - "RE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::RE) }, - "RF" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::RF) }, - "RG" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::RG) }, - "RH" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::RH) }, - "RN" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::RN) }, - "RU" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::RU) }, - "SB" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::SB) }, - "SC" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::SC) }, - "SE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::SE) }, - "SG" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::SG) }, - "SI" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::SI) }, - "SM" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::SM) }, - "SN" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::SN) }, - "SR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::SR) }, - "TA" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TA) }, - "TB" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TB) }, - "TC" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TC) }, - "TE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TE) }, - "TH" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TH) }, - "TI" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TI) }, - "TL" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TL) }, - "TM" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TM) }, - "TS" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TS) }, - "XE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::XE) }, - "YB" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::YB) }, - "ZN" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::ZN) }, - "ZR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::ZR) }, - _ => { - // println!("char is: {char}"); - match char.to_uppercase().next().unwrap() { - 'B' => { char_before = Some(char); Some(&periodic_table::elements::B) }, - 'C' => { char_before = Some(char); Some(&periodic_table::elements::C) }, - 'F' => { char_before = Some(char); Some(&periodic_table::elements::F) }, - 'H' => { char_before = Some(char); Some(&periodic_table::elements::H) }, - 'I' => { char_before = Some(char); Some(&periodic_table::elements::I) }, - 'K' => { char_before = Some(char); Some(&periodic_table::elements::K) }, - 'N' => { char_before = Some(char); Some(&periodic_table::elements::N) }, - 'O' => { char_before = Some(char); Some(&periodic_table::elements::O) }, - 'P' => { char_before = Some(char); Some(&periodic_table::elements::P) }, - 'S' => { char_before = Some(char); Some(&periodic_table::elements::S) }, - 'U' => { char_before = Some(char); Some(&periodic_table::elements::U) }, - 'V' => { char_before = Some(char); Some(&periodic_table::elements::V) }, - 'W' => { char_before = Some(char); Some(&periodic_table::elements::W) }, - 'Y' => { char_before = Some(char); Some(&periodic_table::elements::Y) }, - _ => { char_before = Some(char); temp = false; None } - } - } - }; - } else { - // println!("char_before is none"); - element = match char.to_uppercase().next().unwrap() { - 'B' => Some(&periodic_table::elements::B), - 'C' => Some(&periodic_table::elements::C), - 'F' => Some(&periodic_table::elements::F), - 'H' => Some(&periodic_table::elements::H), - 'I' => Some(&periodic_table::elements::I), - 'K' => Some(&periodic_table::elements::K), - 'N' => Some(&periodic_table::elements::N), - 'O' => Some(&periodic_table::elements::O), - 'P' => Some(&periodic_table::elements::P), - 'S' => Some(&periodic_table::elements::S), - 'U' => Some(&periodic_table::elements::U), - 'V' => Some(&periodic_table::elements::V), - 'W' => Some(&periodic_table::elements::W), - 'Y' => Some(&periodic_table::elements::Y), - _ => None - }; - char_before = Some(char); - temp = true - } - } else if char.is_ascii_digit() { - // println!("matched ascii digit"); - // println!("{char_before:?}"); - // if char_before.is_none() { - if let Some(last) = element_line.last_mut() { - // if last.nr > 1 { - if char_before.is_some() { - if char_before.unwrap().is_ascii_digit() { - let mut number = last.nr.to_string(); - number.push(char); - println!("{number}"); - last.nr = number.parse().unwrap(); - } else { - last.nr = char.to_digit(10).unwrap(); - } - } - // } - // last.nr = char.to_digit(10).unwrap(); - } - // } - char_before = Some(char); - } - if element.is_some() && char.is_ascii_alphabetic() { - element_line.push( ElementNr { element: element.unwrap(), nr: 1 }); - } - } - - println!("{:#?}", element_line); + let elements = parse(&args[1]); + println!("{:#?}", elements); } diff --git a/src/parse.rs b/src/parse.rs new file mode 100644 index 0000000..22179ea --- /dev/null +++ b/src/parse.rs @@ -0,0 +1,188 @@ +use periodic_table::Element; + +#[derive(Debug)] +pub struct ElementNr<'a> { + element : &'a Element, + nr : u32 +} + +pub fn parse(arg: &String) -> Vec> { + let mut char_before: Option = None; + let mut element: Option<&Element> = None; + let mut element_line: Vec = vec![]; + let mut temp = false; + + let input = arg.to_string(); + for char in input.chars() { + if char.is_ascii_alphabetic() { + if char_before.is_some() { + let mut short = char_before.unwrap().to_uppercase().next().unwrap().to_string(); + short.push(char.to_uppercase().next().unwrap()); + element = match short.as_str() { + "AC" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::AC) }, + "AG" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::AG) }, + "AL" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::AL) }, + "AM" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::AM) }, + "AR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::AR) }, + "AS" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::AS) }, + "AT" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::AT) }, + "AU" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::AU) }, + "BA" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::BA) }, + "BE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::BE) }, + "BH" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::BH) }, + "BI" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::BI) }, + "BK" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::BK) }, + "BR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::BR) }, + "CA" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CA) }, + "CD" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CD) }, + "CE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CE) }, + "CF" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CF) }, + "CL" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CL) }, + "CM" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CM) }, + "CN" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CN) }, + "CO" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CO) }, + "CR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CR) }, + "CS" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CS) }, + "CU" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::CU) }, + "DB" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::DB) }, + "DS" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::DS) }, + "DY" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::DY) }, + "ER" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::ER) }, + "ES" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::ES) }, + "EU" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::EU) }, + "FE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::FE) }, + "FL" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::FL) }, + "FM" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::FM) }, + "FR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::FR) }, + "GA" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::GA) }, + "GD" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::GD) }, + "GE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::GE) }, + "HE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::HE) }, + "HF" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::HF) }, + "HG" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::HG) }, + "HO" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::HO) }, + "HS" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::HS) }, + "IN" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::IN) }, + "IR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::IR) }, + "KR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::KR) }, + "LA" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::LA) }, + "LI" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::LI) }, + "LR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::LR) }, + "LU" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::LU) }, + "LV" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::LV) }, + "MC" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::MC) }, + "MD" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::MD) }, + "MG" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::MG) }, + "MN" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::MN) }, + "MO" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::MO) }, + "MT" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::MT) }, + "NA" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::NA) }, + "NB" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::NB) }, + "ND" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::ND) }, + "NE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::NE) }, + "NH" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::NH) }, + "NI" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::NI) }, + "NO" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::NO) }, + "NP" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::NP) }, + "OG" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::OG) }, + "OS" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::OS) }, + "PA" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::PA) }, + "PB" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::PB) }, + "PD" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::PD) }, + "PM" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::PM) }, + "PO" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::PO) }, + "PR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::PR) }, + "PT" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::PT) }, + "PU" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::PU) }, + "RA" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::RA) }, + "RB" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::RB) }, + "RE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::RE) }, + "RF" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::RF) }, + "RG" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::RG) }, + "RH" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::RH) }, + "RN" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::RN) }, + "RU" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::RU) }, + "SB" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::SB) }, + "SC" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::SC) }, + "SE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::SE) }, + "SG" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::SG) }, + "SI" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::SI) }, + "SM" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::SM) }, + "SN" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::SN) }, + "SR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::SR) }, + "TA" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TA) }, + "TB" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TB) }, + "TC" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TC) }, + "TE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TE) }, + "TH" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TH) }, + "TI" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TI) }, + "TL" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TL) }, + "TM" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TM) }, + "TS" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::TS) }, + "XE" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::XE) }, + "YB" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::YB) }, + "ZN" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::ZN) }, + "ZR" => { if temp { element_line.pop(); } char_before = None; Some(&periodic_table::elements::ZR) }, + _ => { + match char.to_uppercase().next().unwrap() { + 'B' => { char_before = Some(char); Some(&periodic_table::elements::B) }, + 'C' => { char_before = Some(char); Some(&periodic_table::elements::C) }, + 'F' => { char_before = Some(char); Some(&periodic_table::elements::F) }, + 'H' => { char_before = Some(char); Some(&periodic_table::elements::H) }, + 'I' => { char_before = Some(char); Some(&periodic_table::elements::I) }, + 'K' => { char_before = Some(char); Some(&periodic_table::elements::K) }, + 'N' => { char_before = Some(char); Some(&periodic_table::elements::N) }, + 'O' => { char_before = Some(char); Some(&periodic_table::elements::O) }, + 'P' => { char_before = Some(char); Some(&periodic_table::elements::P) }, + 'S' => { char_before = Some(char); Some(&periodic_table::elements::S) }, + 'U' => { char_before = Some(char); Some(&periodic_table::elements::U) }, + 'V' => { char_before = Some(char); Some(&periodic_table::elements::V) }, + 'W' => { char_before = Some(char); Some(&periodic_table::elements::W) }, + 'Y' => { char_before = Some(char); Some(&periodic_table::elements::Y) }, + _ => { char_before = Some(char); temp = false; None } + } + } + }; + } else { + element = match char.to_uppercase().next().unwrap() { + 'B' => Some(&periodic_table::elements::B), + 'C' => Some(&periodic_table::elements::C), + 'F' => Some(&periodic_table::elements::F), + 'H' => Some(&periodic_table::elements::H), + 'I' => Some(&periodic_table::elements::I), + 'K' => Some(&periodic_table::elements::K), + 'N' => Some(&periodic_table::elements::N), + 'O' => Some(&periodic_table::elements::O), + 'P' => Some(&periodic_table::elements::P), + 'S' => Some(&periodic_table::elements::S), + 'U' => Some(&periodic_table::elements::U), + 'V' => Some(&periodic_table::elements::V), + 'W' => Some(&periodic_table::elements::W), + 'Y' => Some(&periodic_table::elements::Y), + _ => None + }; + char_before = Some(char); + temp = true + } + } else if char.is_ascii_digit() { + if let Some(last) = element_line.last_mut() { + if char_before.is_some() { + if char_before.unwrap().is_ascii_digit() { + let mut number = last.nr.to_string(); + number.push(char); + last.nr = number.parse().unwrap(); + } else { + last.nr = char.to_digit(10).unwrap(); + } + } else { + last.nr = char.to_digit(10).unwrap(); + } + } + char_before = Some(char); + } + if element.is_some() && char.is_ascii_alphabetic() { + element_line.push( ElementNr { element: element.unwrap(), nr: 1 }); + } + } + element_line +}