use mipl::prelude::*;
pub fn alphanum_vec() -> Vec<char> {
let mut vec: Vec<char> = vec![];
for i in 65..91 {
vec.push(char::from_u32(i).unwrap());
}
for i in 97..123 {
vec.push(char::from_u32(i).unwrap());
}
for i in 48..58 {
vec.push(char::from_u32(i).unwrap());
}
vec
}
pub fn tokenize(src: String) -> Parser {
let alphanum_vec: Vec<char> = alphanum_vec();
let del_param = DelimitersParam{
discard: DiscardDelimiters::new(
vec![
' ',
'\n',
'\t'
]
),
keep: KeepDelimiters::new(
alphanum_vec
)
};
Parser::from(src, del_param)
}
fn parse(parser: &mut Parser) -> bool {
let alph_vec: Vec<String> = alphanum_vec()
.into_iter()
.map(|ch| char::to_string(&ch))
.collect();
let _collector = CollectWhile::<OrExactMatch>::subparse(alph_vec, parser);
if let Some(tok) = parser.next() {
match tok {
Token::End(EndToken) => true,
_ => false
}
} else {
true
}
}
fn main() {
use std::io::Write;
loop {
print!("check if alphanumeric: ");
std::io::stdout().flush().unwrap();
let input = {
let mut buf = String::new();
std::io::stdin().read_line(&mut buf).unwrap();
buf
};
if input.trim() == "exit" {
break;
}
let mut parser = tokenize(input);
println!("{}", parse(&mut parser))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_true_alphanum1() {
let input = String::from("helix123");
let mut parser = tokenize(input);
assert_eq!(
parse(&mut parser),
true
)
}
#[test]
fn test_false_alphanum1() {
let input = String::from("13wonder*");
let mut parser = tokenize(input);
assert_eq!(
parse(&mut parser),
false
)
}
}