diff --git a/modules/swagger-codegen/src/main/resources/nancyfx/api.mustache b/modules/swagger-codegen/src/main/resources/nancyfx/api.mustache index 1e66c83c769..b4213ff2056 100644 --- a/modules/swagger-codegen/src/main/resources/nancyfx/api.mustache +++ b/modules/swagger-codegen/src/main/resources/nancyfx/api.mustache @@ -30,7 +30,7 @@ namespace {{packageName}}.{{packageContext}}.Modules {{/hasMore}}{{/isBodyParam}}{{/allParams}}{{#allParams}}{{#required}} Preconditions.IsNotNull({{paramName}}, "Required parameter: '{{paramName}}' is missing at '{{operationId}}'"); {{/required}}{{/allParams}} - {{#returnType}}return {{/returnType}}service.{{operationId}}(Context{{#allParams.0}}, {{/allParams.0}}{{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});{{^returnType}} + {{#returnType}}return {{/returnType}}service.{{operationId}}(Context{{#allParams.0}}, {{/allParams.0}}{{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}){{#returnType}}{{#isListContainer}}.ToArray(){{/isListContainer}}{{/returnType}};{{^returnType}} return new Response { ContentType = "{{produces.0.mediaType}}"};{{/returnType}} }; {{/operation}} diff --git a/modules/swagger-codegen/src/main/resources/nancyfx/parameters.mustache b/modules/swagger-codegen/src/main/resources/nancyfx/parameters.mustache index e55a82416ec..75486f59f46 100644 --- a/modules/swagger-codegen/src/main/resources/nancyfx/parameters.mustache +++ b/modules/swagger-codegen/src/main/resources/nancyfx/parameters.mustache @@ -166,19 +166,19 @@ namespace {{packageName}}.{{packageContext}}.Utils parsers.Put(typeof(LocalTime), SafeParse(ParseLocalTime)); parsers.Put(typeof(LocalTime?), SafeParse(ParseLocalTime)); - 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(value => value)); + parsers.Put(typeof(ICollection), ImmutableListParse(value => value)); + parsers.Put(typeof(IList), ImmutableListParse(value => value)); + parsers.Put(typeof(List), ListParse(value => value)); + parsers.Put(typeof(ISet), ImmutableListParse(value => value)); + parsers.Put(typeof(HashSet), SetParse(value => value)); + + parsers.Put(typeof(IEnumerable), NullableImmutableListParse(bool.Parse)); + parsers.Put(typeof(ICollection), NullableImmutableListParse(bool.Parse)); + parsers.Put(typeof(IList), NullableImmutableListParse(bool.Parse)); + parsers.Put(typeof(List), NullableListParse(bool.Parse)); + parsers.Put(typeof(ISet), NullableImmutableSetParse(bool.Parse)); + parsers.Put(typeof(HashSet), NullableSetParse(bool.Parse)); parsers.Put(typeof(IEnumerable), ImmutableListParse(byte.Parse)); parsers.Put(typeof(ICollection), ImmutableListParse(byte.Parse)); @@ -186,6 +186,7 @@ namespace {{packageName}}.{{packageContext}}.Utils 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)); @@ -199,6 +200,7 @@ namespace {{packageName}}.{{packageContext}}.Utils 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)); @@ -206,12 +208,13 @@ namespace {{packageName}}.{{packageContext}}.Utils 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), NullableImmutableListParse(int.Parse)); + parsers.Put(typeof(ICollection), NullableImmutableListParse(int.Parse)); + parsers.Put(typeof(IList), NullableImmutableListParse(int.Parse)); + parsers.Put(typeof(List), NullableListParse(int.Parse)); + parsers.Put(typeof(ISet), NullableImmutableSetParse(int.Parse)); + parsers.Put(typeof(HashSet), NullableSetParse(int.Parse)); + parsers.Put(typeof(IEnumerable), ImmutableListParse(uint.Parse)); parsers.Put(typeof(ICollection), ImmutableListParse(uint.Parse)); parsers.Put(typeof(IList), ImmutableListParse(uint.Parse)); @@ -219,12 +222,13 @@ namespace {{packageName}}.{{packageContext}}.Utils 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), NullableImmutableListParse(long.Parse)); + parsers.Put(typeof(ICollection), NullableImmutableListParse(long.Parse)); + parsers.Put(typeof(IList), NullableImmutableListParse(long.Parse)); + parsers.Put(typeof(List), NullableListParse(long.Parse)); + parsers.Put(typeof(ISet), NullableImmutableSetParse(long.Parse)); + parsers.Put(typeof(HashSet), NullableSetParse(long.Parse)); + parsers.Put(typeof(IEnumerable), ImmutableListParse(ulong.Parse)); parsers.Put(typeof(ICollection), ImmutableListParse(ulong.Parse)); parsers.Put(typeof(IList), ImmutableListParse(ulong.Parse)); @@ -232,34 +236,33 @@ namespace {{packageName}}.{{packageContext}}.Utils 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), NullableImmutableListParse(float.Parse)); + parsers.Put(typeof(ICollection), NullableImmutableListParse(float.Parse)); + parsers.Put(typeof(IList), NullableImmutableListParse(float.Parse)); + parsers.Put(typeof(List), NullableListParse(float.Parse)); + parsers.Put(typeof(ISet), NullableImmutableSetParse(float.Parse)); + parsers.Put(typeof(HashSet), NullableSetParse(float.Parse)); + + parsers.Put(typeof(IEnumerable), NullableImmutableListParse(double.Parse)); + parsers.Put(typeof(ICollection), NullableImmutableListParse(double.Parse)); + parsers.Put(typeof(IList), NullableImmutableListParse(double.Parse)); + parsers.Put(typeof(List), NullableListParse(double.Parse)); + parsers.Put(typeof(ISet), NullableImmutableSetParse(double.Parse)); + parsers.Put(typeof(HashSet), NullableSetParse(double.Parse)); + + parsers.Put(typeof(IEnumerable), NullableImmutableListParse(decimal.Parse)); + parsers.Put(typeof(ICollection), NullableImmutableListParse(decimal.Parse)); + parsers.Put(typeof(IList), NullableImmutableListParse(decimal.Parse)); + parsers.Put(typeof(List), NullableListParse(decimal.Parse)); + parsers.Put(typeof(ISet), NullableImmutableSetParse(decimal.Parse)); + parsers.Put(typeof(HashSet), NullableSetParse(decimal.Parse)); + + parsers.Put(typeof(IEnumerable), NullableImmutableListParse(DateTime.Parse)); + parsers.Put(typeof(ICollection), NullableImmutableListParse(DateTime.Parse)); + parsers.Put(typeof(IList), NullableImmutableListParse(DateTime.Parse)); + parsers.Put(typeof(List), NullableListParse(DateTime.Parse)); + parsers.Put(typeof(ISet), NullableImmutableSetParse(DateTime.Parse)); + parsers.Put(typeof(HashSet), NullableSetParse(DateTime.Parse)); parsers.Put(typeof(IEnumerable), ImmutableListParse(TimeSpan.Parse)); parsers.Put(typeof(ICollection), ImmutableListParse(TimeSpan.Parse)); @@ -295,6 +298,11 @@ namespace {{packageName}}.{{packageContext}}.Utils }; } + private static Func NullableListParse(Func itemParser) where T: struct + { + return ListParse(it => it.ToNullable(itemParser)); + } + private static Func ListParse(Func itemParser) { return parameter => @@ -303,15 +311,15 @@ namespace {{packageName}}.{{packageContext}}.Utils { return new List(); } - var results = parameter.Value.Split(new[] { ',' }, StringSplitOptions.None) - .Where(it => it != null) - .Select(it => it.Trim()) - .Select(itemParser) - .ToList(); - return results; + return ParseCollection(parameter.Value, itemParser).ToList(); }; } + private static Func NullableImmutableListParse(Func itemParser) where T: struct + { + return ImmutableListParse(it => it.ToNullable(itemParser)); + } + private static Func ImmutableListParse(Func itemParser) { return parameter => @@ -320,15 +328,15 @@ namespace {{packageName}}.{{packageContext}}.Utils { return Lists.EmptyList(); } - var results = parameter.Value.Split(new[] { ',' }, StringSplitOptions.None) - .Where(it => it != null) - .Select(it => it.Trim()) - .Select(itemParser) - .ToImmutableList(); - return results; + return ParseCollection(parameter.Value, itemParser).ToImmutableList(); }; } + private static Func NullableSetParse(Func itemParser) where T: struct + { + return SetParse(it => it.ToNullable(itemParser)); + } + private static Func SetParse(Func itemParser) { return parameter => @@ -337,15 +345,15 @@ namespace {{packageName}}.{{packageContext}}.Utils { return new HashSet(); } - var results = parameter.Value.Split(new[] { ',' }, StringSplitOptions.None) - .Where(it => it != null) - .Select(it => it.Trim()) - .Select(itemParser) - .ToSet(); - return results; + return ParseCollection(parameter.Value, itemParser).ToSet(); }; } + private static Func NullableImmutableSetParse(Func itemParser) where T: struct + { + return ImmutableSetParse(it => it.ToNullable(itemParser)); + } + private static Func ImmutableSetParse(Func itemParser) { return parameter => @@ -354,12 +362,7 @@ namespace {{packageName}}.{{packageContext}}.Utils { return Sets.EmptySet(); } - var results = parameter.Value.Split(new[] { ',' }, StringSplitOptions.None) - .Where(it => it != null) - .Select(it => it.Trim()) - .Select(itemParser) - .ToImmutableHashSet(); - return results; + return ParseCollection(parameter.Value, itemParser).ToImmutableHashSet(); }; } @@ -386,6 +389,32 @@ namespace {{packageName}}.{{packageContext}}.Utils parameter.Name, parameter.Value, type)); } + private static IEnumerable ParseCollection(string value, Func itemParser) + { + var results = value.Split(new[] { ',' }, StringSplitOptions.None) + .Where(it => it != null) + .Select(it => it.Trim()) + .Select(itemParser); + return results; + } + + public static T? ToNullable(this string s, Func itemParser) where T : struct + { + T? result = new T?(); + try + { + if (!string.IsNullOrEmpty(s) && s.Trim().Length > 0) + { + result = itemParser(s); + } + } + catch (Exception e) + { + throw new InvalidOperationException(Strings.Format("Unable to parse value: '{0}' to nullable: '{1}'", s, typeof(T).ToString()), e); + } + return result; + } + private class Parameter { internal string Name { get; private set; } diff --git a/samples/server/petstore/nancyfx/IO.Swagger.sln b/samples/server/petstore/nancyfx/IO.Swagger.sln index e6fd22af6f6..09301395de7 100644 --- a/samples/server/petstore/nancyfx/IO.Swagger.sln +++ b/samples/server/petstore/nancyfx/IO.Swagger.sln @@ -2,7 +2,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 VisualStudioVersion = 12.0.0.0 MinimumVisualStudioVersion = 10.0.0.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IO.Swagger", "src\IO.Swagger\IO.Swagger.csproj", "{7D50D142-14E1-4E99-842B-18D3AF159948}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IO.Swagger", "src\IO.Swagger\IO.Swagger.csproj", "{3B55ED13-A471-44B1-A8D5-C158723C0A0C}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -10,17 +10,10 @@ Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution -<<<<<<< HEAD -{7D50D142-14E1-4E99-842B-18D3AF159948}.Debug|Any CPU.ActiveCfg = Debug|Any CPU -{7D50D142-14E1-4E99-842B-18D3AF159948}.Debug|Any CPU.Build.0 = Debug|Any CPU -{7D50D142-14E1-4E99-842B-18D3AF159948}.Release|Any CPU.ActiveCfg = Release|Any CPU -{7D50D142-14E1-4E99-842B-18D3AF159948}.Release|Any CPU.Build.0 = Release|Any CPU -======= -{1CE943E7-586D-4D9C-BE8B-3E005FDC39D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU -{1CE943E7-586D-4D9C-BE8B-3E005FDC39D1}.Debug|Any CPU.Build.0 = Debug|Any CPU -{1CE943E7-586D-4D9C-BE8B-3E005FDC39D1}.Release|Any CPU.ActiveCfg = Release|Any CPU -{1CE943E7-586D-4D9C-BE8B-3E005FDC39D1}.Release|Any CPU.Build.0 = Release|Any CPU ->>>>>>> 92c474b2c235f4635e4be43a97c7941fec64dc82 +{3B55ED13-A471-44B1-A8D5-C158723C0A0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU +{3B55ED13-A471-44B1-A8D5-C158723C0A0C}.Debug|Any CPU.Build.0 = Debug|Any CPU +{3B55ED13-A471-44B1-A8D5-C158723C0A0C}.Release|Any CPU.ActiveCfg = Release|Any CPU +{3B55ED13-A471-44B1-A8D5-C158723C0A0C}.Release|Any CPU.Build.0 = Release|Any CPU {19F1DEBC-DE5E-4517-8062-F000CD499087}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {19F1DEBC-DE5E-4517-8062-F000CD499087}.Debug|Any CPU.Build.0 = Debug|Any CPU {19F1DEBC-DE5E-4517-8062-F000CD499087}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -29,4 +22,4 @@ EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection -EndGlobal +EndGlobal \ No newline at end of file diff --git a/samples/server/petstore/nancyfx/src/IO.Swagger/IO.Swagger.csproj b/samples/server/petstore/nancyfx/src/IO.Swagger/IO.Swagger.csproj index 60535f7aae6..a103786b912 100644 --- a/samples/server/petstore/nancyfx/src/IO.Swagger/IO.Swagger.csproj +++ b/samples/server/petstore/nancyfx/src/IO.Swagger/IO.Swagger.csproj @@ -3,7 +3,7 @@ Debug AnyCPU - {7D50D142-14E1-4E99-842B-18D3AF159948} + {3B55ED13-A471-44B1-A8D5-C158723C0A0C} Library Properties IO.Swagger.v2 @@ -63,3 +63,4 @@ + diff --git a/samples/server/petstore/nancyfx/src/IO.Swagger/Modules/PetModule.cs b/samples/server/petstore/nancyfx/src/IO.Swagger/Modules/PetModule.cs index d6922531e24..edfa0ecac4a 100644 --- a/samples/server/petstore/nancyfx/src/IO.Swagger/Modules/PetModule.cs +++ b/samples/server/petstore/nancyfx/src/IO.Swagger/Modules/PetModule.cs @@ -55,7 +55,7 @@ public PetModule(PetService service) : base("/v2") var status = Parameters.ValueOf(parameters, Context.Request, "status", ParameterType.Query); Preconditions.IsNotNull(status, "Required parameter: 'status' is missing at 'FindPetsByStatus'"); - return service.FindPetsByStatus(Context, status); + return service.FindPetsByStatus(Context, status).ToArray(); }; Get["/pet/findByTags"] = parameters => @@ -63,7 +63,7 @@ public PetModule(PetService service) : base("/v2") var tags = Parameters.ValueOf>(parameters, Context.Request, "tags", ParameterType.Query); Preconditions.IsNotNull(tags, "Required parameter: 'tags' is missing at 'FindPetsByTags'"); - return service.FindPetsByTags(Context, tags); + return service.FindPetsByTags(Context, tags).ToArray(); }; Get["/pet/{petId}"] = parameters => diff --git a/samples/server/petstore/nancyfx/src/IO.Swagger/Utils/Parameters.cs b/samples/server/petstore/nancyfx/src/IO.Swagger/Utils/Parameters.cs index 7f0e848f98a..6175758fd9a 100644 --- a/samples/server/petstore/nancyfx/src/IO.Swagger/Utils/Parameters.cs +++ b/samples/server/petstore/nancyfx/src/IO.Swagger/Utils/Parameters.cs @@ -166,19 +166,19 @@ private static IDictionary> CreateParsers() parsers.Put(typeof(LocalTime), SafeParse(ParseLocalTime)); parsers.Put(typeof(LocalTime?), SafeParse(ParseLocalTime)); - 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(value => value)); + parsers.Put(typeof(ICollection), ImmutableListParse(value => value)); + parsers.Put(typeof(IList), ImmutableListParse(value => value)); + parsers.Put(typeof(List), ListParse(value => value)); + parsers.Put(typeof(ISet), ImmutableListParse(value => value)); + parsers.Put(typeof(HashSet), SetParse(value => value)); + + parsers.Put(typeof(IEnumerable), NullableImmutableListParse(bool.Parse)); + parsers.Put(typeof(ICollection), NullableImmutableListParse(bool.Parse)); + parsers.Put(typeof(IList), NullableImmutableListParse(bool.Parse)); + parsers.Put(typeof(List), NullableListParse(bool.Parse)); + parsers.Put(typeof(ISet), NullableImmutableSetParse(bool.Parse)); + parsers.Put(typeof(HashSet), NullableSetParse(bool.Parse)); parsers.Put(typeof(IEnumerable), ImmutableListParse(byte.Parse)); parsers.Put(typeof(ICollection), ImmutableListParse(byte.Parse)); @@ -186,6 +186,7 @@ private static IDictionary> CreateParsers() 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)); @@ -199,6 +200,7 @@ private static IDictionary> CreateParsers() 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)); @@ -206,12 +208,13 @@ private static IDictionary> CreateParsers() 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), NullableImmutableListParse(int.Parse)); + parsers.Put(typeof(ICollection), NullableImmutableListParse(int.Parse)); + parsers.Put(typeof(IList), NullableImmutableListParse(int.Parse)); + parsers.Put(typeof(List), NullableListParse(int.Parse)); + parsers.Put(typeof(ISet), NullableImmutableSetParse(int.Parse)); + parsers.Put(typeof(HashSet), NullableSetParse(int.Parse)); + parsers.Put(typeof(IEnumerable), ImmutableListParse(uint.Parse)); parsers.Put(typeof(ICollection), ImmutableListParse(uint.Parse)); parsers.Put(typeof(IList), ImmutableListParse(uint.Parse)); @@ -219,12 +222,13 @@ private static IDictionary> CreateParsers() 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), NullableImmutableListParse(long.Parse)); + parsers.Put(typeof(ICollection), NullableImmutableListParse(long.Parse)); + parsers.Put(typeof(IList), NullableImmutableListParse(long.Parse)); + parsers.Put(typeof(List), NullableListParse(long.Parse)); + parsers.Put(typeof(ISet), NullableImmutableSetParse(long.Parse)); + parsers.Put(typeof(HashSet), NullableSetParse(long.Parse)); + parsers.Put(typeof(IEnumerable), ImmutableListParse(ulong.Parse)); parsers.Put(typeof(ICollection), ImmutableListParse(ulong.Parse)); parsers.Put(typeof(IList), ImmutableListParse(ulong.Parse)); @@ -232,34 +236,33 @@ private static IDictionary> CreateParsers() 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), NullableImmutableListParse(float.Parse)); + parsers.Put(typeof(ICollection), NullableImmutableListParse(float.Parse)); + parsers.Put(typeof(IList), NullableImmutableListParse(float.Parse)); + parsers.Put(typeof(List), NullableListParse(float.Parse)); + parsers.Put(typeof(ISet), NullableImmutableSetParse(float.Parse)); + parsers.Put(typeof(HashSet), NullableSetParse(float.Parse)); + + parsers.Put(typeof(IEnumerable), NullableImmutableListParse(double.Parse)); + parsers.Put(typeof(ICollection), NullableImmutableListParse(double.Parse)); + parsers.Put(typeof(IList), NullableImmutableListParse(double.Parse)); + parsers.Put(typeof(List), NullableListParse(double.Parse)); + parsers.Put(typeof(ISet), NullableImmutableSetParse(double.Parse)); + parsers.Put(typeof(HashSet), NullableSetParse(double.Parse)); + + parsers.Put(typeof(IEnumerable), NullableImmutableListParse(decimal.Parse)); + parsers.Put(typeof(ICollection), NullableImmutableListParse(decimal.Parse)); + parsers.Put(typeof(IList), NullableImmutableListParse(decimal.Parse)); + parsers.Put(typeof(List), NullableListParse(decimal.Parse)); + parsers.Put(typeof(ISet), NullableImmutableSetParse(decimal.Parse)); + parsers.Put(typeof(HashSet), NullableSetParse(decimal.Parse)); + + parsers.Put(typeof(IEnumerable), NullableImmutableListParse(DateTime.Parse)); + parsers.Put(typeof(ICollection), NullableImmutableListParse(DateTime.Parse)); + parsers.Put(typeof(IList), NullableImmutableListParse(DateTime.Parse)); + parsers.Put(typeof(List), NullableListParse(DateTime.Parse)); + parsers.Put(typeof(ISet), NullableImmutableSetParse(DateTime.Parse)); + parsers.Put(typeof(HashSet), NullableSetParse(DateTime.Parse)); parsers.Put(typeof(IEnumerable), ImmutableListParse(TimeSpan.Parse)); parsers.Put(typeof(ICollection), ImmutableListParse(TimeSpan.Parse)); @@ -295,6 +298,11 @@ private static Func SafeParse(Func parse) }; } + private static Func NullableListParse(Func itemParser) where T: struct + { + return ListParse(it => it.ToNullable(itemParser)); + } + private static Func ListParse(Func itemParser) { return parameter => @@ -303,15 +311,15 @@ private static Func ListParse(Func itemParser) { return new List(); } - var results = parameter.Value.Split(new[] { ',' }, StringSplitOptions.None) - .Where(it => it != null) - .Select(it => it.Trim()) - .Select(itemParser) - .ToList(); - return results; + return ParseCollection(parameter.Value, itemParser).ToList(); }; } + private static Func NullableImmutableListParse(Func itemParser) where T: struct + { + return ImmutableListParse(it => it.ToNullable(itemParser)); + } + private static Func ImmutableListParse(Func itemParser) { return parameter => @@ -320,15 +328,15 @@ private static Func ImmutableListParse(Func ite { return Lists.EmptyList(); } - var results = parameter.Value.Split(new[] { ',' }, StringSplitOptions.None) - .Where(it => it != null) - .Select(it => it.Trim()) - .Select(itemParser) - .ToImmutableList(); - return results; + return ParseCollection(parameter.Value, itemParser).ToImmutableList(); }; } + private static Func NullableSetParse(Func itemParser) where T: struct + { + return SetParse(it => it.ToNullable(itemParser)); + } + private static Func SetParse(Func itemParser) { return parameter => @@ -337,15 +345,15 @@ private static Func SetParse(Func itemParser) { return new HashSet(); } - var results = parameter.Value.Split(new[] { ',' }, StringSplitOptions.None) - .Where(it => it != null) - .Select(it => it.Trim()) - .Select(itemParser) - .ToSet(); - return results; + return ParseCollection(parameter.Value, itemParser).ToSet(); }; } + private static Func NullableImmutableSetParse(Func itemParser) where T: struct + { + return ImmutableSetParse(it => it.ToNullable(itemParser)); + } + private static Func ImmutableSetParse(Func itemParser) { return parameter => @@ -354,12 +362,7 @@ private static Func ImmutableSetParse(Func item { return Sets.EmptySet(); } - var results = parameter.Value.Split(new[] { ',' }, StringSplitOptions.None) - .Where(it => it != null) - .Select(it => it.Trim()) - .Select(itemParser) - .ToImmutableHashSet(); - return results; + return ParseCollection(parameter.Value, itemParser).ToImmutableHashSet(); }; } @@ -386,6 +389,32 @@ private static ArgumentException InvalidParameterFormat(Parameter parameter, Typ parameter.Name, parameter.Value, type)); } + private static IEnumerable ParseCollection(string value, Func itemParser) + { + var results = value.Split(new[] { ',' }, StringSplitOptions.None) + .Where(it => it != null) + .Select(it => it.Trim()) + .Select(itemParser); + return results; + } + + public static T? ToNullable(this string s, Func itemParser) where T : struct + { + T? result = new T?(); + try + { + if (!string.IsNullOrEmpty(s) && s.Trim().Length > 0) + { + result = itemParser(s); + } + } + catch (Exception e) + { + throw new InvalidOperationException(Strings.Format("Unable to parse value: '{0}' to nullable: '{1}'", s, typeof(T).ToString()), e); + } + return result; + } + private class Parameter { internal string Name { get; private set; }