0.1
This commit is contained in:
commit
34267f6939
5 changed files with 102 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
/target
|
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
|
@ -0,0 +1,7 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "eyes"
|
||||
version = "0.1.0"
|
6
Cargo.toml
Normal file
6
Cargo.toml
Normal file
|
@ -0,0 +1,6 @@
|
|||
[package]
|
||||
name = "eyes"
|
||||
version = "0.1.0"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
71
src/lib.rs
Normal file
71
src/lib.rs
Normal file
|
@ -0,0 +1,71 @@
|
|||
pub struct Parser<'a> {
|
||||
_input: &'a str,
|
||||
_pattern: &'a str,
|
||||
captures: Vec<&'a str>,
|
||||
}
|
||||
|
||||
impl<'a> Parser<'a> {
|
||||
pub fn new(input: &'a str, pattern: &'a str) -> Self {
|
||||
let splits = pattern
|
||||
.split("{}")
|
||||
.filter(|pat| pat != &"")
|
||||
.collect::<Vec<_>>();
|
||||
let mut captures = vec![input];
|
||||
|
||||
println!("splits: {:?}", splits);
|
||||
|
||||
for pat in splits {
|
||||
captures = captures
|
||||
.iter()
|
||||
.map(|sub| sub.split(pat))
|
||||
.flatten()
|
||||
.collect();
|
||||
}
|
||||
|
||||
Self {
|
||||
_input: input,
|
||||
_pattern: pattern,
|
||||
captures: captures[1..].to_vec(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn captures(&self) -> Vec<&'a str> {
|
||||
self.captures.to_owned()
|
||||
}
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! parse {
|
||||
($input: expr, $pattern: tt, $($type:ty),*) => {
|
||||
{
|
||||
let mut parser = eyes::Parser::new($input, $pattern);
|
||||
let mut captures = parser.captures();
|
||||
captures.reverse();
|
||||
println!("caps: {:?}", captures);
|
||||
|
||||
(
|
||||
$({
|
||||
captures.pop().unwrap().parse::<$type>().unwrap()
|
||||
},)*
|
||||
)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! try_parse {
|
||||
($input: expr, $pattern: tt, $($type:ty),*) => {
|
||||
{
|
||||
let mut parser = eyes::Parser::new($input, $pattern);
|
||||
let mut captures = parser.captures();
|
||||
captures.reverse();
|
||||
println!("caps: {:?}", captures);
|
||||
|
||||
(
|
||||
$({
|
||||
captures.pop().unwrap().parse::<$type>()
|
||||
},)*
|
||||
)
|
||||
}
|
||||
};
|
||||
}
|
17
src/main.rs
Normal file
17
src/main.rs
Normal file
|
@ -0,0 +1,17 @@
|
|||
use eyes::*;
|
||||
|
||||
fn main() {
|
||||
let input = "#1 @ 338,764: 20x24";
|
||||
let pattern = "#{} @ {},{}: {}x{}";
|
||||
|
||||
println!("input: {}", input);
|
||||
println!("pattern: {}", pattern);
|
||||
|
||||
let (id, x, y, w, h) = parse!(input, pattern, usize, isize, isize, usize, usize);
|
||||
|
||||
println!("id: {:?}", id);
|
||||
println!("x: {:?}", x);
|
||||
println!("y: {:?}", y);
|
||||
println!("w: {:?}", w);
|
||||
println!("h: {:?}", h);
|
||||
}
|
Loading…
Reference in a new issue