mirror of
https://gitlab.com/msrd0/gotham-restful.git
synced 2025-02-23 04:52:28 +00:00
fix #19 remove ugly regex
This commit is contained in:
parent
c1cb0e692a
commit
0b06528742
3 changed files with 36 additions and 12 deletions
|
@ -35,7 +35,6 @@ mime = "0.3.16"
|
||||||
openapiv3 = { version = "0.3", optional = true }
|
openapiv3 = { version = "0.3", optional = true }
|
||||||
serde = { version = "1.0.106", features = ["derive"] }
|
serde = { version = "1.0.106", features = ["derive"] }
|
||||||
serde_json = "1.0.52"
|
serde_json = "1.0.52"
|
||||||
thiserror = "1.0.16"
|
|
||||||
uuid = { version = "0.8.1", optional = true }
|
uuid = { version = "0.8.1", optional = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
|
|
@ -18,10 +18,8 @@ gitlab = { repository = "msrd0/gotham-restful", branch = "master" }
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
heck = "0.3.1"
|
heck = "0.3.1"
|
||||||
lazy_static = "1.4.0"
|
|
||||||
proc-macro2 = "1.0.12"
|
proc-macro2 = "1.0.12"
|
||||||
quote = "1.0.4"
|
quote = "1.0.4"
|
||||||
regex = "1.3.7"
|
|
||||||
syn = "1.0.18"
|
syn = "1.0.18"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
use crate::util::{CollectToResult, remove_parens};
|
use crate::util::{CollectToResult, remove_parens};
|
||||||
use lazy_static::lazy_static;
|
|
||||||
use proc_macro2::{Ident, TokenStream};
|
use proc_macro2::{Ident, TokenStream};
|
||||||
use quote::{format_ident, quote};
|
use quote::{format_ident, quote};
|
||||||
use regex::Regex;
|
|
||||||
use std::iter;
|
use std::iter;
|
||||||
use syn::{
|
use syn::{
|
||||||
spanned::Spanned,
|
spanned::Spanned,
|
||||||
|
@ -105,11 +103,6 @@ fn path_segment(name : &str) -> PathSegment
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lazy_static! {
|
|
||||||
// TODO this is a really ugly regex that requires at least two characters between captures
|
|
||||||
static ref DISPLAY_REGEX : Regex = Regex::new(r"(^|[^\{])\{(?P<param>[^\}]+)\}([^\}]|$)").unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ErrorVariant
|
impl ErrorVariant
|
||||||
{
|
{
|
||||||
fn fields_pat(&self) -> TokenStream
|
fn fields_pat(&self) -> TokenStream
|
||||||
|
@ -131,8 +124,42 @@ impl ErrorVariant
|
||||||
|
|
||||||
// lets find all required format parameters
|
// lets find all required format parameters
|
||||||
let display_str = display.value();
|
let display_str = display.value();
|
||||||
let params = DISPLAY_REGEX.captures_iter(&display_str)
|
let mut params : Vec<&str> = Vec::new();
|
||||||
.map(|cap| format_ident!("{}{}", if self.is_named { "" } else { "arg" }, cap.name("param").unwrap().as_str()));
|
let len = display_str.len();
|
||||||
|
let mut start = len;
|
||||||
|
let mut iter = display_str.chars().enumerate().peekable();
|
||||||
|
while let Some((i, c)) = iter.next()
|
||||||
|
{
|
||||||
|
// we found a new opening brace
|
||||||
|
if start == len && c == '{'
|
||||||
|
{
|
||||||
|
start = i + 1;
|
||||||
|
}
|
||||||
|
// we found a duplicate opening brace
|
||||||
|
else if start == i && c == '{'
|
||||||
|
{
|
||||||
|
start = len;
|
||||||
|
}
|
||||||
|
// we found a closing brace
|
||||||
|
else if start < i && c == '}'
|
||||||
|
{
|
||||||
|
match iter.peek() {
|
||||||
|
Some((_, '}')) => return Err(Error::new(display.span(), "Error parsing format string: curly braces not allowed inside parameter name")),
|
||||||
|
_ => params.push(&display_str[start..i])
|
||||||
|
};
|
||||||
|
start = len;
|
||||||
|
}
|
||||||
|
// we found a closing brace without content
|
||||||
|
else if start == i && c == '}'
|
||||||
|
{
|
||||||
|
return Err(Error::new(display.span(), "Error parsing format string: parameter name must not be empty"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if start != len
|
||||||
|
{
|
||||||
|
return Err(Error::new(display.span(), "Error parsing format string: Unmatched opening brace"));
|
||||||
|
}
|
||||||
|
let params = params.into_iter().map(|name| format_ident!("{}{}", if self.is_named { "" } else { "arg" }, name));
|
||||||
|
|
||||||
let fields_pat = self.fields_pat();
|
let fields_pat = self.fields_pat();
|
||||||
Ok(quote! {
|
Ok(quote! {
|
||||||
|
|
Loading…
Add table
Reference in a new issue