Improve best-case performance for to_camel_case

This commit is contained in:
Sam Rijs 2017-07-04 13:36:42 +02:00 committed by Magnus Hallin
parent 902c55dade
commit d15f9bd162
2 changed files with 9 additions and 7 deletions

View file

@ -203,6 +203,8 @@ extern crate serde;
#[cfg(any(feature="iron-handlers", feature="rocket-handlers"))] extern crate serde_json; #[cfg(any(feature="iron-handlers", feature="rocket-handlers"))] extern crate serde_json;
use std::borrow::Cow;
#[macro_use] mod macros; #[macro_use] mod macros;
mod ast; mod ast;
pub mod parser; pub mod parser;
@ -296,22 +298,22 @@ impl<'a> From<Spanning<ParseError<'a>>> for GraphQLError<'a> {
} }
#[doc(hidden)] #[doc(hidden)]
pub fn to_camel_case(s: &str) -> String { pub fn to_camel_case<'a>(s: &'a str) -> Cow<'a, str> {
let mut dest = String::new(); let mut dest = Cow::Borrowed(s);
for (i, part) in s.split('_').enumerate() { for (i, part) in s.split('_').enumerate() {
if i > 0 && part.len() == 1 { if i > 0 && part.len() == 1 {
dest.push_str(&part.to_uppercase()); dest += Cow::Owned(part.to_uppercase());
} }
else if i > 0 && part.len() > 1 { else if i > 0 && part.len() > 1 {
let first = part.chars().next().unwrap().to_uppercase().collect::<String>(); let first = part.chars().next().unwrap().to_uppercase().collect::<String>();
let second = &part[1..]; let second = &part[1..];
dest.push_str(&first); dest += Cow::Owned(first);
dest.push_str(second); dest += second;
} }
else if i == 0 { else if i == 0 {
dest.push_str(part); dest = Cow::Borrowed(part);
} }
} }

View file

@ -64,7 +64,7 @@ macro_rules! graphql_input_object {
) => { ) => {
Some($name { Some($name {
$( $field_name: { $( $field_name: {
let n: String = $crate::to_camel_case(stringify!($field_name)); let n = $crate::to_camel_case(stringify!($field_name));
let v: Option<&&$crate::InputValue> = $var.get(&n[..]); let v: Option<&&$crate::InputValue> = $var.get(&n[..]);
match v { match v {