From 6ff3f1fba4324f62f8919001c24cd7eac35fcb83 Mon Sep 17 00:00:00 2001 From: theduke <chris@theduke.at> Date: Sat, 2 Dec 2017 13:11:38 +0100 Subject: [PATCH] (codegen) Improve enum field name generation Introduce a to_upper_snake_case() helper to properly convert enum names to GraphQL compatible names. Previously, "SomeEnum" would be converted to "SOMEENUM" and not "SOME_ENUM". --- juniper_codegen/src/derive_enum.rs | 2 +- juniper_codegen/src/util.rs | 35 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/juniper_codegen/src/derive_enum.rs b/juniper_codegen/src/derive_enum.rs index 40951d9b..934f1de5 100644 --- a/juniper_codegen/src/derive_enum.rs +++ b/juniper_codegen/src/derive_enum.rs @@ -124,7 +124,7 @@ pub fn impl_enum(ast: &syn::DeriveInput) -> Tokens { // Build value. let name = var_attrs .name - .unwrap_or(variant.ident.as_ref().to_uppercase()); + .unwrap_or(::util::to_upper_snake_case(variant.ident.as_ref())); let descr = match var_attrs.description { Some(s) => quote!{ Some(#s.to_string()) }, None => quote!{ None }, diff --git a/juniper_codegen/src/util.rs b/juniper_codegen/src/util.rs index a3096c7b..9ae094c2 100644 --- a/juniper_codegen/src/util.rs +++ b/juniper_codegen/src/util.rs @@ -80,3 +80,38 @@ fn test_to_camel_case() { assert_eq!(&to_camel_case("a")[..], "a"); assert_eq!(&to_camel_case("")[..], ""); } + +pub(crate) fn to_upper_snake_case(s: &str) -> String { + let mut last_lower = false; + let mut upper = String::new(); + for c in s.chars() { + if c == '_' { + last_lower = false; + } + else if c.is_lowercase() { + last_lower = true; + } else if c.is_uppercase() { + if last_lower { + upper.push('_'); + } + last_lower = false; + } + + for u in c.to_uppercase() { + upper.push(u); + } + } + upper +} + +#[test] +fn test_to_upper_snake_case() { + assert_eq!(to_upper_snake_case("abc"), "ABC"); + assert_eq!(to_upper_snake_case("a_bc"), "A_BC"); + assert_eq!(to_upper_snake_case("ABC"), "ABC"); + assert_eq!(to_upper_snake_case("A_BC"), "A_BC"); + assert_eq!(to_upper_snake_case("SomeInput"), "SOME_INPUT"); + assert_eq!(to_upper_snake_case("someInput"), "SOME_INPUT"); + assert_eq!(to_upper_snake_case("someINpuT"), "SOME_INPU_T"); + assert_eq!(to_upper_snake_case("some_INpuT"), "SOME_INPU_T"); +}