diff --git a/src/GraphQL.Query.Builder/QueryOptions.cs b/src/GraphQL.Query.Builder/QueryOptions.cs index 5749338..2fae2e0 100644 --- a/src/GraphQL.Query.Builder/QueryOptions.cs +++ b/src/GraphQL.Query.Builder/QueryOptions.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace GraphQL.Query.Builder { diff --git a/src/GraphQL.Query.Builder/QueryStringBuilder.cs b/src/GraphQL.Query.Builder/QueryStringBuilder.cs index 8db7953..8a642bf 100644 --- a/src/GraphQL.Query.Builder/QueryStringBuilder.cs +++ b/src/GraphQL.Query.Builder/QueryStringBuilder.cs @@ -36,7 +36,7 @@ public void Clear() /// /// The formatted query param. /// Invalid Object Type in Param List - internal protected string FormatQueryParam(object value) + internal protected virtual string FormatQueryParam(object value) { switch (value) { diff --git a/tests/GraphQL.Query.Builder.UnitTests/CustomQueryStringBuilderTests.cs b/tests/GraphQL.Query.Builder.UnitTests/CustomQueryStringBuilderTests.cs new file mode 100644 index 0000000..4f95589 --- /dev/null +++ b/tests/GraphQL.Query.Builder.UnitTests/CustomQueryStringBuilderTests.cs @@ -0,0 +1,60 @@ +using System; +using System.Text; +using Xunit; + +namespace GraphQL.Query.Builder.UnitTests +{ + public class CustomQueryStringBuilderTests + { + [Fact] + public void TestOverride() + { + string query = new Query("something", + new QueryOptions {QueryStringBuilderFactory = () => new ConstantCaseEnumQueryStringBuilder()}) + .AddArgument("case", Cases.ConstantCase) + .AddField("some") + .Build(); + + Assert.Equal("something(case:CONSTANT_CASE){some}", query); + } + + enum Cases + { + CamelCase, + PascalCase, + ConstantCase + } + + class ConstantCaseEnumQueryStringBuilder : QueryStringBuilder + { + protected internal override string FormatQueryParam(object value) => + value switch + { + Enum e => this.ToConstantCase(e.ToString()), + _ => base.FormatQueryParam(value) + }; + + private string ToConstantCase(string name) + { + var sb = new StringBuilder(); + bool firstUpperLetter = true; + foreach (char c in name) + { + if (char.IsUpper(c)) + { + if (!firstUpperLetter) + { + sb.Append("_"); + } + firstUpperLetter = false; + } + + sb.Append(char.ToUpperInvariant(c)); + } + string result = sb.ToString(); + + return result; + } + } + } +}