mirror of
https://github.com/OpenAPITools/openapi-generator.git
synced 2025-12-10 22:42:43 +00:00
[NancyFx] Support Async (#6755)
* add support for async routes/endpoints you can now set --optional-properties async=true to generate a nancyfx server stub that uses asynchronous programming. (cherry picked from commit 126869cb0b967e8063417e11993cf6326ce8ffd4) * add nancyfx-petstore-server-async.sh to generate sample of async nancyfx. * Rename async => asyncServer * update bin/nancyfx-petstore-server-async.sh * rename async => asyncServer in api.mustache + small bugfix * run ./bin/nancyfx-petstore-server.sh and ./bin/nancyfx-petstore-server-async.sh * remove additional new line in api.mustache + add space after if * run ./bin/nancyfx-petstore-server.sh and ./bin/nancyfx-petstore-server-async.sh
This commit is contained in:
31
bin/nancyfx-petstore-server-async.sh
Normal file
31
bin/nancyfx-petstore-server-async.sh
Normal file
@@ -0,0 +1,31 @@
|
||||
#!/bin/sh
|
||||
|
||||
SCRIPT="$0"
|
||||
|
||||
while [ -h "$SCRIPT" ] ; do
|
||||
ls=`ls -ld "$SCRIPT"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
SCRIPT="$link"
|
||||
else
|
||||
SCRIPT=`dirname "$SCRIPT"`/"$link"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ! -d "${APP_DIR}" ]; then
|
||||
APP_DIR=`dirname "$SCRIPT"`/..
|
||||
APP_DIR=`cd "${APP_DIR}"; pwd`
|
||||
fi
|
||||
|
||||
executable="./modules/swagger-codegen-cli/target/swagger-codegen-cli.jar"
|
||||
|
||||
if [ ! -f "$executable" ]
|
||||
then
|
||||
mvn clean package
|
||||
fi
|
||||
|
||||
# if you've executed sbt assembly previously it will use that instead.
|
||||
export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties"
|
||||
ags="generate $@ -t modules/swagger-codegen/src/main/resources/nancyfx -i modules/swagger-codegen/src/test/resources/2_0/petstore.yaml -l nancyfx -o samples/server/petstore/nancyfx-async --additional-properties packageGuid={768B8DC6-54EE-4D40-9B20-7857E1D742A4},asyncServer=true"
|
||||
|
||||
java $JAVA_OPTS -jar $executable $ags
|
||||
@@ -46,6 +46,7 @@ public class NancyFXServerCodegen extends AbstractCSharpCodegen {
|
||||
private static final String IMMUTABLE_OPTION = "immutable";
|
||||
private static final String USE_BASE_PATH = "writeModulePath";
|
||||
private static final String PACKAGE_CONTEXT = "packageContext";
|
||||
private static final String ASYNC_SERVER = "asyncServer";
|
||||
|
||||
private static final Map<String, Predicate<Property>> propertyToSwaggerTypeMapping =
|
||||
createPropertyToSwaggerTypeMapping();
|
||||
@@ -57,6 +58,9 @@ public class NancyFXServerCodegen extends AbstractCSharpCodegen {
|
||||
private final Multimap<String, CodegenModel> childrenByParent = ArrayListMultimap.create();
|
||||
private final BiMap<String, String> modelNameMapping = HashBiMap.create();
|
||||
|
||||
/** If set to true, we will generate c# async endpoints and service interfaces */
|
||||
private boolean asyncServer = false;
|
||||
|
||||
public NancyFXServerCodegen() {
|
||||
outputFolder = "generated-code" + File.separator + getName();
|
||||
apiTemplateFiles.put("api.mustache", ".cs");
|
||||
@@ -87,6 +91,7 @@ public class NancyFXServerCodegen extends AbstractCSharpCodegen {
|
||||
addSwitch(RETURN_ICOLLECTION, RETURN_ICOLLECTION_DESC, returnICollection);
|
||||
addSwitch(IMMUTABLE_OPTION, "Enabled by default. If disabled generates model classes with setters", true);
|
||||
addSwitch(USE_BASE_PATH, "Enabled by default. If disabled, module paths will not mirror api base path", true);
|
||||
addSwitch(ASYNC_SERVER, "Set to true to enable the generation of async routes/endpoints.", false);
|
||||
typeMapping.putAll(nodaTimeTypesMappings());
|
||||
languageSpecificPrimitives.addAll(nodaTimePrimitiveTypes());
|
||||
|
||||
@@ -128,6 +133,10 @@ public class NancyFXServerCodegen extends AbstractCSharpCodegen {
|
||||
setPackageGuid((String) additionalProperties.get(OPTIONAL_PROJECT_GUID));
|
||||
}
|
||||
|
||||
if (additionalProperties.containsKey(ASYNC_SERVER)) {
|
||||
setAsyncServer(Boolean.parseBoolean((String)additionalProperties.get(ASYNC_SERVER)));
|
||||
}
|
||||
|
||||
additionalProperties.put("packageGuid", packageGuid);
|
||||
|
||||
setupModelTemplate();
|
||||
@@ -200,6 +209,10 @@ public class NancyFXServerCodegen extends AbstractCSharpCodegen {
|
||||
this.packageGuid = packageGuid;
|
||||
}
|
||||
|
||||
public void setAsyncServer(boolean asyncServer) {
|
||||
this.asyncServer = asyncServer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String apiFileFolder() {
|
||||
return outputFolder + File.separator + sourceFolder() + File.separator + API_NAMESPACE;
|
||||
|
||||
@@ -5,7 +5,8 @@ using System.Collections.Generic;
|
||||
using Sharpility.Base;
|
||||
using {{packageName}}.{{packageContext}}.Models;
|
||||
using {{packageName}}.{{packageContext}}.Utils;
|
||||
using NodaTime;
|
||||
using NodaTime;{{#asyncServer}}
|
||||
using System.Threading.Tasks;{{/asyncServer}}
|
||||
{{#imports}}using {{import}};
|
||||
{{/imports}}
|
||||
|
||||
@@ -24,13 +25,13 @@ namespace {{packageName}}.{{packageContext}}.Modules
|
||||
/// <param name="service">Service handling requests</param>
|
||||
public {{classname}}Module({{interfacePrefix}}{{classname}}Service service) : base("{{{baseContext}}}")
|
||||
{ {{#operation}}
|
||||
{{httpMethod}}["{{{path}}}"] = parameters =>
|
||||
{{httpMethod}}["{{{path}}}"{{#asyncServer}}, true{{/asyncServer}}] = {{#asyncServer}}async (parameters, ct){{/asyncServer}}{{^asyncServer}}parameters{{/asyncServer}} =>
|
||||
{
|
||||
{{#allParams}}{{#isBodyParam}}var {{paramName}} = this.Bind<{{&dataType}}>();{{/isBodyParam}}{{^isBodyParam}}{{#isEnum}}var {{paramName}} = Parameters.ValueOf<{{>innerApiEnumName}}?>({{>innerParameterValueOfArgs}});{{/isEnum}}{{^isEnum}}var {{paramName}} = Parameters.ValueOf<{{&dataType}}>({{>innerParameterValueOfArgs}});{{/isEnum}}{{#hasMore}}
|
||||
{{/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}}{{#isListContainer}}.ToArray(){{/isListContainer}}{{/returnType}};{{^returnType}}
|
||||
{{#returnType}}return {{/returnType}}{{#asyncServer}}await {{/asyncServer}}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}}
|
||||
@@ -48,7 +49,7 @@ namespace {{packageName}}.{{packageContext}}.Modules
|
||||
/// <param name="context">Context of request</param>
|
||||
{{#allParams}}/// <param name="{{paramName}}">{{description}}{{^required}} (optional{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/required}}</param>
|
||||
{{/allParams}}/// <returns>{{#returnType}}{{returnType}}{{/returnType}}</returns>
|
||||
{{#returnType}}{{&returnType}}{{/returnType}}{{^returnType}}void{{/returnType}} {{operationId}}(NancyContext context{{#allParams.0}}, {{/allParams.0}}{{>paramsList}});{{#hasMore}}
|
||||
{{#asyncServer}}{{#returnType}}Task<{{{returnType}}}>{{/returnType}}{{^returnType}}Task{{/returnType}}{{/asyncServer}}{{^asyncServer}}{{#returnType}}{{&returnType}}{{/returnType}}{{^returnType}}void{{/returnType}}{{/asyncServer}} {{operationId}}(NancyContext context{{#allParams.0}}, {{/allParams.0}}{{>paramsList}});{{#hasMore}}
|
||||
|
||||
{{/hasMore}}{{/operation}}
|
||||
}
|
||||
@@ -58,14 +59,14 @@ namespace {{packageName}}.{{packageContext}}.Modules
|
||||
/// </summary>
|
||||
public abstract class Abstract{{classname}}Service: {{interfacePrefix}}{{classname}}Service
|
||||
{
|
||||
{{#operation}}public virtual {{#returnType}}{{&returnType}}{{/returnType}}{{^returnType}}void{{/returnType}} {{operationId}}(NancyContext context{{#allParams.0}}, {{/allParams.0}}{{>paramsList}})
|
||||
{{#operation}}public virtual {{#asyncServer}}{{#returnType}}Task<{{{returnType}}}>{{/returnType}}{{^returnType}}Task{{/returnType}}{{/asyncServer}}{{^asyncServer}}{{#returnType}}{{&returnType}}{{/returnType}}{{^returnType}}void{{/returnType}}{{/asyncServer}} {{operationId}}(NancyContext context{{#allParams.0}}, {{/allParams.0}}{{>paramsList}})
|
||||
{
|
||||
{{#returnType}}return {{/returnType}}{{operationId}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
|
||||
{{^asyncServer}}{{#returnType}}return {{/returnType}}{{/asyncServer}}{{#asyncServer}}return {{/asyncServer}}{{operationId}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
|
||||
}{{#hasMore}}
|
||||
|
||||
{{/hasMore}}{{/operation}}
|
||||
|
||||
{{#operation}}protected abstract {{#returnType}}{{&returnType}}{{/returnType}}{{^returnType}}void{{/returnType}} {{operationId}}({{>paramsList}});{{#hasMore}}
|
||||
{{#operation}}protected abstract {{#asyncServer}}{{#returnType}}Task<{{{returnType}}}>{{/returnType}}{{^returnType}}Task{{/returnType}}{{/asyncServer}}{{^asyncServer}}{{#returnType}}{{&returnType}}{{/returnType}}{{^returnType}}void{{/returnType}}{{/asyncServer}} {{operationId}}({{>paramsList}});{{#hasMore}}
|
||||
|
||||
{{/hasMore}}{{/operation}}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
# Swagger Codegen Ignore
|
||||
# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen
|
||||
|
||||
# Use this file to prevent files from being overwritten by the generator.
|
||||
# The patterns follow closely to .gitignore or .dockerignore.
|
||||
|
||||
# As an example, the C# client generator defines ApiClient.cs.
|
||||
# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line:
|
||||
#ApiClient.cs
|
||||
|
||||
# You can match any string of characters against a directory, file or extension with a single asterisk (*):
|
||||
#foo/*/qux
|
||||
# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
|
||||
|
||||
# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
|
||||
#foo/**/qux
|
||||
# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
|
||||
|
||||
# You can also negate patterns with an exclamation (!).
|
||||
# For example, you can ignore all files in a docs folder with the file extension .md:
|
||||
#docs/*.md
|
||||
# Then explicitly reverse the ignore rule for a single file:
|
||||
#!docs/README.md
|
||||
@@ -0,0 +1 @@
|
||||
2.3.0-SNAPSHOT
|
||||
25
samples/server/petstore/nancyfx-async/IO.Swagger.sln
Normal file
25
samples/server/petstore/nancyfx-async/IO.Swagger.sln
Normal file
@@ -0,0 +1,25 @@
|
||||
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", "{768B8DC6-54EE-4D40-9B20-7857E1D742A4}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{768B8DC6-54EE-4D40-9B20-7857E1D742A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{768B8DC6-54EE-4D40-9B20-7857E1D742A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{768B8DC6-54EE-4D40-9B20-7857E1D742A4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{768B8DC6-54EE-4D40-9B20-7857E1D742A4}.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
|
||||
{19F1DEBC-DE5E-4517-8062-F000CD499087}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{768B8DC6-54EE-4D40-9B20-7857E1D742A4}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>IO.Swagger.v2</RootNamespace>
|
||||
<AssemblyName>IO.Swagger</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<DocumentationFile>bin\Debug\IO.Swagger.XML</DocumentationFile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<DocumentationFile>bin\Release\IO.Swagger.XML</DocumentationFile>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Nancy, Version=1.4.2.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Nancy.1.4.3\lib\net40\Nancy.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="NodaTime, Version=1.3.0.0, Culture=neutral, PublicKeyToken=4226afe0d9b296d1, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\NodaTime.1.3.1\lib\net35-Client\NodaTime.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Sharpility, Version=1.2.2.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Sharpility.1.2.2\lib\net45\Sharpility.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Collections.Immutable, Version=1.1.37.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\System.Collections.Immutable.1.1.37\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference> <Reference Include="System"/>
|
||||
<Reference Include="System.Core"/>
|
||||
<Reference Include="System.Xml.Linq"/>
|
||||
<Reference Include="System.Data.DataSetExtensions"/>
|
||||
<Reference Include="Microsoft.CSharp"/>
|
||||
<Reference Include="System.Data"/>
|
||||
<Reference Include="System.Runtime.Serialization"/>
|
||||
<Reference Include="System.Xml"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="**\*.cs" Exclude="obj\**"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="packages.config"/>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MsBuildToolsPath)\Microsoft.CSharp.targets"/>
|
||||
</Project>
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0"?>
|
||||
<package>
|
||||
<metadata>
|
||||
<id>IO.Swagger</id>
|
||||
<title>IO.Swagger</title>
|
||||
<version>1.0.0</version>
|
||||
<authors>swagger-codegen</authors>
|
||||
<owners>swagger-codegen</owners>
|
||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
||||
<description>NancyFx IO.Swagger API</description>
|
||||
<copyright>http://swagger.io/terms/</copyright>
|
||||
<licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>
|
||||
</metadata>
|
||||
</package>
|
||||
@@ -0,0 +1,185 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Sharpility.Extensions;
|
||||
using NodaTime;
|
||||
|
||||
namespace IO.Swagger.v2.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// Describes the result of uploading an image resource
|
||||
/// </summary>
|
||||
public sealed class ApiResponse: IEquatable<ApiResponse>
|
||||
{
|
||||
/// <summary>
|
||||
/// Code
|
||||
/// </summary>
|
||||
public int? Code { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Type
|
||||
/// </summary>
|
||||
public string Type { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Message
|
||||
/// </summary>
|
||||
public string Message { get; private set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Empty constructor required by some serializers.
|
||||
/// Use ApiResponse.Builder() for instance creation instead.
|
||||
/// </summary>
|
||||
[Obsolete]
|
||||
public ApiResponse()
|
||||
{
|
||||
}
|
||||
|
||||
private ApiResponse(int? Code, string Type, string Message)
|
||||
{
|
||||
|
||||
this.Code = Code;
|
||||
|
||||
this.Type = Type;
|
||||
|
||||
this.Message = Message;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns builder of ApiResponse.
|
||||
/// </summary>
|
||||
/// <returns>ApiResponseBuilder</returns>
|
||||
public static ApiResponseBuilder Builder()
|
||||
{
|
||||
return new ApiResponseBuilder();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns ApiResponseBuilder with properties set.
|
||||
/// Use it to change properties.
|
||||
/// </summary>
|
||||
/// <returns>ApiResponseBuilder</returns>
|
||||
public ApiResponseBuilder With()
|
||||
{
|
||||
return Builder()
|
||||
.Code(Code)
|
||||
.Type(Type)
|
||||
.Message(Message);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return this.PropertiesToString();
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
return this.EqualsByProperties(obj);
|
||||
}
|
||||
|
||||
public bool Equals(ApiResponse other)
|
||||
{
|
||||
return Equals((object) other);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return this.PropertiesHash();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of == operator for (ApiResponse.
|
||||
/// </summary>
|
||||
/// <param name="left">Compared (ApiResponse</param>
|
||||
/// <param name="right">Compared (ApiResponse</param>
|
||||
/// <returns>true if compared items are equals, false otherwise</returns>
|
||||
public static bool operator == (ApiResponse left, ApiResponse right)
|
||||
{
|
||||
return Equals(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of != operator for (ApiResponse.
|
||||
/// </summary>
|
||||
/// <param name="left">Compared (ApiResponse</param>
|
||||
/// <param name="right">Compared (ApiResponse</param>
|
||||
/// <returns>true if compared items are not equals, false otherwise</returns>
|
||||
public static bool operator != (ApiResponse left, ApiResponse right)
|
||||
{
|
||||
return !Equals(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Builder of ApiResponse.
|
||||
/// </summary>
|
||||
public sealed class ApiResponseBuilder
|
||||
{
|
||||
private int? _Code;
|
||||
private string _Type;
|
||||
private string _Message;
|
||||
|
||||
internal ApiResponseBuilder()
|
||||
{
|
||||
SetupDefaults();
|
||||
}
|
||||
|
||||
private void SetupDefaults()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for ApiResponse.Code property.
|
||||
/// </summary>
|
||||
/// <param name="value">Code</param>
|
||||
public ApiResponseBuilder Code(int? value)
|
||||
{
|
||||
_Code = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for ApiResponse.Type property.
|
||||
/// </summary>
|
||||
/// <param name="value">Type</param>
|
||||
public ApiResponseBuilder Type(string value)
|
||||
{
|
||||
_Type = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for ApiResponse.Message property.
|
||||
/// </summary>
|
||||
/// <param name="value">Message</param>
|
||||
public ApiResponseBuilder Message(string value)
|
||||
{
|
||||
_Message = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Builds instance of ApiResponse.
|
||||
/// </summary>
|
||||
/// <returns>ApiResponse</returns>
|
||||
public ApiResponse Build()
|
||||
{
|
||||
Validate();
|
||||
return new ApiResponse(
|
||||
Code: _Code,
|
||||
Type: _Type,
|
||||
Message: _Message
|
||||
);
|
||||
}
|
||||
|
||||
private void Validate()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,165 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Sharpility.Extensions;
|
||||
using NodaTime;
|
||||
|
||||
namespace IO.Swagger.v2.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// A category for a pet
|
||||
/// </summary>
|
||||
public sealed class Category: IEquatable<Category>
|
||||
{
|
||||
/// <summary>
|
||||
/// Id
|
||||
/// </summary>
|
||||
public long? Id { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Name
|
||||
/// </summary>
|
||||
public string Name { get; private set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Empty constructor required by some serializers.
|
||||
/// Use Category.Builder() for instance creation instead.
|
||||
/// </summary>
|
||||
[Obsolete]
|
||||
public Category()
|
||||
{
|
||||
}
|
||||
|
||||
private Category(long? Id, string Name)
|
||||
{
|
||||
|
||||
this.Id = Id;
|
||||
|
||||
this.Name = Name;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns builder of Category.
|
||||
/// </summary>
|
||||
/// <returns>CategoryBuilder</returns>
|
||||
public static CategoryBuilder Builder()
|
||||
{
|
||||
return new CategoryBuilder();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns CategoryBuilder with properties set.
|
||||
/// Use it to change properties.
|
||||
/// </summary>
|
||||
/// <returns>CategoryBuilder</returns>
|
||||
public CategoryBuilder With()
|
||||
{
|
||||
return Builder()
|
||||
.Id(Id)
|
||||
.Name(Name);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return this.PropertiesToString();
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
return this.EqualsByProperties(obj);
|
||||
}
|
||||
|
||||
public bool Equals(Category other)
|
||||
{
|
||||
return Equals((object) other);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return this.PropertiesHash();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of == operator for (Category.
|
||||
/// </summary>
|
||||
/// <param name="left">Compared (Category</param>
|
||||
/// <param name="right">Compared (Category</param>
|
||||
/// <returns>true if compared items are equals, false otherwise</returns>
|
||||
public static bool operator == (Category left, Category right)
|
||||
{
|
||||
return Equals(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of != operator for (Category.
|
||||
/// </summary>
|
||||
/// <param name="left">Compared (Category</param>
|
||||
/// <param name="right">Compared (Category</param>
|
||||
/// <returns>true if compared items are not equals, false otherwise</returns>
|
||||
public static bool operator != (Category left, Category right)
|
||||
{
|
||||
return !Equals(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Builder of Category.
|
||||
/// </summary>
|
||||
public sealed class CategoryBuilder
|
||||
{
|
||||
private long? _Id;
|
||||
private string _Name;
|
||||
|
||||
internal CategoryBuilder()
|
||||
{
|
||||
SetupDefaults();
|
||||
}
|
||||
|
||||
private void SetupDefaults()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for Category.Id property.
|
||||
/// </summary>
|
||||
/// <param name="value">Id</param>
|
||||
public CategoryBuilder Id(long? value)
|
||||
{
|
||||
_Id = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for Category.Name property.
|
||||
/// </summary>
|
||||
/// <param name="value">Name</param>
|
||||
public CategoryBuilder Name(string value)
|
||||
{
|
||||
_Name = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Builds instance of Category.
|
||||
/// </summary>
|
||||
/// <returns>Category</returns>
|
||||
public Category Build()
|
||||
{
|
||||
Validate();
|
||||
return new Category(
|
||||
Id: _Id,
|
||||
Name: _Name
|
||||
);
|
||||
}
|
||||
|
||||
private void Validate()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,247 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Sharpility.Extensions;
|
||||
using NodaTime;
|
||||
|
||||
namespace IO.Swagger.v2.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// An order for a pets from the pet store
|
||||
/// </summary>
|
||||
public sealed class Order: IEquatable<Order>
|
||||
{
|
||||
/// <summary>
|
||||
/// Id
|
||||
/// </summary>
|
||||
public long? Id { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// PetId
|
||||
/// </summary>
|
||||
public long? PetId { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Quantity
|
||||
/// </summary>
|
||||
public int? Quantity { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// ShipDate
|
||||
/// </summary>
|
||||
public ZonedDateTime? ShipDate { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Order Status
|
||||
/// </summary>
|
||||
public StatusEnum? Status { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Complete
|
||||
/// </summary>
|
||||
public bool? Complete { get; private set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Empty constructor required by some serializers.
|
||||
/// Use Order.Builder() for instance creation instead.
|
||||
/// </summary>
|
||||
[Obsolete]
|
||||
public Order()
|
||||
{
|
||||
}
|
||||
|
||||
private Order(long? Id, long? PetId, int? Quantity, ZonedDateTime? ShipDate, StatusEnum? Status, bool? Complete)
|
||||
{
|
||||
|
||||
this.Id = Id;
|
||||
|
||||
this.PetId = PetId;
|
||||
|
||||
this.Quantity = Quantity;
|
||||
|
||||
this.ShipDate = ShipDate;
|
||||
|
||||
this.Status = Status;
|
||||
|
||||
this.Complete = Complete;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns builder of Order.
|
||||
/// </summary>
|
||||
/// <returns>OrderBuilder</returns>
|
||||
public static OrderBuilder Builder()
|
||||
{
|
||||
return new OrderBuilder();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns OrderBuilder with properties set.
|
||||
/// Use it to change properties.
|
||||
/// </summary>
|
||||
/// <returns>OrderBuilder</returns>
|
||||
public OrderBuilder With()
|
||||
{
|
||||
return Builder()
|
||||
.Id(Id)
|
||||
.PetId(PetId)
|
||||
.Quantity(Quantity)
|
||||
.ShipDate(ShipDate)
|
||||
.Status(Status)
|
||||
.Complete(Complete);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return this.PropertiesToString();
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
return this.EqualsByProperties(obj);
|
||||
}
|
||||
|
||||
public bool Equals(Order other)
|
||||
{
|
||||
return Equals((object) other);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return this.PropertiesHash();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of == operator for (Order.
|
||||
/// </summary>
|
||||
/// <param name="left">Compared (Order</param>
|
||||
/// <param name="right">Compared (Order</param>
|
||||
/// <returns>true if compared items are equals, false otherwise</returns>
|
||||
public static bool operator == (Order left, Order right)
|
||||
{
|
||||
return Equals(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of != operator for (Order.
|
||||
/// </summary>
|
||||
/// <param name="left">Compared (Order</param>
|
||||
/// <param name="right">Compared (Order</param>
|
||||
/// <returns>true if compared items are not equals, false otherwise</returns>
|
||||
public static bool operator != (Order left, Order right)
|
||||
{
|
||||
return !Equals(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Builder of Order.
|
||||
/// </summary>
|
||||
public sealed class OrderBuilder
|
||||
{
|
||||
private long? _Id;
|
||||
private long? _PetId;
|
||||
private int? _Quantity;
|
||||
private ZonedDateTime? _ShipDate;
|
||||
private StatusEnum? _Status;
|
||||
private bool? _Complete;
|
||||
|
||||
internal OrderBuilder()
|
||||
{
|
||||
SetupDefaults();
|
||||
}
|
||||
|
||||
private void SetupDefaults()
|
||||
{
|
||||
_Complete = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for Order.Id property.
|
||||
/// </summary>
|
||||
/// <param name="value">Id</param>
|
||||
public OrderBuilder Id(long? value)
|
||||
{
|
||||
_Id = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for Order.PetId property.
|
||||
/// </summary>
|
||||
/// <param name="value">PetId</param>
|
||||
public OrderBuilder PetId(long? value)
|
||||
{
|
||||
_PetId = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for Order.Quantity property.
|
||||
/// </summary>
|
||||
/// <param name="value">Quantity</param>
|
||||
public OrderBuilder Quantity(int? value)
|
||||
{
|
||||
_Quantity = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for Order.ShipDate property.
|
||||
/// </summary>
|
||||
/// <param name="value">ShipDate</param>
|
||||
public OrderBuilder ShipDate(ZonedDateTime? value)
|
||||
{
|
||||
_ShipDate = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for Order.Status property.
|
||||
/// </summary>
|
||||
/// <param name="value">Order Status</param>
|
||||
public OrderBuilder Status(StatusEnum? value)
|
||||
{
|
||||
_Status = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for Order.Complete property.
|
||||
/// </summary>
|
||||
/// <param name="value">Complete</param>
|
||||
public OrderBuilder Complete(bool? value)
|
||||
{
|
||||
_Complete = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Builds instance of Order.
|
||||
/// </summary>
|
||||
/// <returns>Order</returns>
|
||||
public Order Build()
|
||||
{
|
||||
Validate();
|
||||
return new Order(
|
||||
Id: _Id,
|
||||
PetId: _PetId,
|
||||
Quantity: _Quantity,
|
||||
ShipDate: _ShipDate,
|
||||
Status: _Status,
|
||||
Complete: _Complete
|
||||
);
|
||||
}
|
||||
|
||||
private void Validate()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public enum StatusEnum { Placed, Approved, Delivered };
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,254 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Sharpility.Extensions;
|
||||
using NodaTime;
|
||||
|
||||
namespace IO.Swagger.v2.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// A pet for sale in the pet store
|
||||
/// </summary>
|
||||
public sealed class Pet: IEquatable<Pet>
|
||||
{
|
||||
/// <summary>
|
||||
/// Id
|
||||
/// </summary>
|
||||
public long? Id { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Category
|
||||
/// </summary>
|
||||
public Category Category { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Name
|
||||
/// </summary>
|
||||
public string Name { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// PhotoUrls
|
||||
/// </summary>
|
||||
public List<string> PhotoUrls { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Tags
|
||||
/// </summary>
|
||||
public List<Tag> Tags { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// pet status in the store
|
||||
/// </summary>
|
||||
public StatusEnum? Status { get; private set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Empty constructor required by some serializers.
|
||||
/// Use Pet.Builder() for instance creation instead.
|
||||
/// </summary>
|
||||
[Obsolete]
|
||||
public Pet()
|
||||
{
|
||||
}
|
||||
|
||||
private Pet(long? Id, Category Category, string Name, List<string> PhotoUrls, List<Tag> Tags, StatusEnum? Status)
|
||||
{
|
||||
|
||||
this.Id = Id;
|
||||
|
||||
this.Category = Category;
|
||||
|
||||
this.Name = Name;
|
||||
|
||||
this.PhotoUrls = PhotoUrls;
|
||||
|
||||
this.Tags = Tags;
|
||||
|
||||
this.Status = Status;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns builder of Pet.
|
||||
/// </summary>
|
||||
/// <returns>PetBuilder</returns>
|
||||
public static PetBuilder Builder()
|
||||
{
|
||||
return new PetBuilder();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns PetBuilder with properties set.
|
||||
/// Use it to change properties.
|
||||
/// </summary>
|
||||
/// <returns>PetBuilder</returns>
|
||||
public PetBuilder With()
|
||||
{
|
||||
return Builder()
|
||||
.Id(Id)
|
||||
.Category(Category)
|
||||
.Name(Name)
|
||||
.PhotoUrls(PhotoUrls)
|
||||
.Tags(Tags)
|
||||
.Status(Status);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return this.PropertiesToString();
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
return this.EqualsByProperties(obj);
|
||||
}
|
||||
|
||||
public bool Equals(Pet other)
|
||||
{
|
||||
return Equals((object) other);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return this.PropertiesHash();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of == operator for (Pet.
|
||||
/// </summary>
|
||||
/// <param name="left">Compared (Pet</param>
|
||||
/// <param name="right">Compared (Pet</param>
|
||||
/// <returns>true if compared items are equals, false otherwise</returns>
|
||||
public static bool operator == (Pet left, Pet right)
|
||||
{
|
||||
return Equals(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of != operator for (Pet.
|
||||
/// </summary>
|
||||
/// <param name="left">Compared (Pet</param>
|
||||
/// <param name="right">Compared (Pet</param>
|
||||
/// <returns>true if compared items are not equals, false otherwise</returns>
|
||||
public static bool operator != (Pet left, Pet right)
|
||||
{
|
||||
return !Equals(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Builder of Pet.
|
||||
/// </summary>
|
||||
public sealed class PetBuilder
|
||||
{
|
||||
private long? _Id;
|
||||
private Category _Category;
|
||||
private string _Name;
|
||||
private List<string> _PhotoUrls;
|
||||
private List<Tag> _Tags;
|
||||
private StatusEnum? _Status;
|
||||
|
||||
internal PetBuilder()
|
||||
{
|
||||
SetupDefaults();
|
||||
}
|
||||
|
||||
private void SetupDefaults()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for Pet.Id property.
|
||||
/// </summary>
|
||||
/// <param name="value">Id</param>
|
||||
public PetBuilder Id(long? value)
|
||||
{
|
||||
_Id = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for Pet.Category property.
|
||||
/// </summary>
|
||||
/// <param name="value">Category</param>
|
||||
public PetBuilder Category(Category value)
|
||||
{
|
||||
_Category = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for Pet.Name property.
|
||||
/// </summary>
|
||||
/// <param name="value">Name</param>
|
||||
public PetBuilder Name(string value)
|
||||
{
|
||||
_Name = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for Pet.PhotoUrls property.
|
||||
/// </summary>
|
||||
/// <param name="value">PhotoUrls</param>
|
||||
public PetBuilder PhotoUrls(List<string> value)
|
||||
{
|
||||
_PhotoUrls = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for Pet.Tags property.
|
||||
/// </summary>
|
||||
/// <param name="value">Tags</param>
|
||||
public PetBuilder Tags(List<Tag> value)
|
||||
{
|
||||
_Tags = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for Pet.Status property.
|
||||
/// </summary>
|
||||
/// <param name="value">pet status in the store</param>
|
||||
public PetBuilder Status(StatusEnum? value)
|
||||
{
|
||||
_Status = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Builds instance of Pet.
|
||||
/// </summary>
|
||||
/// <returns>Pet</returns>
|
||||
public Pet Build()
|
||||
{
|
||||
Validate();
|
||||
return new Pet(
|
||||
Id: _Id,
|
||||
Category: _Category,
|
||||
Name: _Name,
|
||||
PhotoUrls: _PhotoUrls,
|
||||
Tags: _Tags,
|
||||
Status: _Status
|
||||
);
|
||||
}
|
||||
|
||||
private void Validate()
|
||||
{
|
||||
if (_Name == null)
|
||||
{
|
||||
throw new ArgumentException("Name is a required property for Pet and cannot be null");
|
||||
}
|
||||
if (_PhotoUrls == null)
|
||||
{
|
||||
throw new ArgumentException("PhotoUrls is a required property for Pet and cannot be null");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public enum StatusEnum { Available, Pending, Sold };
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,165 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Sharpility.Extensions;
|
||||
using NodaTime;
|
||||
|
||||
namespace IO.Swagger.v2.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// A tag for a pet
|
||||
/// </summary>
|
||||
public sealed class Tag: IEquatable<Tag>
|
||||
{
|
||||
/// <summary>
|
||||
/// Id
|
||||
/// </summary>
|
||||
public long? Id { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Name
|
||||
/// </summary>
|
||||
public string Name { get; private set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Empty constructor required by some serializers.
|
||||
/// Use Tag.Builder() for instance creation instead.
|
||||
/// </summary>
|
||||
[Obsolete]
|
||||
public Tag()
|
||||
{
|
||||
}
|
||||
|
||||
private Tag(long? Id, string Name)
|
||||
{
|
||||
|
||||
this.Id = Id;
|
||||
|
||||
this.Name = Name;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns builder of Tag.
|
||||
/// </summary>
|
||||
/// <returns>TagBuilder</returns>
|
||||
public static TagBuilder Builder()
|
||||
{
|
||||
return new TagBuilder();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns TagBuilder with properties set.
|
||||
/// Use it to change properties.
|
||||
/// </summary>
|
||||
/// <returns>TagBuilder</returns>
|
||||
public TagBuilder With()
|
||||
{
|
||||
return Builder()
|
||||
.Id(Id)
|
||||
.Name(Name);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return this.PropertiesToString();
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
return this.EqualsByProperties(obj);
|
||||
}
|
||||
|
||||
public bool Equals(Tag other)
|
||||
{
|
||||
return Equals((object) other);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return this.PropertiesHash();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of == operator for (Tag.
|
||||
/// </summary>
|
||||
/// <param name="left">Compared (Tag</param>
|
||||
/// <param name="right">Compared (Tag</param>
|
||||
/// <returns>true if compared items are equals, false otherwise</returns>
|
||||
public static bool operator == (Tag left, Tag right)
|
||||
{
|
||||
return Equals(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of != operator for (Tag.
|
||||
/// </summary>
|
||||
/// <param name="left">Compared (Tag</param>
|
||||
/// <param name="right">Compared (Tag</param>
|
||||
/// <returns>true if compared items are not equals, false otherwise</returns>
|
||||
public static bool operator != (Tag left, Tag right)
|
||||
{
|
||||
return !Equals(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Builder of Tag.
|
||||
/// </summary>
|
||||
public sealed class TagBuilder
|
||||
{
|
||||
private long? _Id;
|
||||
private string _Name;
|
||||
|
||||
internal TagBuilder()
|
||||
{
|
||||
SetupDefaults();
|
||||
}
|
||||
|
||||
private void SetupDefaults()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for Tag.Id property.
|
||||
/// </summary>
|
||||
/// <param name="value">Id</param>
|
||||
public TagBuilder Id(long? value)
|
||||
{
|
||||
_Id = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for Tag.Name property.
|
||||
/// </summary>
|
||||
/// <param name="value">Name</param>
|
||||
public TagBuilder Name(string value)
|
||||
{
|
||||
_Name = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Builds instance of Tag.
|
||||
/// </summary>
|
||||
/// <returns>Tag</returns>
|
||||
public Tag Build()
|
||||
{
|
||||
Validate();
|
||||
return new Tag(
|
||||
Id: _Id,
|
||||
Name: _Name
|
||||
);
|
||||
}
|
||||
|
||||
private void Validate()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,285 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Sharpility.Extensions;
|
||||
using NodaTime;
|
||||
|
||||
namespace IO.Swagger.v2.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// A User who is purchasing from the pet store
|
||||
/// </summary>
|
||||
public sealed class User: IEquatable<User>
|
||||
{
|
||||
/// <summary>
|
||||
/// Id
|
||||
/// </summary>
|
||||
public long? Id { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Username
|
||||
/// </summary>
|
||||
public string Username { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// FirstName
|
||||
/// </summary>
|
||||
public string FirstName { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// LastName
|
||||
/// </summary>
|
||||
public string LastName { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Email
|
||||
/// </summary>
|
||||
public string Email { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Password
|
||||
/// </summary>
|
||||
public string Password { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Phone
|
||||
/// </summary>
|
||||
public string Phone { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// User Status
|
||||
/// </summary>
|
||||
public int? UserStatus { get; private set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Empty constructor required by some serializers.
|
||||
/// Use User.Builder() for instance creation instead.
|
||||
/// </summary>
|
||||
[Obsolete]
|
||||
public User()
|
||||
{
|
||||
}
|
||||
|
||||
private User(long? Id, string Username, string FirstName, string LastName, string Email, string Password, string Phone, int? UserStatus)
|
||||
{
|
||||
|
||||
this.Id = Id;
|
||||
|
||||
this.Username = Username;
|
||||
|
||||
this.FirstName = FirstName;
|
||||
|
||||
this.LastName = LastName;
|
||||
|
||||
this.Email = Email;
|
||||
|
||||
this.Password = Password;
|
||||
|
||||
this.Phone = Phone;
|
||||
|
||||
this.UserStatus = UserStatus;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns builder of User.
|
||||
/// </summary>
|
||||
/// <returns>UserBuilder</returns>
|
||||
public static UserBuilder Builder()
|
||||
{
|
||||
return new UserBuilder();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns UserBuilder with properties set.
|
||||
/// Use it to change properties.
|
||||
/// </summary>
|
||||
/// <returns>UserBuilder</returns>
|
||||
public UserBuilder With()
|
||||
{
|
||||
return Builder()
|
||||
.Id(Id)
|
||||
.Username(Username)
|
||||
.FirstName(FirstName)
|
||||
.LastName(LastName)
|
||||
.Email(Email)
|
||||
.Password(Password)
|
||||
.Phone(Phone)
|
||||
.UserStatus(UserStatus);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return this.PropertiesToString();
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
return this.EqualsByProperties(obj);
|
||||
}
|
||||
|
||||
public bool Equals(User other)
|
||||
{
|
||||
return Equals((object) other);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return this.PropertiesHash();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of == operator for (User.
|
||||
/// </summary>
|
||||
/// <param name="left">Compared (User</param>
|
||||
/// <param name="right">Compared (User</param>
|
||||
/// <returns>true if compared items are equals, false otherwise</returns>
|
||||
public static bool operator == (User left, User right)
|
||||
{
|
||||
return Equals(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of != operator for (User.
|
||||
/// </summary>
|
||||
/// <param name="left">Compared (User</param>
|
||||
/// <param name="right">Compared (User</param>
|
||||
/// <returns>true if compared items are not equals, false otherwise</returns>
|
||||
public static bool operator != (User left, User right)
|
||||
{
|
||||
return !Equals(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Builder of User.
|
||||
/// </summary>
|
||||
public sealed class UserBuilder
|
||||
{
|
||||
private long? _Id;
|
||||
private string _Username;
|
||||
private string _FirstName;
|
||||
private string _LastName;
|
||||
private string _Email;
|
||||
private string _Password;
|
||||
private string _Phone;
|
||||
private int? _UserStatus;
|
||||
|
||||
internal UserBuilder()
|
||||
{
|
||||
SetupDefaults();
|
||||
}
|
||||
|
||||
private void SetupDefaults()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for User.Id property.
|
||||
/// </summary>
|
||||
/// <param name="value">Id</param>
|
||||
public UserBuilder Id(long? value)
|
||||
{
|
||||
_Id = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for User.Username property.
|
||||
/// </summary>
|
||||
/// <param name="value">Username</param>
|
||||
public UserBuilder Username(string value)
|
||||
{
|
||||
_Username = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for User.FirstName property.
|
||||
/// </summary>
|
||||
/// <param name="value">FirstName</param>
|
||||
public UserBuilder FirstName(string value)
|
||||
{
|
||||
_FirstName = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for User.LastName property.
|
||||
/// </summary>
|
||||
/// <param name="value">LastName</param>
|
||||
public UserBuilder LastName(string value)
|
||||
{
|
||||
_LastName = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for User.Email property.
|
||||
/// </summary>
|
||||
/// <param name="value">Email</param>
|
||||
public UserBuilder Email(string value)
|
||||
{
|
||||
_Email = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for User.Password property.
|
||||
/// </summary>
|
||||
/// <param name="value">Password</param>
|
||||
public UserBuilder Password(string value)
|
||||
{
|
||||
_Password = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for User.Phone property.
|
||||
/// </summary>
|
||||
/// <param name="value">Phone</param>
|
||||
public UserBuilder Phone(string value)
|
||||
{
|
||||
_Phone = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets value for User.UserStatus property.
|
||||
/// </summary>
|
||||
/// <param name="value">User Status</param>
|
||||
public UserBuilder UserStatus(int? value)
|
||||
{
|
||||
_UserStatus = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Builds instance of User.
|
||||
/// </summary>
|
||||
/// <returns>User</returns>
|
||||
public User Build()
|
||||
{
|
||||
Validate();
|
||||
return new User(
|
||||
Id: _Id,
|
||||
Username: _Username,
|
||||
FirstName: _FirstName,
|
||||
LastName: _LastName,
|
||||
Email: _Email,
|
||||
Password: _Password,
|
||||
Phone: _Phone,
|
||||
UserStatus: _UserStatus
|
||||
);
|
||||
}
|
||||
|
||||
private void Validate()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,247 @@
|
||||
using System;
|
||||
using Nancy;
|
||||
using Nancy.ModelBinding;
|
||||
using System.Collections.Generic;
|
||||
using Sharpility.Base;
|
||||
using IO.Swagger.v2.Models;
|
||||
using IO.Swagger.v2.Utils;
|
||||
using NodaTime;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IO.Swagger.v2.Modules
|
||||
{
|
||||
/// <summary>
|
||||
/// Status values that need to be considered for filter
|
||||
/// </summary>
|
||||
public enum FindPetsByStatusStatusEnum
|
||||
{
|
||||
available,
|
||||
pending,
|
||||
sold
|
||||
};
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Module processing requests of Pet domain.
|
||||
/// </summary>
|
||||
public sealed class PetModule : NancyModule
|
||||
{
|
||||
/// <summary>
|
||||
/// Sets up HTTP methods mappings.
|
||||
/// </summary>
|
||||
/// <param name="service">Service handling requests</param>
|
||||
public PetModule(PetService service) : base("/v2")
|
||||
{
|
||||
Post["/pet", true] = async (parameters, ct) =>
|
||||
{
|
||||
var body = this.Bind<Pet>();
|
||||
Preconditions.IsNotNull(body, "Required parameter: 'body' is missing at 'AddPet'");
|
||||
|
||||
await service.AddPet(Context, body);
|
||||
return new Response { ContentType = "application/xml"};
|
||||
};
|
||||
|
||||
Delete["/pet/{petId}", true] = async (parameters, ct) =>
|
||||
{
|
||||
var petId = Parameters.ValueOf<long?>(parameters, Context.Request, "petId", ParameterType.Path);
|
||||
var apiKey = Parameters.ValueOf<string>(parameters, Context.Request, "apiKey", ParameterType.Header);
|
||||
Preconditions.IsNotNull(petId, "Required parameter: 'petId' is missing at 'DeletePet'");
|
||||
|
||||
await service.DeletePet(Context, petId, apiKey);
|
||||
return new Response { ContentType = "application/xml"};
|
||||
};
|
||||
|
||||
Get["/pet/findByStatus", true] = async (parameters, ct) =>
|
||||
{
|
||||
var status = Parameters.ValueOf<FindPetsByStatusStatusEnum?>(parameters, Context.Request, "status", ParameterType.Query);
|
||||
Preconditions.IsNotNull(status, "Required parameter: 'status' is missing at 'FindPetsByStatus'");
|
||||
|
||||
return await service.FindPetsByStatus(Context, status).ToArray();
|
||||
};
|
||||
|
||||
Get["/pet/findByTags", true] = async (parameters, ct) =>
|
||||
{
|
||||
var tags = Parameters.ValueOf<List<string>>(parameters, Context.Request, "tags", ParameterType.Query);
|
||||
Preconditions.IsNotNull(tags, "Required parameter: 'tags' is missing at 'FindPetsByTags'");
|
||||
|
||||
return await service.FindPetsByTags(Context, tags).ToArray();
|
||||
};
|
||||
|
||||
Get["/pet/{petId}", true] = async (parameters, ct) =>
|
||||
{
|
||||
var petId = Parameters.ValueOf<long?>(parameters, Context.Request, "petId", ParameterType.Path);
|
||||
Preconditions.IsNotNull(petId, "Required parameter: 'petId' is missing at 'GetPetById'");
|
||||
|
||||
return await service.GetPetById(Context, petId);
|
||||
};
|
||||
|
||||
Put["/pet", true] = async (parameters, ct) =>
|
||||
{
|
||||
var body = this.Bind<Pet>();
|
||||
Preconditions.IsNotNull(body, "Required parameter: 'body' is missing at 'UpdatePet'");
|
||||
|
||||
await service.UpdatePet(Context, body);
|
||||
return new Response { ContentType = "application/xml"};
|
||||
};
|
||||
|
||||
Post["/pet/{petId}", true] = async (parameters, ct) =>
|
||||
{
|
||||
var petId = Parameters.ValueOf<long?>(parameters, Context.Request, "petId", ParameterType.Path);
|
||||
var name = Parameters.ValueOf<string>(parameters, Context.Request, "name", ParameterType.Undefined);
|
||||
var status = Parameters.ValueOf<string>(parameters, Context.Request, "status", ParameterType.Undefined);
|
||||
Preconditions.IsNotNull(petId, "Required parameter: 'petId' is missing at 'UpdatePetWithForm'");
|
||||
|
||||
await service.UpdatePetWithForm(Context, petId, name, status);
|
||||
return new Response { ContentType = "application/xml"};
|
||||
};
|
||||
|
||||
Post["/pet/{petId}/uploadImage", true] = async (parameters, ct) =>
|
||||
{
|
||||
var petId = Parameters.ValueOf<long?>(parameters, Context.Request, "petId", ParameterType.Path);
|
||||
var additionalMetadata = Parameters.ValueOf<string>(parameters, Context.Request, "additionalMetadata", ParameterType.Undefined);
|
||||
var file = Parameters.ValueOf<System.IO.Stream>(parameters, Context.Request, "file", ParameterType.Undefined);
|
||||
Preconditions.IsNotNull(petId, "Required parameter: 'petId' is missing at 'UploadFile'");
|
||||
|
||||
return await service.UploadFile(Context, petId, additionalMetadata, file);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Service handling Pet requests.
|
||||
/// </summary>
|
||||
public interface PetService
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="body">Pet object that needs to be added to the store</param>
|
||||
/// <returns></returns>
|
||||
Task AddPet(NancyContext context, Pet body);
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="petId">Pet id to delete</param>
|
||||
/// <param name="apiKey"> (optional)</param>
|
||||
/// <returns></returns>
|
||||
Task DeletePet(NancyContext context, long? petId, string apiKey);
|
||||
|
||||
/// <summary>
|
||||
/// Multiple status values can be provided with comma separated strings
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="status">Status values that need to be considered for filter</param>
|
||||
/// <returns>List<Pet></returns>
|
||||
Task<List<Pet>> FindPetsByStatus(NancyContext context, FindPetsByStatusStatusEnum? status);
|
||||
|
||||
/// <summary>
|
||||
/// Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="tags">Tags to filter by</param>
|
||||
/// <returns>List<Pet></returns>
|
||||
Task<List<Pet>> FindPetsByTags(NancyContext context, List<string> tags);
|
||||
|
||||
/// <summary>
|
||||
/// Returns a single pet
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="petId">ID of pet to return</param>
|
||||
/// <returns>Pet</returns>
|
||||
Task<Pet> GetPetById(NancyContext context, long? petId);
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="body">Pet object that needs to be added to the store</param>
|
||||
/// <returns></returns>
|
||||
Task UpdatePet(NancyContext context, Pet body);
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="petId">ID of pet that needs to be updated</param>
|
||||
/// <param name="name">Updated name of the pet (optional)</param>
|
||||
/// <param name="status">Updated status of the pet (optional)</param>
|
||||
/// <returns></returns>
|
||||
Task UpdatePetWithForm(NancyContext context, long? petId, string name, string status);
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="petId">ID of pet to update</param>
|
||||
/// <param name="additionalMetadata">Additional data to pass to server (optional)</param>
|
||||
/// <param name="file">file to upload (optional)</param>
|
||||
/// <returns>ApiResponse</returns>
|
||||
Task<ApiResponse> UploadFile(NancyContext context, long? petId, string additionalMetadata, System.IO.Stream file);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Abstraction of PetService.
|
||||
/// </summary>
|
||||
public abstract class AbstractPetService: PetService
|
||||
{
|
||||
public virtual Task AddPet(NancyContext context, Pet body)
|
||||
{
|
||||
return AddPet(body);
|
||||
}
|
||||
|
||||
public virtual Task DeletePet(NancyContext context, long? petId, string apiKey)
|
||||
{
|
||||
return DeletePet(petId, apiKey);
|
||||
}
|
||||
|
||||
public virtual Task<List<Pet>> FindPetsByStatus(NancyContext context, FindPetsByStatusStatusEnum? status)
|
||||
{
|
||||
return FindPetsByStatus(status);
|
||||
}
|
||||
|
||||
public virtual Task<List<Pet>> FindPetsByTags(NancyContext context, List<string> tags)
|
||||
{
|
||||
return FindPetsByTags(tags);
|
||||
}
|
||||
|
||||
public virtual Task<Pet> GetPetById(NancyContext context, long? petId)
|
||||
{
|
||||
return GetPetById(petId);
|
||||
}
|
||||
|
||||
public virtual Task UpdatePet(NancyContext context, Pet body)
|
||||
{
|
||||
return UpdatePet(body);
|
||||
}
|
||||
|
||||
public virtual Task UpdatePetWithForm(NancyContext context, long? petId, string name, string status)
|
||||
{
|
||||
return UpdatePetWithForm(petId, name, status);
|
||||
}
|
||||
|
||||
public virtual Task<ApiResponse> UploadFile(NancyContext context, long? petId, string additionalMetadata, System.IO.Stream file)
|
||||
{
|
||||
return UploadFile(petId, additionalMetadata, file);
|
||||
}
|
||||
|
||||
protected abstract Task AddPet(Pet body);
|
||||
|
||||
protected abstract Task DeletePet(long? petId, string apiKey);
|
||||
|
||||
protected abstract Task<List<Pet>> FindPetsByStatus(FindPetsByStatusStatusEnum? status);
|
||||
|
||||
protected abstract Task<List<Pet>> FindPetsByTags(List<string> tags);
|
||||
|
||||
protected abstract Task<Pet> GetPetById(long? petId);
|
||||
|
||||
protected abstract Task UpdatePet(Pet body);
|
||||
|
||||
protected abstract Task UpdatePetWithForm(long? petId, string name, string status);
|
||||
|
||||
protected abstract Task<ApiResponse> UploadFile(long? petId, string additionalMetadata, System.IO.Stream file);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
using System;
|
||||
using Nancy;
|
||||
using Nancy.ModelBinding;
|
||||
using System.Collections.Generic;
|
||||
using Sharpility.Base;
|
||||
using IO.Swagger.v2.Models;
|
||||
using IO.Swagger.v2.Utils;
|
||||
using NodaTime;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IO.Swagger.v2.Modules
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Module processing requests of Store domain.
|
||||
/// </summary>
|
||||
public sealed class StoreModule : NancyModule
|
||||
{
|
||||
/// <summary>
|
||||
/// Sets up HTTP methods mappings.
|
||||
/// </summary>
|
||||
/// <param name="service">Service handling requests</param>
|
||||
public StoreModule(StoreService service) : base("/v2")
|
||||
{
|
||||
Delete["/store/order/{orderId}", true] = async (parameters, ct) =>
|
||||
{
|
||||
var orderId = Parameters.ValueOf<string>(parameters, Context.Request, "orderId", ParameterType.Path);
|
||||
Preconditions.IsNotNull(orderId, "Required parameter: 'orderId' is missing at 'DeleteOrder'");
|
||||
|
||||
await service.DeleteOrder(Context, orderId);
|
||||
return new Response { ContentType = "application/xml"};
|
||||
};
|
||||
|
||||
Get["/store/inventory", true] = async (parameters, ct) =>
|
||||
{
|
||||
|
||||
return await service.GetInventory(Context);
|
||||
};
|
||||
|
||||
Get["/store/order/{orderId}", true] = async (parameters, ct) =>
|
||||
{
|
||||
var orderId = Parameters.ValueOf<long?>(parameters, Context.Request, "orderId", ParameterType.Path);
|
||||
Preconditions.IsNotNull(orderId, "Required parameter: 'orderId' is missing at 'GetOrderById'");
|
||||
|
||||
return await service.GetOrderById(Context, orderId);
|
||||
};
|
||||
|
||||
Post["/store/order", true] = async (parameters, ct) =>
|
||||
{
|
||||
var body = this.Bind<Order>();
|
||||
Preconditions.IsNotNull(body, "Required parameter: 'body' is missing at 'PlaceOrder'");
|
||||
|
||||
return await service.PlaceOrder(Context, body);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Service handling Store requests.
|
||||
/// </summary>
|
||||
public interface StoreService
|
||||
{
|
||||
/// <summary>
|
||||
/// For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="orderId">ID of the order that needs to be deleted</param>
|
||||
/// <returns></returns>
|
||||
Task DeleteOrder(NancyContext context, string orderId);
|
||||
|
||||
/// <summary>
|
||||
/// Returns a map of status codes to quantities
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <returns>Dictionary<string, int?></returns>
|
||||
Task<Dictionary<string, int?>> GetInventory(NancyContext context);
|
||||
|
||||
/// <summary>
|
||||
/// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="orderId">ID of pet that needs to be fetched</param>
|
||||
/// <returns>Order</returns>
|
||||
Task<Order> GetOrderById(NancyContext context, long? orderId);
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="body">order placed for purchasing the pet</param>
|
||||
/// <returns>Order</returns>
|
||||
Task<Order> PlaceOrder(NancyContext context, Order body);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Abstraction of StoreService.
|
||||
/// </summary>
|
||||
public abstract class AbstractStoreService: StoreService
|
||||
{
|
||||
public virtual Task DeleteOrder(NancyContext context, string orderId)
|
||||
{
|
||||
return DeleteOrder(orderId);
|
||||
}
|
||||
|
||||
public virtual Task<Dictionary<string, int?>> GetInventory(NancyContext context)
|
||||
{
|
||||
return GetInventory();
|
||||
}
|
||||
|
||||
public virtual Task<Order> GetOrderById(NancyContext context, long? orderId)
|
||||
{
|
||||
return GetOrderById(orderId);
|
||||
}
|
||||
|
||||
public virtual Task<Order> PlaceOrder(NancyContext context, Order body)
|
||||
{
|
||||
return PlaceOrder(body);
|
||||
}
|
||||
|
||||
protected abstract Task DeleteOrder(string orderId);
|
||||
|
||||
protected abstract Task<Dictionary<string, int?>> GetInventory();
|
||||
|
||||
protected abstract Task<Order> GetOrderById(long? orderId);
|
||||
|
||||
protected abstract Task<Order> PlaceOrder(Order body);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,234 @@
|
||||
using System;
|
||||
using Nancy;
|
||||
using Nancy.ModelBinding;
|
||||
using System.Collections.Generic;
|
||||
using Sharpility.Base;
|
||||
using IO.Swagger.v2.Models;
|
||||
using IO.Swagger.v2.Utils;
|
||||
using NodaTime;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IO.Swagger.v2.Modules
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Module processing requests of User domain.
|
||||
/// </summary>
|
||||
public sealed class UserModule : NancyModule
|
||||
{
|
||||
/// <summary>
|
||||
/// Sets up HTTP methods mappings.
|
||||
/// </summary>
|
||||
/// <param name="service">Service handling requests</param>
|
||||
public UserModule(UserService service) : base("/v2")
|
||||
{
|
||||
Post["/user", true] = async (parameters, ct) =>
|
||||
{
|
||||
var body = this.Bind<User>();
|
||||
Preconditions.IsNotNull(body, "Required parameter: 'body' is missing at 'CreateUser'");
|
||||
|
||||
await service.CreateUser(Context, body);
|
||||
return new Response { ContentType = "application/xml"};
|
||||
};
|
||||
|
||||
Post["/user/createWithArray", true] = async (parameters, ct) =>
|
||||
{
|
||||
var body = this.Bind<List<User>>();
|
||||
Preconditions.IsNotNull(body, "Required parameter: 'body' is missing at 'CreateUsersWithArrayInput'");
|
||||
|
||||
await service.CreateUsersWithArrayInput(Context, body);
|
||||
return new Response { ContentType = "application/xml"};
|
||||
};
|
||||
|
||||
Post["/user/createWithList", true] = async (parameters, ct) =>
|
||||
{
|
||||
var body = this.Bind<List<User>>();
|
||||
Preconditions.IsNotNull(body, "Required parameter: 'body' is missing at 'CreateUsersWithListInput'");
|
||||
|
||||
await service.CreateUsersWithListInput(Context, body);
|
||||
return new Response { ContentType = "application/xml"};
|
||||
};
|
||||
|
||||
Delete["/user/{username}", true] = async (parameters, ct) =>
|
||||
{
|
||||
var username = Parameters.ValueOf<string>(parameters, Context.Request, "username", ParameterType.Path);
|
||||
Preconditions.IsNotNull(username, "Required parameter: 'username' is missing at 'DeleteUser'");
|
||||
|
||||
await service.DeleteUser(Context, username);
|
||||
return new Response { ContentType = "application/xml"};
|
||||
};
|
||||
|
||||
Get["/user/{username}", true] = async (parameters, ct) =>
|
||||
{
|
||||
var username = Parameters.ValueOf<string>(parameters, Context.Request, "username", ParameterType.Path);
|
||||
Preconditions.IsNotNull(username, "Required parameter: 'username' is missing at 'GetUserByName'");
|
||||
|
||||
return await service.GetUserByName(Context, username);
|
||||
};
|
||||
|
||||
Get["/user/login", true] = async (parameters, ct) =>
|
||||
{
|
||||
var username = Parameters.ValueOf<string>(parameters, Context.Request, "username", ParameterType.Query);
|
||||
var password = Parameters.ValueOf<string>(parameters, Context.Request, "password", ParameterType.Query);
|
||||
Preconditions.IsNotNull(username, "Required parameter: 'username' is missing at 'LoginUser'");
|
||||
|
||||
Preconditions.IsNotNull(password, "Required parameter: 'password' is missing at 'LoginUser'");
|
||||
|
||||
return await service.LoginUser(Context, username, password);
|
||||
};
|
||||
|
||||
Get["/user/logout", true] = async (parameters, ct) =>
|
||||
{
|
||||
|
||||
await service.LogoutUser(Context);
|
||||
return new Response { ContentType = "application/xml"};
|
||||
};
|
||||
|
||||
Put["/user/{username}", true] = async (parameters, ct) =>
|
||||
{
|
||||
var username = Parameters.ValueOf<string>(parameters, Context.Request, "username", ParameterType.Path);
|
||||
var body = this.Bind<User>();
|
||||
Preconditions.IsNotNull(username, "Required parameter: 'username' is missing at 'UpdateUser'");
|
||||
|
||||
Preconditions.IsNotNull(body, "Required parameter: 'body' is missing at 'UpdateUser'");
|
||||
|
||||
await service.UpdateUser(Context, username, body);
|
||||
return new Response { ContentType = "application/xml"};
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Service handling User requests.
|
||||
/// </summary>
|
||||
public interface UserService
|
||||
{
|
||||
/// <summary>
|
||||
/// This can only be done by the logged in user.
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="body">Created user object</param>
|
||||
/// <returns></returns>
|
||||
Task CreateUser(NancyContext context, User body);
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="body">List of user object</param>
|
||||
/// <returns></returns>
|
||||
Task CreateUsersWithArrayInput(NancyContext context, List<User> body);
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="body">List of user object</param>
|
||||
/// <returns></returns>
|
||||
Task CreateUsersWithListInput(NancyContext context, List<User> body);
|
||||
|
||||
/// <summary>
|
||||
/// This can only be done by the logged in user.
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="username">The name that needs to be deleted</param>
|
||||
/// <returns></returns>
|
||||
Task DeleteUser(NancyContext context, string username);
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="username">The name that needs to be fetched. Use user1 for testing. </param>
|
||||
/// <returns>User</returns>
|
||||
Task<User> GetUserByName(NancyContext context, string username);
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="username">The user name for login</param>
|
||||
/// <param name="password">The password for login in clear text</param>
|
||||
/// <returns>string</returns>
|
||||
Task<string> LoginUser(NancyContext context, string username, string password);
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <returns></returns>
|
||||
Task LogoutUser(NancyContext context);
|
||||
|
||||
/// <summary>
|
||||
/// This can only be done by the logged in user.
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
/// <param name="username">name that need to be deleted</param>
|
||||
/// <param name="body">Updated user object</param>
|
||||
/// <returns></returns>
|
||||
Task UpdateUser(NancyContext context, string username, User body);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Abstraction of UserService.
|
||||
/// </summary>
|
||||
public abstract class AbstractUserService: UserService
|
||||
{
|
||||
public virtual Task CreateUser(NancyContext context, User body)
|
||||
{
|
||||
return CreateUser(body);
|
||||
}
|
||||
|
||||
public virtual Task CreateUsersWithArrayInput(NancyContext context, List<User> body)
|
||||
{
|
||||
return CreateUsersWithArrayInput(body);
|
||||
}
|
||||
|
||||
public virtual Task CreateUsersWithListInput(NancyContext context, List<User> body)
|
||||
{
|
||||
return CreateUsersWithListInput(body);
|
||||
}
|
||||
|
||||
public virtual Task DeleteUser(NancyContext context, string username)
|
||||
{
|
||||
return DeleteUser(username);
|
||||
}
|
||||
|
||||
public virtual Task<User> GetUserByName(NancyContext context, string username)
|
||||
{
|
||||
return GetUserByName(username);
|
||||
}
|
||||
|
||||
public virtual Task<string> LoginUser(NancyContext context, string username, string password)
|
||||
{
|
||||
return LoginUser(username, password);
|
||||
}
|
||||
|
||||
public virtual Task LogoutUser(NancyContext context)
|
||||
{
|
||||
return LogoutUser();
|
||||
}
|
||||
|
||||
public virtual Task UpdateUser(NancyContext context, string username, User body)
|
||||
{
|
||||
return UpdateUser(username, body);
|
||||
}
|
||||
|
||||
protected abstract Task CreateUser(User body);
|
||||
|
||||
protected abstract Task CreateUsersWithArrayInput(List<User> body);
|
||||
|
||||
protected abstract Task CreateUsersWithListInput(List<User> body);
|
||||
|
||||
protected abstract Task DeleteUser(string username);
|
||||
|
||||
protected abstract Task<User> GetUserByName(string username);
|
||||
|
||||
protected abstract Task<string> LoginUser(string username, string password);
|
||||
|
||||
protected abstract Task LogoutUser();
|
||||
|
||||
protected abstract Task UpdateUser(string username, User body);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,443 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Immutable;
|
||||
using System.Linq;
|
||||
using Nancy;
|
||||
using NodaTime;
|
||||
using NodaTime.Text;
|
||||
using Sharpility.Base;
|
||||
using Sharpility.Extensions;
|
||||
using Sharpility.Util;
|
||||
|
||||
namespace IO.Swagger.v2.Utils
|
||||
{
|
||||
internal static class Parameters
|
||||
{
|
||||
private static readonly IDictionary<Type, Func<Parameter, object>> Parsers = CreateParsers();
|
||||
|
||||
internal static TValue ValueOf<TValue>(dynamic parameters, Request request, string name, ParameterType parameterType)
|
||||
{
|
||||
var valueType = typeof(TValue);
|
||||
var valueUnderlyingType = Nullable.GetUnderlyingType(valueType);
|
||||
var isNullable = default(TValue) == null;
|
||||
string value = RawValueOf(parameters, request, name, parameterType);
|
||||
Preconditions.Evaluate(!string.IsNullOrEmpty(value) || isNullable, string.Format("Required parameter: '{0}' is missing", name));
|
||||
if (value == null && isNullable)
|
||||
{
|
||||
return default(TValue);
|
||||
}
|
||||
if (valueType.IsEnum || (valueUnderlyingType != null && valueUnderlyingType.IsEnum))
|
||||
{
|
||||
return EnumValueOf<TValue>(name, value);
|
||||
}
|
||||
return ValueOf<TValue>(parameters, name, value, valueType, request, parameterType);
|
||||
}
|
||||
|
||||
private static string RawValueOf(dynamic parameters, Request request, string name, ParameterType parameterType)
|
||||
{
|
||||
try
|
||||
{
|
||||
switch (parameterType)
|
||||
{
|
||||
case ParameterType.Query:
|
||||
string querValue = request.Query[name];
|
||||
return querValue;
|
||||
case ParameterType.Path:
|
||||
string pathValue = parameters[name];
|
||||
return pathValue;
|
||||
case ParameterType.Header:
|
||||
var headerValue = request.Headers[name];
|
||||
return headerValue != null ? string.Join(",", headerValue) : null;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new InvalidOperationException(string.Format("Could not obtain value of '{0}' parameter", name), e);
|
||||
}
|
||||
throw new InvalidOperationException(string.Format("Parameter with type: {0} is not supported", parameterType));
|
||||
}
|
||||
|
||||
private static TValue EnumValueOf<TValue>(string name, string value)
|
||||
{
|
||||
var valueType = typeof(TValue);
|
||||
var enumType = valueType.IsEnum ? valueType : Nullable.GetUnderlyingType(valueType);
|
||||
Preconditions.IsNotNull(enumType, () => new InvalidOperationException(
|
||||
string.Format("Could not parse parameter: '{0}' to enum. Type {1} is not enum", name, valueType)));
|
||||
var values = Enum.GetValues(enumType);
|
||||
foreach (var entry in values)
|
||||
{
|
||||
if (entry.ToString().EqualsIgnoreCases(value)
|
||||
|| ((int)entry).ToString().EqualsIgnoreCases(value))
|
||||
{
|
||||
return (TValue)entry;
|
||||
}
|
||||
}
|
||||
throw new ArgumentException(string.Format("Parameter: '{0}' value: '{1}' is not supported. Expected one of: {2}",
|
||||
name, value, Strings.ToString(values)));
|
||||
}
|
||||
|
||||
private static TValue ValueOf<TValue>(dynamic parameters, string name, string value, Type valueType, Request request, ParameterType parameterType)
|
||||
{
|
||||
var parser = Parsers.GetIfPresent(valueType);
|
||||
if (parser != null)
|
||||
{
|
||||
return ParseValueUsing<TValue>(name, value, valueType, parser);
|
||||
}
|
||||
if (parameterType == ParameterType.Path)
|
||||
{
|
||||
return DynamicValueOf<TValue>(parameters, name);
|
||||
}
|
||||
if (parameterType == ParameterType.Query)
|
||||
{
|
||||
return DynamicValueOf<TValue>(request.Query, name);
|
||||
}
|
||||
throw new InvalidOperationException(string.Format("Could not get value for {0} with type {1}", name, valueType));
|
||||
}
|
||||
|
||||
private static TValue ParseValueUsing<TValue>(string name, string value, Type valueType, Func<Parameter, object> parser)
|
||||
{
|
||||
var result = parser(Parameter.Of(name, value));
|
||||
try
|
||||
{
|
||||
return (TValue)result;
|
||||
}
|
||||
catch (InvalidCastException)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
string.Format("Could not parse parameter: '{0}' with value: '{1}'. " +
|
||||
"Received: '{2}', expected: '{3}'.",
|
||||
name, value, result.GetType(), valueType));
|
||||
}
|
||||
}
|
||||
|
||||
private static TValue DynamicValueOf<TValue>(dynamic parameters, string name)
|
||||
{
|
||||
string value = parameters[name];
|
||||
try
|
||||
{
|
||||
TValue result = parameters[name];
|
||||
return result;
|
||||
}
|
||||
catch (InvalidCastException)
|
||||
{
|
||||
throw new InvalidOperationException(Strings.Format("Parameter: '{0}' value: '{1}' could not be parsed. " +
|
||||
"Expected type: '{2}' is not supported",
|
||||
name, value, typeof(TValue)));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new InvalidOperationException(string.Format("Could not get '{0}' value of '{1}' type dynamicly",
|
||||
name, typeof(TValue)), e);
|
||||
}
|
||||
}
|
||||
|
||||
private static IDictionary<Type, Func<Parameter, object>> CreateParsers()
|
||||
{
|
||||
var parsers = ImmutableDictionary.CreateBuilder<Type, Func<Parameter, object>>();
|
||||
parsers.Put(typeof(string), value => value.Value);
|
||||
parsers.Put(typeof(bool), SafeParse(bool.Parse));
|
||||
parsers.Put(typeof(bool?), SafeParse(bool.Parse));
|
||||
parsers.Put(typeof(byte), SafeParse(byte.Parse));
|
||||
parsers.Put(typeof(sbyte?), SafeParse(sbyte.Parse));
|
||||
parsers.Put(typeof(short), SafeParse(short.Parse));
|
||||
parsers.Put(typeof(short?), SafeParse(short.Parse));
|
||||
parsers.Put(typeof(ushort), SafeParse(ushort.Parse));
|
||||
parsers.Put(typeof(ushort?), SafeParse(ushort.Parse));
|
||||
parsers.Put(typeof(int), SafeParse(int.Parse));
|
||||
parsers.Put(typeof(int?), SafeParse(int.Parse));
|
||||
parsers.Put(typeof(uint), SafeParse(uint.Parse));
|
||||
parsers.Put(typeof(uint?), SafeParse(uint.Parse));
|
||||
parsers.Put(typeof(long), SafeParse(long.Parse));
|
||||
parsers.Put(typeof(long?), SafeParse(long.Parse));
|
||||
parsers.Put(typeof(ulong), SafeParse(ulong.Parse));
|
||||
parsers.Put(typeof(ulong?), SafeParse(ulong.Parse));
|
||||
parsers.Put(typeof(float), SafeParse(float.Parse));
|
||||
parsers.Put(typeof(float?), SafeParse(float.Parse));
|
||||
parsers.Put(typeof(double), SafeParse(double.Parse));
|
||||
parsers.Put(typeof(double?), SafeParse(double.Parse));
|
||||
parsers.Put(typeof(decimal), SafeParse(decimal.Parse));
|
||||
parsers.Put(typeof(decimal?), SafeParse(decimal.Parse));
|
||||
parsers.Put(typeof(DateTime), SafeParse(DateTime.Parse));
|
||||
parsers.Put(typeof(DateTime?), SafeParse(DateTime.Parse));
|
||||
parsers.Put(typeof(TimeSpan), SafeParse(TimeSpan.Parse));
|
||||
parsers.Put(typeof(TimeSpan?), SafeParse(TimeSpan.Parse));
|
||||
parsers.Put(typeof(ZonedDateTime), SafeParse(ParseZonedDateTime));
|
||||
parsers.Put(typeof(ZonedDateTime?), SafeParse(ParseZonedDateTime));
|
||||
parsers.Put(typeof(LocalTime), SafeParse(ParseLocalTime));
|
||||
parsers.Put(typeof(LocalTime?), SafeParse(ParseLocalTime));
|
||||
|
||||
parsers.Put(typeof(IEnumerable<string>), ImmutableListParse(value => value));
|
||||
parsers.Put(typeof(ICollection<string>), ImmutableListParse(value => value));
|
||||
parsers.Put(typeof(IList<string>), ImmutableListParse(value => value));
|
||||
parsers.Put(typeof(List<string>), ListParse(value => value));
|
||||
parsers.Put(typeof(ISet<string>), ImmutableListParse(value => value));
|
||||
parsers.Put(typeof(HashSet<string>), SetParse(value => value));
|
||||
|
||||
parsers.Put(typeof(IEnumerable<bool?>), NullableImmutableListParse(bool.Parse));
|
||||
parsers.Put(typeof(ICollection<bool?>), NullableImmutableListParse(bool.Parse));
|
||||
parsers.Put(typeof(IList<bool?>), NullableImmutableListParse(bool.Parse));
|
||||
parsers.Put(typeof(List<bool?>), NullableListParse(bool.Parse));
|
||||
parsers.Put(typeof(ISet<bool?>), NullableImmutableSetParse(bool.Parse));
|
||||
parsers.Put(typeof(HashSet<bool?>), NullableSetParse(bool.Parse));
|
||||
|
||||
parsers.Put(typeof(IEnumerable<byte>), ImmutableListParse(byte.Parse));
|
||||
parsers.Put(typeof(ICollection<byte>), ImmutableListParse(byte.Parse));
|
||||
parsers.Put(typeof(IList<byte>), ImmutableListParse(byte.Parse));
|
||||
parsers.Put(typeof(List<byte>), ListParse(byte.Parse));
|
||||
parsers.Put(typeof(ISet<byte>), ImmutableSetParse(byte.Parse));
|
||||
parsers.Put(typeof(HashSet<byte>), SetParse(byte.Parse));
|
||||
|
||||
parsers.Put(typeof(IEnumerable<sbyte>), ImmutableListParse(sbyte.Parse));
|
||||
parsers.Put(typeof(ICollection<sbyte>), ImmutableListParse(sbyte.Parse));
|
||||
parsers.Put(typeof(IList<sbyte>), ImmutableListParse(sbyte.Parse));
|
||||
parsers.Put(typeof(List<sbyte>), ListParse(sbyte.Parse));
|
||||
parsers.Put(typeof(ISet<sbyte>), ImmutableSetParse(sbyte.Parse));
|
||||
parsers.Put(typeof(HashSet<sbyte>), SetParse(sbyte.Parse));
|
||||
|
||||
parsers.Put(typeof(IEnumerable<short>), ImmutableListParse(short.Parse));
|
||||
parsers.Put(typeof(ICollection<short>), ImmutableListParse(short.Parse));
|
||||
parsers.Put(typeof(IList<short>), ImmutableListParse(short.Parse));
|
||||
parsers.Put(typeof(List<short>), ListParse(short.Parse));
|
||||
parsers.Put(typeof(ISet<short>), ImmutableSetParse(short.Parse));
|
||||
parsers.Put(typeof(HashSet<short>), SetParse(short.Parse));
|
||||
|
||||
parsers.Put(typeof(IEnumerable<ushort>), ImmutableListParse(ushort.Parse));
|
||||
parsers.Put(typeof(ICollection<ushort>), ImmutableListParse(ushort.Parse));
|
||||
parsers.Put(typeof(IList<ushort>), ImmutableListParse(ushort.Parse));
|
||||
parsers.Put(typeof(List<ushort>), ListParse(ushort.Parse));
|
||||
parsers.Put(typeof(ISet<ushort>), ImmutableSetParse(ushort.Parse));
|
||||
parsers.Put(typeof(HashSet<ushort>), SetParse(ushort.Parse));
|
||||
|
||||
parsers.Put(typeof(IEnumerable<int?>), NullableImmutableListParse(int.Parse));
|
||||
parsers.Put(typeof(ICollection<int?>), NullableImmutableListParse(int.Parse));
|
||||
parsers.Put(typeof(IList<int?>), NullableImmutableListParse(int.Parse));
|
||||
parsers.Put(typeof(List<int?>), NullableListParse(int.Parse));
|
||||
parsers.Put(typeof(ISet<int?>), NullableImmutableSetParse(int.Parse));
|
||||
parsers.Put(typeof(HashSet<int?>), NullableSetParse(int.Parse));
|
||||
|
||||
parsers.Put(typeof(IEnumerable<uint>), ImmutableListParse(uint.Parse));
|
||||
parsers.Put(typeof(ICollection<uint>), ImmutableListParse(uint.Parse));
|
||||
parsers.Put(typeof(IList<uint>), ImmutableListParse(uint.Parse));
|
||||
parsers.Put(typeof(List<uint>), ListParse(uint.Parse));
|
||||
parsers.Put(typeof(ISet<uint>), ImmutableSetParse(uint.Parse));
|
||||
parsers.Put(typeof(HashSet<uint>), SetParse(uint.Parse));
|
||||
|
||||
parsers.Put(typeof(IEnumerable<long?>), NullableImmutableListParse(long.Parse));
|
||||
parsers.Put(typeof(ICollection<long?>), NullableImmutableListParse(long.Parse));
|
||||
parsers.Put(typeof(IList<long?>), NullableImmutableListParse(long.Parse));
|
||||
parsers.Put(typeof(List<long?>), NullableListParse(long.Parse));
|
||||
parsers.Put(typeof(ISet<long?>), NullableImmutableSetParse(long.Parse));
|
||||
parsers.Put(typeof(HashSet<long?>), NullableSetParse(long.Parse));
|
||||
|
||||
parsers.Put(typeof(IEnumerable<ulong>), ImmutableListParse(ulong.Parse));
|
||||
parsers.Put(typeof(ICollection<ulong>), ImmutableListParse(ulong.Parse));
|
||||
parsers.Put(typeof(IList<ulong>), ImmutableListParse(ulong.Parse));
|
||||
parsers.Put(typeof(List<ulong>), ListParse(ulong.Parse));
|
||||
parsers.Put(typeof(ISet<ulong>), ImmutableSetParse(ulong.Parse));
|
||||
parsers.Put(typeof(HashSet<ulong>), SetParse(ulong.Parse));
|
||||
|
||||
parsers.Put(typeof(IEnumerable<float?>), NullableImmutableListParse(float.Parse));
|
||||
parsers.Put(typeof(ICollection<float?>), NullableImmutableListParse(float.Parse));
|
||||
parsers.Put(typeof(IList<float?>), NullableImmutableListParse(float.Parse));
|
||||
parsers.Put(typeof(List<float?>), NullableListParse(float.Parse));
|
||||
parsers.Put(typeof(ISet<float?>), NullableImmutableSetParse(float.Parse));
|
||||
parsers.Put(typeof(HashSet<float?>), NullableSetParse(float.Parse));
|
||||
|
||||
parsers.Put(typeof(IEnumerable<double?>), NullableImmutableListParse(double.Parse));
|
||||
parsers.Put(typeof(ICollection<double?>), NullableImmutableListParse(double.Parse));
|
||||
parsers.Put(typeof(IList<double?>), NullableImmutableListParse(double.Parse));
|
||||
parsers.Put(typeof(List<double?>), NullableListParse(double.Parse));
|
||||
parsers.Put(typeof(ISet<double?>), NullableImmutableSetParse(double.Parse));
|
||||
parsers.Put(typeof(HashSet<double?>), NullableSetParse(double.Parse));
|
||||
|
||||
parsers.Put(typeof(IEnumerable<decimal?>), NullableImmutableListParse(decimal.Parse));
|
||||
parsers.Put(typeof(ICollection<decimal?>), NullableImmutableListParse(decimal.Parse));
|
||||
parsers.Put(typeof(IList<decimal?>), NullableImmutableListParse(decimal.Parse));
|
||||
parsers.Put(typeof(List<decimal?>), NullableListParse(decimal.Parse));
|
||||
parsers.Put(typeof(ISet<decimal?>), NullableImmutableSetParse(decimal.Parse));
|
||||
parsers.Put(typeof(HashSet<decimal?>), NullableSetParse(decimal.Parse));
|
||||
|
||||
parsers.Put(typeof(IEnumerable<DateTime?>), NullableImmutableListParse(DateTime.Parse));
|
||||
parsers.Put(typeof(ICollection<DateTime?>), NullableImmutableListParse(DateTime.Parse));
|
||||
parsers.Put(typeof(IList<DateTime?>), NullableImmutableListParse(DateTime.Parse));
|
||||
parsers.Put(typeof(List<DateTime?>), NullableListParse(DateTime.Parse));
|
||||
parsers.Put(typeof(ISet<DateTime?>), NullableImmutableSetParse(DateTime.Parse));
|
||||
parsers.Put(typeof(HashSet<DateTime?>), NullableSetParse(DateTime.Parse));
|
||||
|
||||
parsers.Put(typeof(IEnumerable<TimeSpan>), ImmutableListParse(TimeSpan.Parse));
|
||||
parsers.Put(typeof(ICollection<TimeSpan>), ImmutableListParse(TimeSpan.Parse));
|
||||
parsers.Put(typeof(IList<TimeSpan>), ImmutableListParse(TimeSpan.Parse));
|
||||
parsers.Put(typeof(List<TimeSpan>), ListParse(TimeSpan.Parse));
|
||||
parsers.Put(typeof(ISet<TimeSpan>), ImmutableSetParse(TimeSpan.Parse));
|
||||
parsers.Put(typeof(HashSet<TimeSpan>), SetParse(TimeSpan.Parse));
|
||||
|
||||
return parsers.ToImmutableDictionary();
|
||||
}
|
||||
|
||||
private static Func<Parameter, object> SafeParse<T>(Func<string, T> parse)
|
||||
{
|
||||
return parameter =>
|
||||
{
|
||||
try
|
||||
{
|
||||
return parse(parameter.Value);
|
||||
}
|
||||
catch (OverflowException)
|
||||
{
|
||||
throw ParameterOutOfRange(parameter, typeof(T));
|
||||
}
|
||||
catch (FormatException)
|
||||
{
|
||||
throw InvalidParameterFormat(parameter, typeof(T));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new InvalidOperationException(Strings.Format("Unable to parse parameter: '{0}' with value: '{1}' to {2}",
|
||||
parameter.Name, parameter.Value, typeof(T)), e);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private static Func<Parameter, object> NullableListParse<T>(Func<string, T> itemParser) where T: struct
|
||||
{
|
||||
return ListParse(it => it.ToNullable(itemParser));
|
||||
}
|
||||
|
||||
private static Func<Parameter, object> ListParse<T>(Func<string, T> itemParser)
|
||||
{
|
||||
return parameter =>
|
||||
{
|
||||
if (string.IsNullOrEmpty(parameter.Value))
|
||||
{
|
||||
return new List<T>();
|
||||
}
|
||||
return ParseCollection(parameter.Value, itemParser).ToList();
|
||||
};
|
||||
}
|
||||
|
||||
private static Func<Parameter, object> NullableImmutableListParse<T>(Func<string, T> itemParser) where T: struct
|
||||
{
|
||||
return ImmutableListParse(it => it.ToNullable(itemParser));
|
||||
}
|
||||
|
||||
private static Func<Parameter, object> ImmutableListParse<T>(Func<string, T> itemParser)
|
||||
{
|
||||
return parameter =>
|
||||
{
|
||||
if (string.IsNullOrEmpty(parameter.Value))
|
||||
{
|
||||
return Lists.EmptyList<T>();
|
||||
}
|
||||
return ParseCollection(parameter.Value, itemParser).ToImmutableList();
|
||||
};
|
||||
}
|
||||
|
||||
private static Func<Parameter, object> NullableSetParse<T>(Func<string, T> itemParser) where T: struct
|
||||
{
|
||||
return SetParse(it => it.ToNullable(itemParser));
|
||||
}
|
||||
|
||||
private static Func<Parameter, object> SetParse<T>(Func<string, T> itemParser)
|
||||
{
|
||||
return parameter =>
|
||||
{
|
||||
if (string.IsNullOrEmpty(parameter.Value))
|
||||
{
|
||||
return new HashSet<T>();
|
||||
}
|
||||
return ParseCollection(parameter.Value, itemParser).ToSet();
|
||||
};
|
||||
}
|
||||
|
||||
private static Func<Parameter, object> NullableImmutableSetParse<T>(Func<string, T> itemParser) where T: struct
|
||||
{
|
||||
return ImmutableSetParse(it => it.ToNullable(itemParser));
|
||||
}
|
||||
|
||||
private static Func<Parameter, object> ImmutableSetParse<T>(Func<string, T> itemParser)
|
||||
{
|
||||
return parameter =>
|
||||
{
|
||||
if (string.IsNullOrEmpty(parameter.Value))
|
||||
{
|
||||
return Sets.EmptySet<T>();
|
||||
}
|
||||
return ParseCollection(parameter.Value, itemParser).ToImmutableHashSet();
|
||||
};
|
||||
}
|
||||
|
||||
private static ZonedDateTime ParseZonedDateTime(string value)
|
||||
{
|
||||
var dateTime = DateTime.Parse(value);
|
||||
return new ZonedDateTime(Instant.FromDateTimeUtc(dateTime.ToUniversalTime()), DateTimeZone.Utc);
|
||||
}
|
||||
|
||||
private static LocalTime ParseLocalTime(string value)
|
||||
{
|
||||
return LocalTimePattern.ExtendedIsoPattern.Parse(value).Value;
|
||||
}
|
||||
|
||||
private static ArgumentException ParameterOutOfRange(Parameter parameter, Type type)
|
||||
{
|
||||
return new ArgumentException(Strings.Format("Query: '{0}' value: '{1}' is out of range for: '{2}'",
|
||||
parameter.Name, parameter.Value, type));
|
||||
}
|
||||
|
||||
private static ArgumentException InvalidParameterFormat(Parameter parameter, Type type)
|
||||
{
|
||||
return new ArgumentException(Strings.Format("Query '{0}' value: '{1}' format is invalid for: '{2}'",
|
||||
parameter.Name, parameter.Value, type));
|
||||
}
|
||||
|
||||
private static IEnumerable<T> ParseCollection<T>(string value, Func<string, T> itemParser)
|
||||
{
|
||||
var results = value.Split(new[] { ',' }, StringSplitOptions.None)
|
||||
.Where(it => it != null)
|
||||
.Select(it => it.Trim())
|
||||
.Select(itemParser);
|
||||
return results;
|
||||
}
|
||||
|
||||
public static T? ToNullable<T>(this string s, Func<string, T> 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; }
|
||||
internal string Value { get; private set; }
|
||||
|
||||
private Parameter(string name, string value)
|
||||
{
|
||||
Name = name;
|
||||
Value = value;
|
||||
}
|
||||
|
||||
internal static Parameter Of(string name, string value)
|
||||
{
|
||||
return new Parameter(name, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal enum ParameterType
|
||||
{
|
||||
Undefined,
|
||||
Query,
|
||||
Path,
|
||||
Header
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Nancy" version="1.4.3" targetFramework="net45" />
|
||||
<package id="NodaTime" version="1.3.1" targetFramework="net45" />
|
||||
<package id="Sharpility" version="1.2.2" targetFramework="net45" />
|
||||
<package id="System.Collections.Immutable" version="1.1.37" targetFramework="net45" />
|
||||
</packages>
|
||||
@@ -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", "{19B8107D-38E2-4D32-B74F-C45470A9FCA3}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IO.Swagger", "src\IO.Swagger\IO.Swagger.csproj", "{768B8DC6-54EE-4D40-9B20-7857E1D742A4}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
@@ -10,10 +10,10 @@ Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{DFBD27E3-36EF-45CB-9D6D-EF500915B5CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{DFBD27E3-36EF-45CB-9D6D-EF500915B5CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{DFBD27E3-36EF-45CB-9D6D-EF500915B5CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{DFBD27E3-36EF-45CB-9D6D-EF500915B5CF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{768B8DC6-54EE-4D40-9B20-7857E1D742A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{768B8DC6-54EE-4D40-9B20-7857E1D742A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{768B8DC6-54EE-4D40-9B20-7857E1D742A4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{768B8DC6-54EE-4D40-9B20-7857E1D742A4}.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
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{19B8107D-38E2-4D32-B74F-C45470A9FCA3}</ProjectGuid>
|
||||
<ProjectGuid>{768B8DC6-54EE-4D40-9B20-7857E1D742A4}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>IO.Swagger.v2</RootNamespace>
|
||||
|
||||
Reference in New Issue
Block a user