mirror of
https://github.com/OpenAPITools/openapi-generator.git
synced 2025-05-12 20:50:55 +00:00
[csharp-nancyfx] Delete NancyFX (#11438)
* removed all nancyfx references * didnt save one file * removed two more nancyfx files
This commit is contained in:
parent
9e1972bb1d
commit
8ecd619eb3
@ -62,7 +62,7 @@ OpenAPI Generator allows generation of API client libraries (SDK generation), se
|
||||
| | Languages/Frameworks |
|
||||
| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **API clients** | **ActionScript**, **Ada**, **Apex**, **Bash**, **C**, **C#** (.net 2.0, 3.5 or later, .NET Standard 1.3 - 2.1, .NET Core 3.1, .NET 5.0. Libraries: RestSharp, GenericHost, HttpClient), **C++** (Arduino, cpp-restsdk, Qt5, Tizen, Unreal Engine 4), **Clojure**, **Crystal**, **Dart**, **Elixir**, **Elm**, **Eiffel**, **Erlang**, **Go**, **Groovy**, **Haskell** (http-client, Servant), **Java** (Apache HttpClient, Jersey1.x, Jersey2.x, OkHttp, Retrofit1.x, Retrofit2.x, Feign, RestTemplate, RESTEasy, Vertx, Google API Client Library for Java, Rest-assured, Spring 5 Web Client, MicroProfile Rest Client), **k6**, **Kotlin**, **Lua**, **Nim**, **Node.js/JavaScript** (ES5, ES6, AngularJS with Google Closure Compiler annotations, Flow types, Apollo GraphQL DataStore), **Objective-C**, **OCaml**, **Perl**, **PHP**, **PowerShell**, **Python**, **R**, **Ruby**, **Rust** (hyper, reqwest, rust-server), **Scala** (akka, http4s, scalaz, sttp, swagger-async-httpclient), **Swift** (2.x, 3.x, 4.x, 5.x), **Typescript** (AngularJS, Angular (2.x - 11.x), Aurelia, Axios, Fetch, Inversify, jQuery, Nestjs, Node, redux-query, Rxjs) |
|
||||
| **Server stubs** | **Ada**, **C#** (ASP.NET Core, NancyFx, Azure Functions), **C++** (Pistache, Restbed, Qt5 QHTTPEngine), **Erlang**, **F#** (Giraffe), **Go** (net/http, Gin, Echo), **Haskell** (Servant, Yesod), **Java** (MSF4J, Spring, Undertow, JAX-RS: CDI, CXF, Inflector, Jersey, RestEasy, Play Framework, [PKMST](https://github.com/ProKarma-Inc/pkmst-getting-started-examples), [Vert.x](https://vertx.io/), [Apache Camel](https://camel.apache.org/)), **Kotlin** (Spring Boot, Ktor, Vertx), **PHP** (Laravel, Lumen, [Mezzio (fka Zend Expressive)](https://github.com/mezzio/mezzio), Slim, Silex, [Symfony](https://symfony.com/)), **Python** (FastAPI, Flask), **NodeJS**, **Ruby** (Sinatra, Rails5), **Rust** (rust-server), **Scala** (Akka, [Finch](https://github.com/finagle/finch), [Lagom](https://github.com/lagom/lagom), [Play](https://www.playframework.com/), Scalatra) |
|
||||
| **Server stubs** | **Ada**, **C#** (ASP.NET Core, Azure Functions), **C++** (Pistache, Restbed, Qt5 QHTTPEngine), **Erlang**, **F#** (Giraffe), **Go** (net/http, Gin, Echo), **Haskell** (Servant, Yesod), **Java** (MSF4J, Spring, Undertow, JAX-RS: CDI, CXF, Inflector, Jersey, RestEasy, Play Framework, [PKMST](https://github.com/ProKarma-Inc/pkmst-getting-started-examples), [Vert.x](https://vertx.io/), [Apache Camel](https://camel.apache.org/)), **Kotlin** (Spring Boot, Ktor, Vertx), **PHP** (Laravel, Lumen, [Mezzio (fka Zend Expressive)](https://github.com/mezzio/mezzio), Slim, Silex, [Symfony](https://symfony.com/)), **Python** (FastAPI, Flask), **NodeJS**, **Ruby** (Sinatra, Rails5), **Rust** (rust-server), **Scala** (Akka, [Finch](https://github.com/finagle/finch), [Lagom](https://github.com/lagom/lagom), [Play](https://www.playframework.com/), Scalatra) |
|
||||
| **API documentation generators** | **HTML**, **Confluence Wiki**, **Asciidoc**, **Markdown**, **PlantUML** |
|
||||
| **Configuration files** | [**Apache2**](https://httpd.apache.org/) |
|
||||
| **Others** | **GraphQL**, **JMeter**, **Ktorm**, **MySQL Schema**, **Protocol Buffer**, **WSDL** |
|
||||
@ -949,7 +949,6 @@ Here is a list of template creators:
|
||||
* C# ASP.NET Core 3.0: @A-Joshi
|
||||
* C# APS.NET Core 3.1: @phatcher
|
||||
* C# Azure functions: @Abrhm7786
|
||||
* C# NancyFX: @mstefaniuk
|
||||
* C++ (Qt5 QHttpEngine): @etherealjoy
|
||||
* C++ Pistache: @sebymiano
|
||||
* C++ Restbed: @stkrwork
|
||||
|
@ -5,7 +5,7 @@ title: "FAQ: Generators"
|
||||
|
||||
### What are some server generator use cases?
|
||||
|
||||
We have around 40+ server generators, with more added regularly. Some of these include Spring in your choice of Java or Kotlin, the Finch and Scalatra frameworks using Scala, and C# generators for NancyFX and WebAPI (to name only a few).
|
||||
We have around 40+ server generators, with more added regularly. Some of these include Spring in your choice of Java or Kotlin, the Finch and Scalatra frameworks using Scala, and C# generators for ASP.NET and Azure Functions (to name only a few).
|
||||
|
||||
Besides generating the server code as a starting point to implement the API backend, here are some use cases of the server generators:
|
||||
|
||||
|
@ -82,7 +82,6 @@ The following generators are available:
|
||||
* [cpp-pistache-server](generators/cpp-pistache-server.md)
|
||||
* [cpp-qt-qhttpengine-server](generators/cpp-qt-qhttpengine-server.md)
|
||||
* [cpp-restbed-server](generators/cpp-restbed-server.md)
|
||||
* [csharp-nancyfx-deprecated (deprecated)](generators/csharp-nancyfx-deprecated.md)
|
||||
* [csharp-netcore-functions (beta)](generators/csharp-netcore-functions.md)
|
||||
* [erlang-server](generators/erlang-server.md)
|
||||
* [fsharp-functions (beta)](generators/fsharp-functions.md)
|
||||
|
@ -67,7 +67,6 @@ The following generators are available:
|
||||
* [cpp-pistache-server](cpp-pistache-server.md)
|
||||
* [cpp-qt5-qhttpengine-server](cpp-qt5-qhttpengine-server.md)
|
||||
* [cpp-restbed-server](cpp-restbed-server.md)
|
||||
* [csharp-nancyfx](csharp-nancyfx.md)
|
||||
* [erlang-server](erlang-server.md)
|
||||
* [fsharp-functions (beta)](fsharp-functions.md)
|
||||
* [fsharp-giraffe-server (beta)](fsharp-giraffe-server.md)
|
||||
|
@ -1,209 +0,0 @@
|
||||
---
|
||||
title: Documentation for the csharp-nancyfx-deprecated Generator
|
||||
---
|
||||
|
||||
## METADATA
|
||||
|
||||
| Property | Value | Notes |
|
||||
| -------- | ----- | ----- |
|
||||
| generator name | csharp-nancyfx-deprecated | pass this to the generate command after -g |
|
||||
| generator stability | DEPRECATED | |
|
||||
| generator type | SERVER | |
|
||||
| generator language | C# | |
|
||||
| generator default templating engine | mustache | |
|
||||
| helpTxt | Generates a C# NancyFX Web API server (deprecated). | |
|
||||
|
||||
## CONFIG OPTIONS
|
||||
These options may be applied as additional-properties (cli) or configOptions (plugins). Refer to [configuration docs](https://openapi-generator.tech/docs/configuration) for more details.
|
||||
|
||||
| Option | Description | Values | Default |
|
||||
| ------ | ----------- | ------ | ------- |
|
||||
|asyncServer|Set to true to enable the generation of async routes/endpoints.| |false|
|
||||
|immutable|Enabled by default. If disabled generates model classes with setters| |true|
|
||||
|interfacePrefix|Prefix interfaces with a community standard or widely accepted prefix.| ||
|
||||
|optionalProjectFile|Generate {PackageName}.csproj.| |true|
|
||||
|packageContext|Optionally overrides the PackageContext which determines the namespace (namespace=packageName.packageContext). If not set, packageContext will default to basePath.| |null|
|
||||
|packageGuid|The GUID that will be associated with the C# project| |null|
|
||||
|packageName|C# package name (convention: Title.Case).| |Org.OpenAPITools|
|
||||
|packageVersion|C# package version.| |1.0.0|
|
||||
|returnICollection|Return ICollection<T> instead of the concrete type.| |false|
|
||||
|sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true|
|
||||
|sourceFolder|source folder for generated code| |src|
|
||||
|useCollection|Deserialize array types to Collection<T> instead of List<T>.| |false|
|
||||
|useDateTimeOffset|Use DateTimeOffset to model date-time properties| |false|
|
||||
|writeModulePath|Enabled by default. If disabled, module paths will not mirror api base path| |true|
|
||||
|
||||
## IMPORT MAPPING
|
||||
|
||||
| Type/Alias | Imports |
|
||||
| ---------- | ------- |
|
||||
|
||||
|
||||
## INSTANTIATION TYPES
|
||||
|
||||
| Type/Alias | Instantiated By |
|
||||
| ---------- | --------------- |
|
||||
|array|List|
|
||||
|list|List|
|
||||
|map|Dictionary|
|
||||
|
||||
|
||||
## LANGUAGE PRIMITIVES
|
||||
|
||||
<ul class="column-ul">
|
||||
<li>Boolean</li>
|
||||
<li>Collection</li>
|
||||
<li>DateTime</li>
|
||||
<li>DateTime?</li>
|
||||
<li>DateTimeOffset</li>
|
||||
<li>DateTimeOffset?</li>
|
||||
<li>Decimal</li>
|
||||
<li>Dictionary</li>
|
||||
<li>Double</li>
|
||||
<li>Float</li>
|
||||
<li>Guid</li>
|
||||
<li>Guid?</li>
|
||||
<li>ICollection</li>
|
||||
<li>Int32</li>
|
||||
<li>Int64</li>
|
||||
<li>List</li>
|
||||
<li>LocalDate?</li>
|
||||
<li>LocalTime?</li>
|
||||
<li>Object</li>
|
||||
<li>String</li>
|
||||
<li>System.IO.Stream</li>
|
||||
<li>ZonedDateTime?</li>
|
||||
<li>bool</li>
|
||||
<li>bool?</li>
|
||||
<li>byte[]</li>
|
||||
<li>decimal</li>
|
||||
<li>decimal?</li>
|
||||
<li>double</li>
|
||||
<li>double?</li>
|
||||
<li>float</li>
|
||||
<li>float?</li>
|
||||
<li>int</li>
|
||||
<li>int?</li>
|
||||
<li>long</li>
|
||||
<li>long?</li>
|
||||
<li>string</li>
|
||||
</ul>
|
||||
|
||||
## RESERVED WORDS
|
||||
|
||||
<ul class="column-ul">
|
||||
<li>async</li>
|
||||
<li>await</li>
|
||||
<li>dynamic</li>
|
||||
<li>var</li>
|
||||
<li>yield</li>
|
||||
</ul>
|
||||
|
||||
## FEATURE SET
|
||||
|
||||
|
||||
### Client Modification Feature
|
||||
| Name | Supported | Defined By |
|
||||
| ---- | --------- | ---------- |
|
||||
|BasePath|✗|ToolingExtension
|
||||
|Authorizations|✗|ToolingExtension
|
||||
|UserAgent|✗|ToolingExtension
|
||||
|MockServer|✗|ToolingExtension
|
||||
|
||||
### Data Type Feature
|
||||
| Name | Supported | Defined By |
|
||||
| ---- | --------- | ---------- |
|
||||
|Custom|✗|OAS2,OAS3
|
||||
|Int32|✓|OAS2,OAS3
|
||||
|Int64|✓|OAS2,OAS3
|
||||
|Float|✓|OAS2,OAS3
|
||||
|Double|✓|OAS2,OAS3
|
||||
|Decimal|✓|ToolingExtension
|
||||
|String|✓|OAS2,OAS3
|
||||
|Byte|✓|OAS2,OAS3
|
||||
|Binary|✓|OAS2,OAS3
|
||||
|Boolean|✓|OAS2,OAS3
|
||||
|Date|✓|OAS2,OAS3
|
||||
|DateTime|✓|OAS2,OAS3
|
||||
|Password|✓|OAS2,OAS3
|
||||
|File|✓|OAS2
|
||||
|Array|✓|OAS2,OAS3
|
||||
|Maps|✓|ToolingExtension
|
||||
|CollectionFormat|✓|OAS2
|
||||
|CollectionFormatMulti|✓|OAS2
|
||||
|Enum|✓|OAS2,OAS3
|
||||
|ArrayOfEnum|✓|ToolingExtension
|
||||
|ArrayOfModel|✓|ToolingExtension
|
||||
|ArrayOfCollectionOfPrimitives|✓|ToolingExtension
|
||||
|ArrayOfCollectionOfModel|✓|ToolingExtension
|
||||
|ArrayOfCollectionOfEnum|✓|ToolingExtension
|
||||
|MapOfEnum|✓|ToolingExtension
|
||||
|MapOfModel|✓|ToolingExtension
|
||||
|MapOfCollectionOfPrimitives|✓|ToolingExtension
|
||||
|MapOfCollectionOfModel|✓|ToolingExtension
|
||||
|MapOfCollectionOfEnum|✓|ToolingExtension
|
||||
|
||||
### Documentation Feature
|
||||
| Name | Supported | Defined By |
|
||||
| ---- | --------- | ---------- |
|
||||
|Readme|✗|ToolingExtension
|
||||
|Model|✓|ToolingExtension
|
||||
|Api|✓|ToolingExtension
|
||||
|
||||
### Global Feature
|
||||
| Name | Supported | Defined By |
|
||||
| ---- | --------- | ---------- |
|
||||
|Host|✓|OAS2,OAS3
|
||||
|BasePath|✓|OAS2,OAS3
|
||||
|Info|✓|OAS2,OAS3
|
||||
|Schemes|✗|OAS2,OAS3
|
||||
|PartialSchemes|✓|OAS2,OAS3
|
||||
|Consumes|✓|OAS2
|
||||
|Produces|✓|OAS2
|
||||
|ExternalDocumentation|✓|OAS2,OAS3
|
||||
|Examples|✓|OAS2,OAS3
|
||||
|XMLStructureDefinitions|✗|OAS2,OAS3
|
||||
|MultiServer|✗|OAS3
|
||||
|ParameterizedServer|✗|OAS3
|
||||
|ParameterStyling|✗|OAS3
|
||||
|Callbacks|✗|OAS3
|
||||
|LinkObjects|✗|OAS3
|
||||
|
||||
### Parameter Feature
|
||||
| Name | Supported | Defined By |
|
||||
| ---- | --------- | ---------- |
|
||||
|Path|✓|OAS2,OAS3
|
||||
|Query|✓|OAS2,OAS3
|
||||
|Header|✓|OAS2,OAS3
|
||||
|Body|✓|OAS2
|
||||
|FormUnencoded|✓|OAS2
|
||||
|FormMultipart|✓|OAS2
|
||||
|Cookie|✗|OAS3
|
||||
|
||||
### Schema Support Feature
|
||||
| Name | Supported | Defined By |
|
||||
| ---- | --------- | ---------- |
|
||||
|Simple|✓|OAS2,OAS3
|
||||
|Composite|✓|OAS2,OAS3
|
||||
|Polymorphism|✓|OAS2,OAS3
|
||||
|Union|✗|OAS3
|
||||
|
||||
### Security Feature
|
||||
| Name | Supported | Defined By |
|
||||
| ---- | --------- | ---------- |
|
||||
|BasicAuth|✗|OAS2,OAS3
|
||||
|ApiKey|✗|OAS2,OAS3
|
||||
|OpenIDConnect|✗|OAS3
|
||||
|BearerToken|✗|OAS3
|
||||
|OAuth2_Implicit|✗|OAS2,OAS3
|
||||
|OAuth2_Password|✗|OAS2,OAS3
|
||||
|OAuth2_ClientCredentials|✗|OAS2,OAS3
|
||||
|OAuth2_AuthorizationCode|✗|OAS2,OAS3
|
||||
|
||||
### Wire Format Feature
|
||||
| Name | Supported | Defined By |
|
||||
| ---- | --------- | ---------- |
|
||||
|JSON|✓|OAS2,OAS3
|
||||
|XML|✓|OAS2,OAS3
|
||||
|PROTOBUF|✗|ToolingExtension
|
||||
|Custom|✗|OAS2,OAS3
|
@ -130,7 +130,6 @@ All languages of `swagger-codegen` have been migrated to `openapi-generator`, bu
|
||||
| `lumen` | `php-lumen` |
|
||||
| `slim` | `php-slim` |
|
||||
| `ze-ph` | `php-mezzio-ph` |
|
||||
| `nancyfx` | `csharp-nancyfx` |
|
||||
|
||||
We provide a temporary mapping in code for these old values. You'll receive a warning with instructions to migrate to the new names.
|
||||
|
||||
|
@ -1,441 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 OpenAPI-Generator Contributors (https://openapi-generator.tech)
|
||||
* Copyright 2018 SmartBear Software
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.openapitools.codegen.languages;
|
||||
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.collect.*;
|
||||
import io.swagger.v3.oas.models.OpenAPI;
|
||||
import io.swagger.v3.oas.models.media.Schema;
|
||||
import org.openapitools.codegen.*;
|
||||
import org.openapitools.codegen.meta.features.*;
|
||||
import org.openapitools.codegen.meta.GeneratorMetadata;
|
||||
import org.openapitools.codegen.meta.Stability;
|
||||
import org.openapitools.codegen.utils.ModelUtils;
|
||||
import org.openapitools.codegen.utils.URLPathUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URL;
|
||||
import java.util.*;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import static com.google.common.base.Strings.isNullOrEmpty;
|
||||
import static java.util.Arrays.asList;
|
||||
import static java.util.UUID.randomUUID;
|
||||
import static org.apache.commons.lang3.StringUtils.capitalize;
|
||||
import static org.openapitools.codegen.CodegenConstants.*;
|
||||
import static org.openapitools.codegen.CodegenType.SERVER;
|
||||
import static org.openapitools.codegen.utils.StringUtils.camelize;
|
||||
|
||||
public class CSharpNancyFXServerCodegen extends AbstractCSharpCodegen {
|
||||
private final Logger LOGGER = LoggerFactory.getLogger(CSharpNancyFXServerCodegen.class);
|
||||
|
||||
private static final String API_NAMESPACE = "Modules";
|
||||
private static final String MODEL_NAMESPACE = "Models";
|
||||
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<Schema>> propertyToOpenAPITypeMapping =
|
||||
createPropertyToOpenAPITypeMapping();
|
||||
|
||||
private String packageGuid = "{" + randomUUID().toString().toUpperCase(Locale.ROOT) + "}";
|
||||
|
||||
private final Map<String, DependencyInfo> dependencies = new HashMap<>();
|
||||
private final Set<String> parentModels = new HashSet<>();
|
||||
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 CSharpNancyFXServerCodegen() {
|
||||
super();
|
||||
|
||||
modifyFeatureSet(features -> features
|
||||
.excludeDocumentationFeatures(DocumentationFeature.Readme)
|
||||
.securityFeatures(EnumSet.noneOf(SecurityFeature.class))
|
||||
.excludeGlobalFeatures(
|
||||
GlobalFeature.XMLStructureDefinitions,
|
||||
GlobalFeature.Callbacks,
|
||||
GlobalFeature.LinkObjects,
|
||||
GlobalFeature.ParameterStyling
|
||||
)
|
||||
.includeSchemaSupportFeatures(
|
||||
SchemaSupportFeature.Polymorphism
|
||||
)
|
||||
.excludeParameterFeatures(
|
||||
ParameterFeature.Cookie
|
||||
)
|
||||
);
|
||||
|
||||
generatorMetadata = GeneratorMetadata.newBuilder(generatorMetadata)
|
||||
.stability(Stability.DEPRECATED)
|
||||
.build();
|
||||
|
||||
outputFolder = "generated-code" + File.separator + getName();
|
||||
apiTemplateFiles.put("api.mustache", ".cs");
|
||||
|
||||
// Early versions use no prefix for interfaces. Defaulting to I- common practice would break existing users.
|
||||
setInterfacePrefix("");
|
||||
|
||||
// contextually reserved words
|
||||
setReservedWordsLowerCase(
|
||||
asList("var", "async", "await", "dynamic", "yield")
|
||||
);
|
||||
|
||||
cliOptions.clear();
|
||||
|
||||
// CLI options
|
||||
addOption(PACKAGE_NAME, "C# package name (convention: Title.Case).", packageName);
|
||||
addOption(PACKAGE_VERSION, "C# package version.", packageVersion);
|
||||
addOption(SOURCE_FOLDER, SOURCE_FOLDER_DESC, sourceFolder);
|
||||
addOption(INTERFACE_PREFIX, INTERFACE_PREFIX_DESC, interfacePrefix);
|
||||
addOption(OPTIONAL_PROJECT_GUID, OPTIONAL_PROJECT_GUID_DESC, null);
|
||||
addOption(PACKAGE_CONTEXT, "Optionally overrides the PackageContext which determines the namespace (namespace=packageName.packageContext). If not set, packageContext will default to basePath.", null);
|
||||
|
||||
// CLI Switches
|
||||
addSwitch(SORT_PARAMS_BY_REQUIRED_FLAG, SORT_PARAMS_BY_REQUIRED_FLAG_DESC, sortParamsByRequiredFlag);
|
||||
addSwitch(OPTIONAL_PROJECT_FILE, OPTIONAL_PROJECT_FILE_DESC, optionalProjectFileFlag);
|
||||
addSwitch(USE_DATETIME_OFFSET, USE_DATETIME_OFFSET_DESC, useDateTimeOffsetFlag);
|
||||
addSwitch(USE_COLLECTION, USE_COLLECTION_DESC, useCollection);
|
||||
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.", this.asyncServer);
|
||||
typeMapping.putAll(nodaTimeTypesMappings());
|
||||
languageSpecificPrimitives.addAll(nodaTimePrimitiveTypes());
|
||||
}
|
||||
|
||||
@Override
|
||||
public CodegenType getTag() {
|
||||
return SERVER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "csharp-nancyfx-deprecated";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp() {
|
||||
return "Generates a C# NancyFX Web API server (deprecated).";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processOpts() {
|
||||
super.processOpts();
|
||||
|
||||
apiPackage = isNullOrEmpty(packageName) ? API_NAMESPACE : packageName + "." + API_NAMESPACE;
|
||||
modelPackage = isNullOrEmpty(packageName) ? MODEL_NAMESPACE : packageName + "." + MODEL_NAMESPACE;
|
||||
|
||||
supportingFiles.add(new SupportingFile("gitignore", "", ".gitignore"));
|
||||
supportingFiles.add(new SupportingFile("parameters.mustache", sourceFile("Utils"), "Parameters.cs"));
|
||||
supportingFiles.add(new SupportingFile("localDateConverter.mustache", sourceFile("Utils"), "LocalDateConverter.cs"));
|
||||
supportingFiles.add(new SupportingFile("packages.config.mustache", sourceFolder(), "packages.config"));
|
||||
supportingFiles.add(new SupportingFile("nuspec.mustache", sourceFolder(), packageName + ".nuspec"));
|
||||
|
||||
if (optionalProjectFileFlag) {
|
||||
supportingFiles.add(new SupportingFile("Solution.mustache", "", packageName + ".sln"));
|
||||
supportingFiles.add(new SupportingFile("Project.mustache", sourceFolder(), packageName + ".csproj"));
|
||||
}
|
||||
|
||||
if (additionalProperties.containsKey(OPTIONAL_PROJECT_GUID)) {
|
||||
setPackageGuid((String) additionalProperties.get(OPTIONAL_PROJECT_GUID));
|
||||
}
|
||||
|
||||
if (additionalProperties.containsKey(ASYNC_SERVER)) {
|
||||
setAsyncServer(convertPropertyToBooleanAndWriteBack(ASYNC_SERVER));
|
||||
} else {
|
||||
additionalProperties.put(ASYNC_SERVER, this.asyncServer);
|
||||
}
|
||||
|
||||
additionalProperties.put("packageGuid", packageGuid);
|
||||
|
||||
setupModelTemplate();
|
||||
processImportedMappings();
|
||||
appendDependencies();
|
||||
}
|
||||
|
||||
private void setupModelTemplate() {
|
||||
final Object immutableOption = additionalProperties.get(IMMUTABLE_OPTION);
|
||||
if (immutableOption != null && "false".equalsIgnoreCase(immutableOption.toString())) {
|
||||
LOGGER.info("Using mutable model template");
|
||||
modelTemplateFiles.put("modelMutable.mustache", ".cs");
|
||||
} else {
|
||||
LOGGER.info("Using immutable model template");
|
||||
modelTemplateFiles.put("model.mustache", ".cs");
|
||||
}
|
||||
}
|
||||
|
||||
private void processImportedMappings() {
|
||||
for (final Entry<String, String> entry : ImmutableSet.copyOf(importMapping.entrySet())) {
|
||||
final String model = entry.getKey();
|
||||
final String[] namespaceInfo = entry.getValue().split("\\s");
|
||||
final String[] namespace = (namespaceInfo.length > 0 ? namespaceInfo[0].trim() : "").split(":");
|
||||
final String namespaceName = namespace.length > 0 ? namespace[0].trim() : null;
|
||||
final String modelClass = namespace.length > 1 ? namespace[1].trim() : null;
|
||||
final String assembly = namespaceInfo.length > 1 ? namespaceInfo[1].trim() : null;
|
||||
final String assemblyVersion = namespaceInfo.length > 2 ? namespaceInfo[2].trim() : null;
|
||||
final String assemblyFramework = namespaceInfo.length > 3 ? namespaceInfo[3].trim() : "net45";
|
||||
|
||||
if (isNullOrEmpty(model) || isNullOrEmpty(namespaceName)) {
|
||||
LOGGER.warn(String.format(Locale.ROOT, "Could not import: '%s' - invalid namespace: '%s'", model, entry.getValue()));
|
||||
importMapping.remove(model);
|
||||
} else {
|
||||
LOGGER.info(String.format(Locale.ROOT, "Importing: '%s' from '%s' namespace.", model, namespaceName));
|
||||
importMapping.put(model, namespaceName);
|
||||
}
|
||||
if (!isNullOrEmpty(modelClass)) {
|
||||
LOGGER.info(String.format(Locale.ROOT, "Mapping: '%s' class to '%s'", model, modelClass));
|
||||
modelNameMapping.put(model, modelClass);
|
||||
}
|
||||
if (assembly != null && assemblyVersion != null) {
|
||||
LOGGER.info(String.format(Locale.ROOT, "Adding dependency: '%s', version: '%s', framework: '%s'",
|
||||
assembly, assemblyVersion, assemblyVersion));
|
||||
dependencies.put(assembly, new DependencyInfo(assemblyVersion, assemblyFramework));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void appendDependencies() {
|
||||
final List<Map<String, String>> listOfDependencies = new ArrayList<>();
|
||||
for (final Entry<String, DependencyInfo> dependency : dependencies.entrySet()) {
|
||||
final Map<String, String> dependencyInfo = new HashMap<>();
|
||||
dependencyInfo.put("dependency", dependency.getKey());
|
||||
dependencyInfo.put("dependencyVersion", dependency.getValue().version);
|
||||
dependencyInfo.put("dependencyFramework", dependency.getValue().framework);
|
||||
listOfDependencies.add(dependencyInfo);
|
||||
}
|
||||
additionalProperties.put("dependencies", listOfDependencies);
|
||||
}
|
||||
|
||||
private String sourceFolder() {
|
||||
return "src" + File.separator + packageName;
|
||||
}
|
||||
|
||||
private String sourceFile(final String fileName) {
|
||||
return sourceFolder() + File.separator + fileName;
|
||||
}
|
||||
|
||||
public void setPackageGuid(String packageGuid) {
|
||||
this.packageGuid = packageGuid;
|
||||
}
|
||||
|
||||
public void setAsyncServer(boolean asyncServer) {
|
||||
this.asyncServer = asyncServer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String apiFileFolder() {
|
||||
return outputFolder + File.separator + sourceFolder() + File.separator + API_NAMESPACE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String modelFileFolder() {
|
||||
return outputFolder + File.separator + sourceFolder() + File.separator + MODEL_NAMESPACE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void processOperation(final CodegenOperation operation) {
|
||||
super.processOperation(operation);
|
||||
if (!isNullOrEmpty(operation.path) && operation.path.contains("?")) {
|
||||
operation.path = operation.path.replace("?", "/");
|
||||
}
|
||||
if (!isNullOrEmpty(operation.httpMethod)) {
|
||||
operation.httpMethod = capitalize(operation.httpMethod.toLowerCase(Locale.ROOT));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> postProcessAllModels(final Map<String, Object> models) {
|
||||
final Map<String, Object> processed = super.postProcessAllModels(models);
|
||||
postProcessParentModels(models);
|
||||
return processed;
|
||||
}
|
||||
|
||||
private void postProcessParentModels(final Map<String, Object> models) {
|
||||
LOGGER.debug("Processing parents: {}", parentModels);
|
||||
for (final String parent : parentModels) {
|
||||
final CodegenModel parentModel = ModelUtils.getModelByName(parent, models);
|
||||
if (parentModel != null) {
|
||||
parentModel.hasChildren = true;
|
||||
final Collection<CodegenModel> childrenModels = childrenByParent.get(parent);
|
||||
for (final CodegenModel child : childrenModels) {
|
||||
processParentPropertiesInChildModel(parentModel, child);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processParentPropertiesInChildModel(final CodegenModel parent, final CodegenModel child) {
|
||||
final Map<String, CodegenProperty> childPropertiesByName = new HashMap<>(child.vars.size());
|
||||
for (final CodegenProperty property : child.vars) {
|
||||
childPropertiesByName.put(property.name, property);
|
||||
}
|
||||
CodegenProperty previousParentVar = null;
|
||||
for (final CodegenProperty property : parent.vars) {
|
||||
final CodegenProperty duplicatedByParent = childPropertiesByName.get(property.name);
|
||||
if (duplicatedByParent != null) {
|
||||
LOGGER.info(String.format(Locale.ROOT, "Property: '%s' in '%s' model is inherited from '%s'",
|
||||
property.name, child.classname, parent.classname));
|
||||
duplicatedByParent.isInherited = true;
|
||||
final CodegenProperty parentVar = duplicatedByParent.clone();
|
||||
child.parentVars.add(parentVar);
|
||||
previousParentVar = parentVar;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postProcessModelProperty(final CodegenModel model, final CodegenProperty property) {
|
||||
super.postProcessModelProperty(model, property);
|
||||
if (!isNullOrEmpty(model.parent)) {
|
||||
parentModels.add(model.parent);
|
||||
if (!childrenByParent.containsEntry(model.parent, model)) {
|
||||
childrenByParent.put(model.parent, model);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toEnumVarName(final String name, final String datatype) {
|
||||
if (name.length() == 0) {
|
||||
return "Empty";
|
||||
}
|
||||
|
||||
final String enumName = camelize(
|
||||
sanitizeName(name)
|
||||
.replaceFirst("^_", "")
|
||||
.replaceFirst("_$", "")
|
||||
.replaceAll("-", "_"));
|
||||
final String result;
|
||||
if (enumName.matches("\\d.*")) {
|
||||
result = "_" + enumName;
|
||||
} else {
|
||||
result = enumName;
|
||||
}
|
||||
LOGGER.debug(String.format(Locale.ROOT, "toEnumVarName('%s', %s) = '%s'", name, datatype, enumName));
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toApiName(final String name) {
|
||||
final String apiName;
|
||||
if (isNullOrEmpty(name)) {
|
||||
apiName = "Default";
|
||||
} else {
|
||||
apiName = capitalize(name);
|
||||
}
|
||||
LOGGER.debug(String.format(Locale.ROOT, "toApiName('%s') = '%s'", name, apiName));
|
||||
return apiName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toApiFilename(final String name) {
|
||||
return super.toApiFilename(name) + "Module";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toModelImport(final String name) {
|
||||
final String result;
|
||||
if (modelNameMapping.containsValue(name)) {
|
||||
final String modelName = modelNameMapping.inverse().get(name);
|
||||
result = importMapping.containsKey(modelName) ?
|
||||
importMapping.get(modelName) : super.toModelImport(name);
|
||||
} else if (importMapping.containsKey(name)) {
|
||||
result = importMapping.get(name);
|
||||
} else {
|
||||
result = null;
|
||||
}
|
||||
LOGGER.debug(String.format(Locale.ROOT, "toModelImport('%s') = '%s'", name, result));
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toModelName(final String name) {
|
||||
final String modelName = super.toModelName(name);
|
||||
final String mappedModelName = modelNameMapping.get(modelName);
|
||||
return isNullOrEmpty(mappedModelName) ? modelName : mappedModelName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preprocessOpenAPI(final OpenAPI openAPI) {
|
||||
URL url = URLPathUtils.getServerURL(openAPI, serverVariableOverrides());
|
||||
String path = URLPathUtils.getPath(url, "/");
|
||||
final String packageContextOption = (String) additionalProperties.get(PACKAGE_CONTEXT);
|
||||
additionalProperties.put("packageContext", packageContextOption == null ? sanitizeName(path) : packageContextOption);
|
||||
final Object basePathOption = additionalProperties.get(USE_BASE_PATH);
|
||||
additionalProperties.put("baseContext", basePathOption == null ? path : "/");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toEnumName(final CodegenProperty property) {
|
||||
return sanitizeName(camelize(property.name)) + "Enum";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSchemaType(final Schema property) {
|
||||
for (Entry<String, Predicate<Schema>> entry : propertyToOpenAPITypeMapping.entrySet()) {
|
||||
if (entry.getValue().apply(property)) {
|
||||
return entry.getKey();
|
||||
}
|
||||
}
|
||||
return super.getSchemaType(property);
|
||||
}
|
||||
|
||||
private static Map<String, Predicate<Schema>> createPropertyToOpenAPITypeMapping() {
|
||||
final ImmutableMap.Builder<String, Predicate<Schema>> mapping = ImmutableMap.builder();
|
||||
mapping.put("time", timeProperty());
|
||||
return mapping.build();
|
||||
}
|
||||
|
||||
private static Predicate<Schema> timeProperty() {
|
||||
return new Predicate<Schema>() {
|
||||
@Override
|
||||
public boolean apply(Schema property) {
|
||||
return ModelUtils.isStringSchema(property) && "time".equalsIgnoreCase(property.getFormat());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private static Map<String, String> nodaTimeTypesMappings() {
|
||||
return ImmutableMap.of(
|
||||
"time", "LocalTime?",
|
||||
"date", "LocalDate?",
|
||||
"datetime", "ZonedDateTime?");
|
||||
}
|
||||
|
||||
private static Set<String> nodaTimePrimitiveTypes() {
|
||||
return ImmutableSet.of("LocalTime?", "LocalDate?", "ZonedDateTime?");
|
||||
}
|
||||
|
||||
private static class DependencyInfo {
|
||||
private final String version;
|
||||
private final String framework;
|
||||
|
||||
private DependencyInfo(final String version, final String framework) {
|
||||
this.version = version;
|
||||
this.framework = framework;
|
||||
}
|
||||
}
|
||||
}
|
@ -22,7 +22,6 @@ org.openapitools.codegen.languages.CppUE4ClientCodegen
|
||||
org.openapitools.codegen.languages.CSharpClientCodegen
|
||||
org.openapitools.codegen.languages.CSharpNetCoreClientCodegen
|
||||
org.openapitools.codegen.languages.CSharpDotNet2ClientCodegen
|
||||
org.openapitools.codegen.languages.CSharpNancyFXServerCodegen
|
||||
org.openapitools.codegen.languages.CsharpNetcoreFunctionsServerCodegen
|
||||
org.openapitools.codegen.languages.DartClientCodegen
|
||||
org.openapitools.codegen.languages.DartDioClientCodegen
|
||||
|
@ -1,79 +0,0 @@
|
||||
<?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>{{packageGuid}}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>{{packageName}}.{{packageContext}}</RootNamespace>
|
||||
<AssemblyName>{{packageName}}</AssemblyName>
|
||||
{{^supportsUWP}}
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
{{/supportsUWP}}
|
||||
{{#supportsUWP}}
|
||||
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
|
||||
<TargetPlatformVersion>10.0.10240.0</TargetPlatformVersion>
|
||||
<TargetPlatformMinVersion>10.0.10240.0</TargetPlatformMinVersion>
|
||||
<MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>
|
||||
{{/supportsUWP}}
|
||||
<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\{{packageName}}.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\{{packageName}}.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>{{#dependencies}}
|
||||
<Reference Include="{{dependency}}, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\{{dependency}}.{{dependencyVersion}}\lib\{{dependencyFramework}}\{{dependency}}.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
{{/dependencies}}
|
||||
<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>
|
@ -1,25 +0,0 @@
|
||||
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}") = "{{packageName}}", "src\{{packageName}}\{{packageName}}.csproj", "{{packageGuid}}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{{packageGuid}}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{{packageGuid}}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{{packageGuid}}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{{packageGuid}}.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
|
@ -1,78 +0,0 @@
|
||||
using System;
|
||||
using Nancy;
|
||||
using Nancy.ModelBinding;
|
||||
using System.Collections.Generic;
|
||||
using Sharpility.Base;
|
||||
using {{packageName}}.{{packageContext}}.Models;
|
||||
using {{packageName}}.{{packageContext}}.Utils;
|
||||
using NodaTime;{{#asyncServer}}
|
||||
using System.Threading.Tasks;{{/asyncServer}}
|
||||
|
||||
namespace {{packageName}}.{{packageContext}}.Modules
|
||||
{ {{#operations}}{{#operation}}{{#allParams}}{{#isEnum}}
|
||||
{{>innerApiEnum}}{{/isEnum}}{{/allParams}}{{/operation}}
|
||||
|
||||
/// <summary>
|
||||
/// Module processing requests of {{classname}} domain.
|
||||
/// </summary>
|
||||
public sealed class {{classname}}Module : NancyModule
|
||||
{
|
||||
/// <summary>
|
||||
/// Sets up HTTP methods mappings.
|
||||
/// </summary>
|
||||
/// <param name="service">Service handling requests</param>
|
||||
public {{classname}}Module({{interfacePrefix}}{{classname}}Service service) : base("{{{baseContext}}}")
|
||||
{ {{#operation}}
|
||||
{{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}}{{^-last}}
|
||||
{{/-last}}{{/isBodyParam}}{{/allParams}}{{#allParams}}{{#required}}
|
||||
Preconditions.IsNotNull({{paramName}}, "Required parameter: '{{paramName}}' is missing at '{{operationId}}'");
|
||||
{{/required}}{{/allParams}}
|
||||
{{#returnType}}return {{/returnType}}{{#asyncServer}}await {{/asyncServer}}service.{{operationId}}(Context{{#allParams.0}}, {{/allParams.0}}{{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}}){{#returnType}}{{#isArray}}.ToArray(){{/isArray}}{{/returnType}};{{^returnType}}
|
||||
return new Response { ContentType = "{{produces.0.mediaType}}"};{{/returnType}}
|
||||
};
|
||||
{{/operation}}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Service handling {{classname}} requests.
|
||||
/// </summary>
|
||||
public interface {{interfacePrefix}}{{classname}}Service
|
||||
{
|
||||
{{#operation}}/// <summary>
|
||||
/// {{notes}}
|
||||
/// </summary>
|
||||
/// <param name="context">Context of request</param>
|
||||
{{#allParams}}/// <param name="{{paramName}}">{{description}}{{^required}} (optional{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/required}}{{#isDeprecated}} (deprecated){{/isDeprecated}}</param>
|
||||
{{/allParams}}/// <returns>{{returnType}}</returns>
|
||||
{{#isDeprecated}}
|
||||
[Obsolete]
|
||||
{{/isDeprecated}}
|
||||
{{#asyncServer}}{{#returnType}}Task<{{{.}}}>{{/returnType}}{{^returnType}}Task{{/returnType}}{{/asyncServer}}{{^asyncServer}}{{#returnType}}{{&returnType}}{{/returnType}}{{^returnType}}void{{/returnType}}{{/asyncServer}} {{operationId}}(NancyContext context{{#allParams.0}}, {{/allParams.0}}{{>paramsList}});{{^-last}}
|
||||
|
||||
{{/-last}}{{/operation}}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Abstraction of {{classname}}Service.
|
||||
/// </summary>
|
||||
public abstract class Abstract{{classname}}Service: {{interfacePrefix}}{{classname}}Service
|
||||
{
|
||||
{{#operation}}{{#isDeprecated}}[Obsolete]
|
||||
{{/isDeprecated}}public virtual {{#asyncServer}}{{#returnType}}Task<{{{.}}}>{{/returnType}}{{^returnType}}Task{{/returnType}}{{/asyncServer}}{{^asyncServer}}{{#returnType}}{{&returnType}}{{/returnType}}{{^returnType}}void{{/returnType}}{{/asyncServer}} {{operationId}}(NancyContext context{{#allParams.0}}, {{/allParams.0}}{{>paramsList}})
|
||||
{
|
||||
{{^asyncServer}}{{#returnType}}return {{/returnType}}{{/asyncServer}}{{#asyncServer}}return {{/asyncServer}}{{operationId}}({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}});
|
||||
}{{^-last}}
|
||||
|
||||
{{/-last}}{{/operation}}
|
||||
|
||||
{{#operation}}{{#isDeprecated}}[Obsolete]
|
||||
{{/isDeprecated}}protected abstract {{#asyncServer}}{{#returnType}}Task<{{{.}}}>{{/returnType}}{{^returnType}}Task{{/returnType}}{{/asyncServer}}{{^asyncServer}}{{#returnType}}{{&returnType}}{{/returnType}}{{^returnType}}void{{/returnType}}{{/asyncServer}} {{operationId}}({{>paramsList}});{{^-last}}
|
||||
|
||||
{{/-last}}{{/operation}}
|
||||
}
|
||||
|
||||
{{/operations}}
|
||||
}
|
@ -1,362 +0,0 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Ww][Ii][Nn]32/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUnit
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
nunit-*.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# ASP.NET Scaffolding
|
||||
ScaffoldingReadMe.txt
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Coverlet is a free, cross platform Code Coverage Tool
|
||||
coverage*.json
|
||||
coverage*.xml
|
||||
coverage*.info
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# NuGet Symbol Packages
|
||||
*.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
*.appxbundle
|
||||
*.appxupload
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!?*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
*- [Bb]ackup.rdl
|
||||
*- [Bb]ackup ([0-9]).rdl
|
||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
# BeatPulse healthcheck temp database
|
||||
healthchecksdb
|
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||
MigrationBackup/
|
||||
|
||||
# Ionide (cross platform F# VS Code tools) working folder
|
||||
.ionide/
|
||||
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
@ -1,10 +0,0 @@
|
||||
/// <summary>
|
||||
/// {{description}}{{^description}}{{classname}}{{/description}}
|
||||
/// </summary>
|
||||
public enum {{>innerApiEnumName}}
|
||||
{
|
||||
{{#allowableValues}}
|
||||
{{#values}} {{&.}}{{^isInteger}} = {{-index}}{{/isInteger}}{{^-last}}, {{/-last}}
|
||||
{{/values}}
|
||||
{{/allowableValues}}
|
||||
};
|
@ -1 +0,0 @@
|
||||
{{#datatypeWithEnum}}{{operationId}}{{^isContainer}}{{.}}{{/isContainer}}{{#isContainer}}{{{items.datatypeWithEnum}}}{{/isContainer}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}
|
@ -1 +0,0 @@
|
||||
public enum {{datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}} { {{#allowableValues}}{{#enumVars}}{{{name}}}{{^-last}}, {{/-last}}{{/enumVars}}{{/allowableValues}} };
|
@ -1 +0,0 @@
|
||||
{{#isQueryParam}}ParameterType.Query{{/isQueryParam}}{{#isPathParam}}ParameterType.Path{{/isPathParam}}{{#isHeaderParam}}ParameterType.Header{{/isHeaderParam}}{{^isQueryParam}}{{^isPathParam}}{{^isHeaderParam}}ParameterType.Undefined{{/isHeaderParam}}{{/isPathParam}}{{/isQueryParam}}
|
@ -1 +0,0 @@
|
||||
parameters, Context.Request, "{{paramName}}", {{>innerParameterType}}
|
@ -1,55 +0,0 @@
|
||||
using Nancy.Bootstrapper;
|
||||
using Nancy.Json;
|
||||
using NodaTime;
|
||||
using NodaTime.Text;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace {{packageName}}.{{packageContext}}.Utils
|
||||
{
|
||||
/// <summary>
|
||||
/// (De)serializes a <see cref="NodaTime.LocalDate"/> to a string using
|
||||
/// the <a href="https://xml2rfc.tools.ietf.org/public/rfc/html/rfc3339.html#anchor14">RFC3339</a>
|
||||
/// <code>full-date</code> format.
|
||||
/// </summary>
|
||||
public class LocalDateConverter : JavaScriptPrimitiveConverter, IApplicationStartup
|
||||
{
|
||||
public override IEnumerable<Type> SupportedTypes
|
||||
{
|
||||
get
|
||||
{
|
||||
yield return typeof(LocalDate);
|
||||
yield return typeof(LocalDate?);
|
||||
}
|
||||
}
|
||||
|
||||
public void Initialize(IPipelines pipelines)
|
||||
{
|
||||
JsonSettings.PrimitiveConverters.Add(new LocalDateConverter());
|
||||
}
|
||||
|
||||
|
||||
public override object Serialize(object obj, JavaScriptSerializer serializer)
|
||||
{
|
||||
if (obj is LocalDate)
|
||||
{
|
||||
LocalDate localDate = (LocalDate)obj;
|
||||
return LocalDatePattern.IsoPattern.Format(localDate);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public override object Deserialize(object primitiveValue, Type type, JavaScriptSerializer serializer)
|
||||
{
|
||||
if ((type == typeof(LocalDate) || type == typeof(LocalDate?)) && primitiveValue is string)
|
||||
{
|
||||
try
|
||||
{
|
||||
return LocalDatePattern.IsoPattern.Parse(primitiveValue as string).GetValueOrThrow();
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Sharpility.Extensions;
|
||||
using NodaTime;
|
||||
|
||||
namespace {{packageName}}.{{packageContext}}.Models
|
||||
{
|
||||
{{#models}}
|
||||
{{#model}}
|
||||
{{#isEnum}}{{>modelEnum}}{{/isEnum}}{{^isEnum}}{{>modelGeneric}}{{/isEnum}}
|
||||
{{/model}}
|
||||
{{/models}}
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
/// <summary>
|
||||
/// {{description}}{{^description}}Defines {{{name}}}{{/description}}
|
||||
/// </summary>
|
||||
{{#description}}
|
||||
/// <value>{{.}}</value>
|
||||
{{/description}}
|
||||
public enum {{datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}
|
||||
{
|
||||
{{#allowableValues}}{{#enumVars}}
|
||||
/// <summary>
|
||||
/// Enum {{name}}
|
||||
/// </summary>
|
||||
{{name}}{{#isInteger}} = {{{value}}}{{/isInteger}}{{^isInteger}} = {{-index}}{{/isInteger}}{{^-last}},
|
||||
{{/-last}}{{/enumVars}}{{/allowableValues}}
|
||||
}
|
@ -1,156 +0,0 @@
|
||||
/// <summary>
|
||||
/// {{description}}{{^description}}{{classname}}{{/description}}
|
||||
/// </summary>
|
||||
public {{^hasChildren}}sealed {{/hasChildren}}class {{classname}}: {{#parent}}{{{.}}}, {{/parent}} IEquatable<{{classname}}>
|
||||
{ {{#vars}}{{^isInherited}}
|
||||
/// <summary>
|
||||
/// {{description}}{{^description}}{{{name}}}{{/description}}
|
||||
/// </summary>
|
||||
public {{>nullableDataType}} {{name}} { get; private set; }
|
||||
{{/isInherited}}{{/vars}}
|
||||
|
||||
/// <summary>
|
||||
/// Empty constructor required by some serializers.
|
||||
/// Use {{classname}}.Builder() for instance creation instead.
|
||||
/// </summary>
|
||||
[Obsolete]
|
||||
public {{classname}}(){{#parent}} : base({{/parent}}{{#parentVars}}null{{^-last}}, {{/-last}}{{/parentVars}}{{#parent}}){{/parent}}
|
||||
{
|
||||
}
|
||||
|
||||
{{#hasChildren}}protected{{/hasChildren}}{{^hasChildren}}private{{/hasChildren}} {{classname}}({{#vars}}{{>nullableDataType}} {{name}}{{^-last}}, {{/-last}}{{/vars}}){{#parent}} : base({{#parentVars}}{{name}}{{^-last}}, {{/-last}}{{/parentVars}}){{/parent}}
|
||||
{
|
||||
{{#vars}}{{^isInherited}}
|
||||
this.{{name}} = {{name}};
|
||||
{{/isInherited}}{{/vars}}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns builder of {{classname}}.
|
||||
/// </summary>
|
||||
/// <returns>{{classname}}Builder</returns>
|
||||
public static {{#parent}}new {{/parent}}{{classname}}Builder Builder()
|
||||
{
|
||||
return new {{classname}}Builder();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns {{classname}}Builder with properties set.
|
||||
/// Use it to change properties.
|
||||
/// </summary>
|
||||
/// <returns>{{classname}}Builder</returns>
|
||||
public {{#parent}}new {{/parent}}{{classname}}Builder With()
|
||||
{
|
||||
return Builder()
|
||||
{{#vars}}
|
||||
.{{name}}({{name}}){{^-last}}
|
||||
{{/-last}}{{/vars}};
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return this.PropertiesToString();
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
return this.EqualsByProperties(obj);
|
||||
}
|
||||
|
||||
public bool Equals({{classname}} other)
|
||||
{
|
||||
return Equals((object) other);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return this.PropertiesHash();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of == operator for ({{classname}}.
|
||||
/// </summary>
|
||||
/// <param name="left">Compared ({{classname}}</param>
|
||||
/// <param name="right">Compared ({{classname}}</param>
|
||||
/// <returns>true if compared items are equals, false otherwise</returns>
|
||||
public static bool operator == ({{classname}} left, {{classname}} right)
|
||||
{
|
||||
return Equals(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of != operator for ({{classname}}.
|
||||
/// </summary>
|
||||
/// <param name="left">Compared ({{classname}}</param>
|
||||
/// <param name="right">Compared ({{classname}}</param>
|
||||
/// <returns>true if compared items are not equals, false otherwise</returns>
|
||||
public static bool operator != ({{classname}} left, {{classname}} right)
|
||||
{
|
||||
return !Equals(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Builder of {{classname}}.
|
||||
/// </summary>
|
||||
public sealed class {{classname}}Builder
|
||||
{
|
||||
{{#vars}}
|
||||
private {{>nullableDataType}} _{{name}};
|
||||
{{/vars}}
|
||||
|
||||
internal {{classname}}Builder()
|
||||
{
|
||||
SetupDefaults();
|
||||
}
|
||||
|
||||
private void SetupDefaults()
|
||||
{
|
||||
{{#vars}}
|
||||
{{^required}}
|
||||
{{#defaultValue}}
|
||||
_{{name}} = {{{defaultValue}}};
|
||||
{{/defaultValue}}
|
||||
{{/required}}
|
||||
{{/vars}}
|
||||
}
|
||||
|
||||
{{#vars}}
|
||||
/// <summary>
|
||||
/// Sets value for {{classname}}.{{{name}}} property.
|
||||
/// </summary>
|
||||
/// <param name="value">{{description}}{{^description}}{{{name}}}{{/description}}</param>
|
||||
public {{classname}}Builder {{name}}({{>nullableDataType}} value)
|
||||
{
|
||||
_{{name}} = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
{{/vars}}
|
||||
|
||||
/// <summary>
|
||||
/// Builds instance of {{classname}}.
|
||||
/// </summary>
|
||||
/// <returns>{{classname}}</returns>
|
||||
public {{classname}} Build()
|
||||
{
|
||||
Validate();
|
||||
return new {{classname}}(
|
||||
{{#vars}}
|
||||
{{name}}: _{{name}}{{^-last}},{{/-last}}
|
||||
{{/vars}}
|
||||
);
|
||||
}
|
||||
|
||||
private void Validate()
|
||||
{ {{#vars}}{{#required}}
|
||||
if (_{{name}} == null)
|
||||
{
|
||||
throw new ArgumentException("{{name}} is a required property for {{classname}} and cannot be null");
|
||||
} {{/required}}{{/vars}}
|
||||
}
|
||||
}
|
||||
|
||||
{{#vars}}{{#isEnum}}{{^parent}}
|
||||
{{>innerModelEnum}}{{/parent}}{{/isEnum}}{{#items.isEnum}}
|
||||
{{#items}}{{>innerModelEnum}}{{/items}}{{/items.isEnum}}{{/vars}}
|
||||
}
|
@ -1,72 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Sharpility.Extensions;
|
||||
using NodaTime;
|
||||
{{#imports}}using {{import}};
|
||||
{{/imports}}
|
||||
|
||||
{{#models}}
|
||||
{{#model}}
|
||||
namespace {{packageName}}.{{packageContext}}.Models
|
||||
{ {{#vars}}{{#isEnum}}{{^parent}}
|
||||
{{>innerModelEnum}}{{/parent}}{{/isEnum}}{{#items.isEnum}}
|
||||
{{#items}}{{>innerModelEnum}}{{/items}}{{/items.isEnum}}{{/vars}}
|
||||
|
||||
/// <summary>
|
||||
/// {{description}}{{^description}}{{classname}}{{/description}}
|
||||
/// </summary>
|
||||
public {{^hasChildren}}sealed {{/hasChildren}}class {{classname}}: {{#parent}}{{{.}}}, {{/parent}} IEquatable<{{classname}}>
|
||||
{ {{#vars}}{{^isInherited}}
|
||||
/// <summary>
|
||||
/// {{description}}{{^description}}{{{name}}}{{/description}}
|
||||
/// </summary>
|
||||
public {{>nullableDataType}} {{name}} { get; set; }
|
||||
{{/isInherited}}{{/vars}}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return this.PropertiesToString();
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
return this.EqualsByProperties(obj);
|
||||
}
|
||||
|
||||
public bool Equals({{classname}} other)
|
||||
{
|
||||
return Equals((object) other);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return this.PropertiesHash();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of == operator for ({{classname}}.
|
||||
/// </summary>
|
||||
/// <param name="left">Compared ({{classname}}</param>
|
||||
/// <param name="right">Compared ({{classname}}</param>
|
||||
/// <returns>true if compared items are equals, false otherwise</returns>
|
||||
public static bool operator == ({{classname}} left, {{classname}} right)
|
||||
{
|
||||
return Equals(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of != operator for ({{classname}}.
|
||||
/// </summary>
|
||||
/// <param name="left">Compared ({{classname}}</param>
|
||||
/// <param name="right">Compared ({{classname}}</param>
|
||||
/// <returns>true if compared items are not equals, false otherwise</returns>
|
||||
public static bool operator != ({{classname}} left, {{classname}} right)
|
||||
{
|
||||
return !Equals(left, right);
|
||||
}
|
||||
}
|
||||
{{/model}}
|
||||
{{/models}}
|
||||
}
|
@ -1 +0,0 @@
|
||||
{{&datatypeWithEnum}}{{#isEnum}}?{{/isEnum}}
|
@ -1,14 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<package>
|
||||
<metadata>
|
||||
<id>{{packageName}}</id>
|
||||
<title>{{packageName}}</title>
|
||||
<version>{{{version}}}</version>
|
||||
<authors>openapi-generator</authors>
|
||||
<owners>openapi-generator</owners>
|
||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
||||
<description>NancyFx {{packageName}} API</description>{{#termsOfService}}
|
||||
<copyright>{{.}}</copyright>{{/termsOfService}}{{#licenseUrl}}
|
||||
<licenseUrl>{{.}}</licenseUrl>{{/licenseUrl}}
|
||||
</metadata>
|
||||
</package>
|
@ -1,10 +0,0 @@
|
||||
<?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" />
|
||||
{{#dependencies}}
|
||||
<package id="{{dependency}}" version="{{dependencyVersion}}" targetFramework="{{dependencyFramework}}" />
|
||||
{{/dependencies}}
|
||||
</packages>
|
@ -1,450 +0,0 @@
|
||||
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 {{packageName}}.{{packageContext}}.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 dynamically",
|
||||
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(LocalDate), SafeParse(ParseLocalDate));
|
||||
parsers.Put(typeof(LocalDate?), SafeParse(ParseLocalDate));
|
||||
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 LocalDate ParseLocalDate(string value)
|
||||
{
|
||||
return LocalDatePattern.IsoPattern.Parse(value).Value;
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
@ -1 +0,0 @@
|
||||
{{#allParams}}{{#isEnum}}{{>innerApiEnumName}}?{{/isEnum}}{{^isEnum}}{{&dataType}}{{/isEnum}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}
|
@ -115,10 +115,6 @@
|
||||
"title": "Config Options for csharp-dotnet2",
|
||||
"sidebar_label": "csharp-dotnet2"
|
||||
},
|
||||
"generators/csharp-nancyfx": {
|
||||
"title": "Config Options for csharp-nancyfx",
|
||||
"sidebar_label": "csharp-nancyfx"
|
||||
},
|
||||
"generators/csharp-netcore": {
|
||||
"title": "Config Options for csharp-netcore",
|
||||
"sidebar_label": "csharp-netcore"
|
||||
|
Loading…
x
Reference in New Issue
Block a user