From 123a44125736edbea2875342acbdf84ecbdbacb4 Mon Sep 17 00:00:00 2001 From: Jakub Malek Date: Wed, 18 May 2016 14:23:17 +0200 Subject: [PATCH] NancyFX: - Utility methods for obtaining value from header and path parameter added to requestExtensions.mustache template - Added support of parsing arrays (IEnumerable, ICollection, IList, List, ISet, Set, HashSet) for query, header and path parameters --- .../nancyfx/requestExtensions.mustache | 256 ++++++++++++++++-- 1 file changed, 240 insertions(+), 16 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/nancyfx/requestExtensions.mustache b/modules/swagger-codegen/src/main/resources/nancyfx/requestExtensions.mustache index c4c86127b8fe..d3ef4828b9c4 100644 --- a/modules/swagger-codegen/src/main/resources/nancyfx/requestExtensions.mustache +++ b/modules/swagger-codegen/src/main/resources/nancyfx/requestExtensions.mustache @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Linq; using Nancy; using Sharpility.Base; using Sharpility.Extensions; @@ -15,26 +16,77 @@ namespace {{packageName}} internal static TParam QueryParam(this Request source, string name) { - Preconditions.IsNotNull(source, () => new NullReferenceException("source")); return QueryParam(source, name, default(TParam), useDefault: false); } internal static TParam QueryParam(this Request source, string name, TParam defaultValue) { - Preconditions.IsNotNull(source, () => new NullReferenceException("source")); - return QueryParam(source, name, default(TParam), useDefault: true); + return QueryParam(source, name, defaultValue, useDefault: true); } - private static TParam QueryParam(Request request, string name, TParam defaultValue, bool useDefault) + internal static THeader HeaderValue(this Request source, string name) { - var parameterType = typeof (TParam); - var nullable = default(TParam) == null; - var parser = Parsers.GetIfPresent(parameterType); + return HeaderValue(source, name, default(THeader), useDefault: false); + } + + internal static THeader HeaderValue(this Request source, string name, THeader defaultValue) + { + return HeaderValue(source, name, defaultValue, useDefault: true); + } + + internal static TPathParam PathParam(dynamic parameters, string name) + { + return PathParam(parameters, name, default(TPathParam), useDefault: false); + } + + internal static TPathParam PathParam(dynamic parameters, string name, TPathParam defaultValue) + { + return PathParam(parameters, name, defaultValue, useDefault: true); + } + + private static TParam QueryParam(Request source, string name, TParam defaultValue, bool useDefault) + { + Preconditions.IsNotNull(source, () => new NullReferenceException("source")); + var valueType = typeof(TParam); + var parser = Parsers.GetIfPresent(valueType); if (parser == null) { - return TryParseUsingDynamic(request, name, defaultValue); + return TryParseUsingDynamic(source.Query, name, defaultValue); } - string value = request.Query[name]; + string value = source.Query[name]; + return ValueOf(name, value, defaultValue, useDefault, parser); + } + + private static THeader HeaderValue(Request source, string name, THeader defaultValue, bool useDefault) + { + Preconditions.IsNotNull(source, () => new NullReferenceException("source")); + var valueType = typeof(THeader); + var values = source.Headers[name]; + var parser = Parsers.GetIfPresent(valueType); + var value = values != null ? string.Join(",", values) : null; + Preconditions.IsNotNull(parser, () => new InvalidOperationException( + Strings.Format("Header: '{0}' value: '{1}' could not be parsed. Expected type: '{2}' is not supported", + name, value, valueType))); + return ValueOf(name, value, defaultValue, useDefault, parser); + + } + + private static TPathParam PathParam(dynamic parameters, string name, TPathParam defaultValue, bool useDefault) + { + var valueType = typeof(TPathParam); + var parser = Parsers.GetIfPresent(valueType); + if (parser == null) + { + return TryParseUsingDynamic(parameters, name, defaultValue); + } + string value = parameters[name]; + return ValueOf(name, value, defaultValue, useDefault, parser); + } + + private static TValue ValueOf(string name, string value, TValue defaultValue, bool useDefault, Func parser) + { + var valueType = typeof(TValue); + var nullable = default(TValue) == null; if (string.IsNullOrEmpty(value)) { Preconditions.Evaluate(nullable || (defaultValue != null && useDefault), () => @@ -44,35 +96,36 @@ namespace {{packageName}} var result = parser(Parameter.Of(name, value)); try { - return (TParam) result; + return (TValue)result; } catch (InvalidCastException) { throw new InvalidOperationException(Strings.Format( "Unexpected result type: '{0}' for query: '{1}' expected: '{2}'", - result.GetType(), name, parameterType)); + result.GetType(), name, valueType)); } } - private static TParam TryParseUsingDynamic(Request request, string name, TParam defaultValue) + private static TValue TryParseUsingDynamic(dynamic parameters, string name, TValue defaultValue) { - string value = request.Query[name]; + string value = parameters[name]; try { - TParam result = request.Query[name]; + TValue result = parameters[name]; return result != null ? result : defaultValue; } catch (Exception) { - throw new InvalidOperationException(Strings.Format("Query: '{0}' value: '{1}' could not be parsed. " + + throw new InvalidOperationException(Strings.Format("Parameter: '{0}' value: '{1}' could not be parsed. " + "Expected type: '{2}' is not supported", - name, value, typeof(TParam))); + name, value, typeof(TValue))); } } private static IDictionary> CreateParsers() { var parsers = ImmutableDictionary.CreateBuilder>(); + parsers.Put(typeof(string), value => value); parsers.Put(typeof(bool), SafeParse(bool.Parse)); parsers.Put(typeof(bool?), SafeParse(bool.Parse)); parsers.Put(typeof(byte), SafeParse(byte.Parse)); @@ -99,6 +152,109 @@ namespace {{packageName}} parsers.Put(typeof(DateTime?), SafeParse(DateTime.Parse)); parsers.Put(typeof(TimeSpan), SafeParse(TimeSpan.Parse)); parsers.Put(typeof(TimeSpan?), SafeParse(TimeSpan.Parse)); + + parsers.Put(typeof(IEnumerable), value => value); + parsers.Put(typeof(ICollection), value => value); + parsers.Put(typeof(IList), value => value); + parsers.Put(typeof(List), value => value); + parsers.Put(typeof(ISet), value => value); + parsers.Put(typeof(HashSet), value => value); + + parsers.Put(typeof(IEnumerable), ImmutableListParse(bool.Parse)); + parsers.Put(typeof(ICollection), ImmutableListParse(bool.Parse)); + parsers.Put(typeof(IList), ImmutableListParse(bool.Parse)); + parsers.Put(typeof(List), ListParse(bool.Parse)); + parsers.Put(typeof(ISet), ImmutableSetParse(bool.Parse)); + parsers.Put(typeof(HashSet), SetParse(bool.Parse)); + + parsers.Put(typeof(IEnumerable), ImmutableListParse(byte.Parse)); + parsers.Put(typeof(ICollection), ImmutableListParse(byte.Parse)); + parsers.Put(typeof(IList), ImmutableListParse(byte.Parse)); + parsers.Put(typeof(List), ListParse(byte.Parse)); + parsers.Put(typeof(ISet), ImmutableSetParse(byte.Parse)); + parsers.Put(typeof(HashSet), SetParse(byte.Parse)); + parsers.Put(typeof(IEnumerable), ImmutableListParse(sbyte.Parse)); + parsers.Put(typeof(ICollection), ImmutableListParse(sbyte.Parse)); + parsers.Put(typeof(IList), ImmutableListParse(sbyte.Parse)); + parsers.Put(typeof(List), ListParse(sbyte.Parse)); + parsers.Put(typeof(ISet), ImmutableSetParse(sbyte.Parse)); + parsers.Put(typeof(HashSet), SetParse(sbyte.Parse)); + + parsers.Put(typeof(IEnumerable), ImmutableListParse(short.Parse)); + parsers.Put(typeof(ICollection), ImmutableListParse(short.Parse)); + parsers.Put(typeof(IList), ImmutableListParse(short.Parse)); + parsers.Put(typeof(List), ListParse(short.Parse)); + parsers.Put(typeof(ISet), ImmutableSetParse(short.Parse)); + parsers.Put(typeof(HashSet), SetParse(short.Parse)); + parsers.Put(typeof(IEnumerable), ImmutableListParse(ushort.Parse)); + parsers.Put(typeof(ICollection), ImmutableListParse(ushort.Parse)); + parsers.Put(typeof(IList), ImmutableListParse(ushort.Parse)); + parsers.Put(typeof(List), ListParse(ushort.Parse)); + parsers.Put(typeof(ISet), ImmutableSetParse(ushort.Parse)); + parsers.Put(typeof(HashSet), SetParse(ushort.Parse)); + + parsers.Put(typeof(IEnumerable), ImmutableListParse(int.Parse)); + parsers.Put(typeof(ICollection), ImmutableListParse(int.Parse)); + parsers.Put(typeof(IList), ImmutableListParse(int.Parse)); + parsers.Put(typeof(List), ListParse(int.Parse)); + parsers.Put(typeof(ISet), ImmutableSetParse(int.Parse)); + parsers.Put(typeof(HashSet), SetParse(int.Parse)); + parsers.Put(typeof(IEnumerable), ImmutableListParse(uint.Parse)); + parsers.Put(typeof(ICollection), ImmutableListParse(uint.Parse)); + parsers.Put(typeof(IList), ImmutableListParse(uint.Parse)); + parsers.Put(typeof(List), ListParse(uint.Parse)); + parsers.Put(typeof(ISet), ImmutableSetParse(uint.Parse)); + parsers.Put(typeof(HashSet), SetParse(uint.Parse)); + + parsers.Put(typeof(IEnumerable), ImmutableListParse(long.Parse)); + parsers.Put(typeof(ICollection), ImmutableListParse(long.Parse)); + parsers.Put(typeof(IList), ImmutableListParse(long.Parse)); + parsers.Put(typeof(List), ListParse(long.Parse)); + parsers.Put(typeof(ISet), ImmutableSetParse(long.Parse)); + parsers.Put(typeof(HashSet), SetParse(long.Parse)); + parsers.Put(typeof(IEnumerable), ImmutableListParse(ulong.Parse)); + parsers.Put(typeof(ICollection), ImmutableListParse(ulong.Parse)); + parsers.Put(typeof(IList), ImmutableListParse(ulong.Parse)); + parsers.Put(typeof(List), ListParse(ulong.Parse)); + parsers.Put(typeof(ISet), ImmutableSetParse(ulong.Parse)); + parsers.Put(typeof(HashSet), SetParse(ulong.Parse)); + + parsers.Put(typeof(IEnumerable), ImmutableListParse(float.Parse)); + parsers.Put(typeof(ICollection), ImmutableListParse(float.Parse)); + parsers.Put(typeof(IList), ImmutableListParse(float.Parse)); + parsers.Put(typeof(List), ListParse(float.Parse)); + parsers.Put(typeof(ISet), ImmutableSetParse(float.Parse)); + parsers.Put(typeof(HashSet), SetParse(float.Parse)); + + parsers.Put(typeof(IEnumerable), ImmutableListParse(double.Parse)); + parsers.Put(typeof(ICollection), ImmutableListParse(double.Parse)); + parsers.Put(typeof(IList), ImmutableListParse(double.Parse)); + parsers.Put(typeof(List), ListParse(double.Parse)); + parsers.Put(typeof(ISet), ImmutableSetParse(double.Parse)); + parsers.Put(typeof(HashSet), SetParse(double.Parse)); + + parsers.Put(typeof(IEnumerable), ImmutableListParse(decimal.Parse)); + parsers.Put(typeof(ICollection), ImmutableListParse(decimal.Parse)); + parsers.Put(typeof(IList), ImmutableListParse(decimal.Parse)); + parsers.Put(typeof(List), ListParse(decimal.Parse)); + parsers.Put(typeof(ISet), ImmutableSetParse(decimal.Parse)); + parsers.Put(typeof(HashSet), SetParse(decimal.Parse)); + + + parsers.Put(typeof(IEnumerable), ImmutableListParse(DateTime.Parse)); + parsers.Put(typeof(ICollection), ImmutableListParse(DateTime.Parse)); + parsers.Put(typeof(IList), ImmutableListParse(DateTime.Parse)); + parsers.Put(typeof(List), ListParse(DateTime.Parse)); + parsers.Put(typeof(ISet), ImmutableSetParse(DateTime.Parse)); + parsers.Put(typeof(HashSet), SetParse(DateTime.Parse)); + + parsers.Put(typeof(IEnumerable), ImmutableListParse(TimeSpan.Parse)); + parsers.Put(typeof(ICollection), ImmutableListParse(TimeSpan.Parse)); + parsers.Put(typeof(IList), ImmutableListParse(TimeSpan.Parse)); + parsers.Put(typeof(List), ListParse(TimeSpan.Parse)); + parsers.Put(typeof(ISet), ImmutableSetParse(TimeSpan.Parse)); + parsers.Put(typeof(HashSet), SetParse(TimeSpan.Parse)); + return parsers.ToImmutableDictionary(); } @@ -121,6 +277,74 @@ namespace {{packageName}} }; } + private static Func ListParse(Func itemParser) + { + return parameter => + { + if (string.IsNullOrEmpty(parameter.Value)) + { + return new List(); + } + var results = parameter.Value.Split(new[] {','}, StringSplitOptions.None) + .Where(it => it != null) + .Select(it => it.Trim()) + .Select(itemParser) + .ToList(); + return results; + }; + } + + private static Func ImmutableListParse(Func itemParser) + { + return parameter => + { + if (string.IsNullOrEmpty(parameter.Value)) + { + return Lists.EmptyList(); + } + var results = parameter.Value.Split(new[] {','}, StringSplitOptions.None) + .Where(it => it != null) + .Select(it => it.Trim()) + .Select(itemParser) + .ToImmutableList(); + return results; + }; + } + + private static Func SetParse(Func itemParser) + { + return parameter => + { + if (string.IsNullOrEmpty(parameter.Value)) + { + return new HashSet(); + } + var results = parameter.Value.Split(new[] {','}, StringSplitOptions.None) + .Where(it => it != null) + .Select(it => it.Trim()) + .Select(itemParser) + .ToSet(); + return results; + }; + } + + private static Func ImmutableSetParse(Func itemParser) + { + return parameter => + { + if (string.IsNullOrEmpty(parameter.Value)) + { + return Sets.EmptySet(); + } + var results = parameter.Value.Split(new[] {','}, StringSplitOptions.None) + .Where(it => it != null) + .Select(it => it.Trim()) + .Select(itemParser) + .ToImmutableHashSet(); + return results; + }; + } + private static ArgumentException ParameterOutOfRange(Parameter parameter, Type type) { return new ArgumentException(Strings.Format("Query: '{0}' value: '{1}' is out of range for: '{2}'",