| Crates.io | banjin |
| lib.rs | banjin |
| version | 0.3.0 |
| created_at | 2018-12-12 16:55:54.808892+00 |
| updated_at | 2018-12-15 14:03:39.228244+00 |
| description | Savage and simple parser |
| homepage | |
| repository | https://github.com/DoumanAsh/banjin |
| max_upload_size | |
| id | 101630 |
| size | 26,934 |
Simple code generator for manual parsing
There are several attributes that control behaviour of parser Each, attached to struct's field
starts_with = <prefix> - Specifies string with which next parse step should start(can be stacked). Errors if prefix is missing.ends_with = <prefix> - Specifies string with which parse step should end(can be stacked). Errors if suffix is missing. If empty, expects EOF.skip = <chars> - Specifies to skip characters, until not meeting character outside of specified in string.skip(ws) - Specifies to skip all white space characters.format(<format>) - Specifies list of characters that should contain value to parse from.format(not(<format>)) - Specifies list of characters that should contain value to parse from.format, it is used as set of characters.numeric - When specified, match using char::is_numeric()digit(<base>) - When specified, match using char::is_digit(<base>)ascii - When specified, match using char::is_ascii()alphabetic - When specified, match using char::is_alphabetic()format = <format> - Specifies string to match against.case - Specifies case sensitive match. By default it is insensitive.default - Specifies variant as taking default value. Should take only single String and
there can be only oneuse std::str::FromStr;
#[derive(banjin::Parser)]
pub struct Data {
#[starts_with = "prefix"]
#[skip(ws)]
#[starts_with = "+"]
#[skip(ws)]
#[format(ascii)]
#[format(digit(10))]
pub first: u32,
#[skip(ws)]
#[format(not("d"))]
#[format("13")]
#[ends_with = "d"]
#[ends_with = ""]
pub second: String,
}
fn main() {
let data = Data::from_str("prefix + 666 13d").expect("Parse");
assert_eq!(data.first, 666);
assert_eq!(data.second, "13");
let data = Data::from_str("prefix + 666 13");
assert!(data.is_err());
let data = Data::from_str("prefix 666 13d");
assert!(data.is_err());
let data = Data::from_str("prefix + 666 13dg");
assert!(data.is_err());
let data = Data::from_str("");
assert!(data.is_err());
}
use std::str::FromStr;
#[derive(banjin::Parser, PartialEq, Eq, Debug)]
enum Gender {
Male,
#[case]
Female,
#[default]
Other(String)
}
fn main() {
let gender = Gender::from_str("male").expect("Parse");
assert_eq!(gender, Gender::Male);
let gender = Gender::from_str("female").expect("Parse");
match gender {
Gender::Other(text) => assert_eq!(text, "female"),
_ => panic!("Unexpected!")
}
let gender = Gender::from_str("none").expect("Parse");
match gender {
Gender::Other(text) => assert_eq!(text, "none"),
_ => panic!("Unexpected!")
}
}