diff --git a/samples/server/petstore/nancyfx/IO.Swagger.sln b/samples/server/petstore/nancyfx/IO.Swagger.sln
new file mode 100644
index 00000000000..896f0bd86f6
--- /dev/null
+++ b/samples/server/petstore/nancyfx/IO.Swagger.sln
@@ -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", "{1DE2DD8D-1AFB-4BC2-9FB5-04DE7DCA1353}"
+EndProject
+Global
+GlobalSection(SolutionConfigurationPlatforms) = preSolution
+Debug|Any CPU = Debug|Any CPU
+Release|Any CPU = Release|Any CPU
+EndGlobalSection
+GlobalSection(ProjectConfigurationPlatforms) = postSolution
+{1DE2DD8D-1AFB-4BC2-9FB5-04DE7DCA1353}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+{1DE2DD8D-1AFB-4BC2-9FB5-04DE7DCA1353}.Debug|Any CPU.Build.0 = Debug|Any CPU
+{1DE2DD8D-1AFB-4BC2-9FB5-04DE7DCA1353}.Release|Any CPU.ActiveCfg = Release|Any CPU
+{1DE2DD8D-1AFB-4BC2-9FB5-04DE7DCA1353}.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
\ No newline at end of file
diff --git a/samples/server/petstore/nancyfx/src/IO.Swagger/IO.Swagger.csproj b/samples/server/petstore/nancyfx/src/IO.Swagger/IO.Swagger.csproj
new file mode 100644
index 00000000000..46fb435d419
--- /dev/null
+++ b/samples/server/petstore/nancyfx/src/IO.Swagger/IO.Swagger.csproj
@@ -0,0 +1,66 @@
+
+
+
+ Debug
+ AnyCPU
+ {1DE2DD8D-1AFB-4BC2-9FB5-04DE7DCA1353}
+ Library
+ Properties
+ IO.Swagger.v2
+
+ v4.5
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ bin\Debug\IO.Swagger.XML
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+ bin\Release\IO.Swagger.XML
+
+
+
+ ..\..\packages\Nancy.1.4.1\lib\net40\Nancy.dll
+ True
+
+
+ ..\..\packages\NodaTime.1.3.1\lib\net35-Client\NodaTime.dll
+ True
+
+
+ ..\..\packages\Sharpility.1.2.1\lib\net45\Sharpility.dll
+ True
+
+
+ ..\..\packages\System.Collections.Immutable.1.1.37\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/server/petstore/nancyfx/src/IO.Swagger/IO.Swagger.nuspec b/samples/server/petstore/nancyfx/src/IO.Swagger/IO.Swagger.nuspec
new file mode 100644
index 00000000000..f6ab1af8e9b
--- /dev/null
+++ b/samples/server/petstore/nancyfx/src/IO.Swagger/IO.Swagger.nuspec
@@ -0,0 +1,14 @@
+
+
+
+ IO.Swagger
+ IO.Swagger
+ 1.0.0
+ swagger-codegen
+ swagger-codegen
+ false
+ NancyFx IO.Swagger API
+ http://helloreverb.com/terms/
+ http://www.apache.org/licenses/LICENSE-2.0.html
+
+
\ No newline at end of file
diff --git a/samples/server/petstore/nancyfx/src/IO.Swagger/Models/Category.cs b/samples/server/petstore/nancyfx/src/IO.Swagger/Models/Category.cs
new file mode 100644
index 00000000000..759bedd74a9
--- /dev/null
+++ b/samples/server/petstore/nancyfx/src/IO.Swagger/Models/Category.cs
@@ -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
+{
+ ///
+ /// Category
+ ///
+ public sealed class Category: IEquatable
+ {
+ ///
+ /// Id
+ ///
+ public long? Id { get; private set; }
+
+ ///
+ /// Name
+ ///
+ public string Name { get; private set; }
+
+
+ ///
+ /// Empty constructor required by some serializers.
+ /// Use Category.Builder() for instance creation instead.
+ ///
+ [Obsolete]
+ public Category()
+ {
+ }
+
+ private Category(long? Id, string Name)
+ {
+
+ this.Id = Id;
+
+ this.Name = Name;
+
+ }
+
+ ///
+ /// Returns builder of Category.
+ ///
+ /// CategoryBuilder
+ public static CategoryBuilder Builder()
+ {
+ return new CategoryBuilder();
+ }
+
+ ///
+ /// Returns CategoryBuilder with properties set.
+ /// Use it to change properties.
+ ///
+ /// CategoryBuilder
+ 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();
+ }
+
+ ///
+ /// Implementation of == operator for (Category.
+ ///
+ /// Compared (Category
+ /// Compared (Category
+ /// true if compared items are equals, false otherwise
+ public static bool operator == (Category left, Category right)
+ {
+ return Equals(left, right);
+ }
+
+ ///
+ /// Implementation of != operator for (Category.
+ ///
+ /// Compared (Category
+ /// Compared (Category
+ /// true if compared items are not equals, false otherwise
+ public static bool operator != (Category left, Category right)
+ {
+ return !Equals(left, right);
+ }
+
+ ///
+ /// Builder of Category.
+ ///
+ public sealed class CategoryBuilder
+ {
+ private long? _Id;
+ private string _Name;
+
+ internal CategoryBuilder()
+ {
+ SetupDefaults();
+ }
+
+ private void SetupDefaults()
+ {
+ }
+
+ ///
+ /// Sets value for Category.Id property.
+ ///
+ /// Id
+ public CategoryBuilder Id(long? value)
+ {
+ _Id = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for Category.Name property.
+ ///
+ /// Name
+ public CategoryBuilder Name(string value)
+ {
+ _Name = value;
+ return this;
+ }
+
+
+ ///
+ /// Builds instance of Category.
+ ///
+ /// Category
+ public Category Build()
+ {
+ Validate();
+ return new Category(
+ Id: _Id,
+ Name: _Name
+ );
+ }
+
+ private void Validate()
+ {
+ }
+ }
+
+
+ }
+}
diff --git a/samples/server/petstore/nancyfx/src/IO.Swagger/Models/Order.cs b/samples/server/petstore/nancyfx/src/IO.Swagger/Models/Order.cs
new file mode 100644
index 00000000000..22245ee5bfe
--- /dev/null
+++ b/samples/server/petstore/nancyfx/src/IO.Swagger/Models/Order.cs
@@ -0,0 +1,246 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using Sharpility.Extensions;
+using NodaTime;
+
+namespace IO.Swagger.v2.Models
+{
+ ///
+ /// Order
+ ///
+ public sealed class Order: IEquatable
+ {
+ ///
+ /// Id
+ ///
+ public long? Id { get; private set; }
+
+ ///
+ /// PetId
+ ///
+ public long? PetId { get; private set; }
+
+ ///
+ /// Quantity
+ ///
+ public int? Quantity { get; private set; }
+
+ ///
+ /// ShipDate
+ ///
+ public ZonedDateTime? ShipDate { get; private set; }
+
+ ///
+ /// Order Status
+ ///
+ public StatusEnum? Status { get; private set; }
+
+ ///
+ /// Complete
+ ///
+ public bool? Complete { get; private set; }
+
+
+ ///
+ /// Empty constructor required by some serializers.
+ /// Use Order.Builder() for instance creation instead.
+ ///
+ [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;
+
+ }
+
+ ///
+ /// Returns builder of Order.
+ ///
+ /// OrderBuilder
+ public static OrderBuilder Builder()
+ {
+ return new OrderBuilder();
+ }
+
+ ///
+ /// Returns OrderBuilder with properties set.
+ /// Use it to change properties.
+ ///
+ /// OrderBuilder
+ 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();
+ }
+
+ ///
+ /// Implementation of == operator for (Order.
+ ///
+ /// Compared (Order
+ /// Compared (Order
+ /// true if compared items are equals, false otherwise
+ public static bool operator == (Order left, Order right)
+ {
+ return Equals(left, right);
+ }
+
+ ///
+ /// Implementation of != operator for (Order.
+ ///
+ /// Compared (Order
+ /// Compared (Order
+ /// true if compared items are not equals, false otherwise
+ public static bool operator != (Order left, Order right)
+ {
+ return !Equals(left, right);
+ }
+
+ ///
+ /// Builder of Order.
+ ///
+ 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()
+ {
+ }
+
+ ///
+ /// Sets value for Order.Id property.
+ ///
+ /// Id
+ public OrderBuilder Id(long? value)
+ {
+ _Id = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for Order.PetId property.
+ ///
+ /// PetId
+ public OrderBuilder PetId(long? value)
+ {
+ _PetId = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for Order.Quantity property.
+ ///
+ /// Quantity
+ public OrderBuilder Quantity(int? value)
+ {
+ _Quantity = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for Order.ShipDate property.
+ ///
+ /// ShipDate
+ public OrderBuilder ShipDate(ZonedDateTime? value)
+ {
+ _ShipDate = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for Order.Status property.
+ ///
+ /// Order Status
+ public OrderBuilder Status(StatusEnum? value)
+ {
+ _Status = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for Order.Complete property.
+ ///
+ /// Complete
+ public OrderBuilder Complete(bool? value)
+ {
+ _Complete = value;
+ return this;
+ }
+
+
+ ///
+ /// Builds instance of Order.
+ ///
+ /// Order
+ 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 };
+ }
+}
diff --git a/samples/server/petstore/nancyfx/src/IO.Swagger/Models/Pet.cs b/samples/server/petstore/nancyfx/src/IO.Swagger/Models/Pet.cs
new file mode 100644
index 00000000000..aef03f6ba97
--- /dev/null
+++ b/samples/server/petstore/nancyfx/src/IO.Swagger/Models/Pet.cs
@@ -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
+{
+ ///
+ /// Pet
+ ///
+ public sealed class Pet: IEquatable
+ {
+ ///
+ /// Id
+ ///
+ public long? Id { get; private set; }
+
+ ///
+ /// Category
+ ///
+ public Category Category { get; private set; }
+
+ ///
+ /// Name
+ ///
+ public string Name { get; private set; }
+
+ ///
+ /// PhotoUrls
+ ///
+ public List PhotoUrls { get; private set; }
+
+ ///
+ /// Tags
+ ///
+ public List Tags { get; private set; }
+
+ ///
+ /// pet status in the store
+ ///
+ public StatusEnum? Status { get; private set; }
+
+
+ ///
+ /// Empty constructor required by some serializers.
+ /// Use Pet.Builder() for instance creation instead.
+ ///
+ [Obsolete]
+ public Pet()
+ {
+ }
+
+ private Pet(long? Id, Category Category, string Name, List PhotoUrls, List Tags, StatusEnum? Status)
+ {
+
+ this.Id = Id;
+
+ this.Category = Category;
+
+ this.Name = Name;
+
+ this.PhotoUrls = PhotoUrls;
+
+ this.Tags = Tags;
+
+ this.Status = Status;
+
+ }
+
+ ///
+ /// Returns builder of Pet.
+ ///
+ /// PetBuilder
+ public static PetBuilder Builder()
+ {
+ return new PetBuilder();
+ }
+
+ ///
+ /// Returns PetBuilder with properties set.
+ /// Use it to change properties.
+ ///
+ /// PetBuilder
+ 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();
+ }
+
+ ///
+ /// Implementation of == operator for (Pet.
+ ///
+ /// Compared (Pet
+ /// Compared (Pet
+ /// true if compared items are equals, false otherwise
+ public static bool operator == (Pet left, Pet right)
+ {
+ return Equals(left, right);
+ }
+
+ ///
+ /// Implementation of != operator for (Pet.
+ ///
+ /// Compared (Pet
+ /// Compared (Pet
+ /// true if compared items are not equals, false otherwise
+ public static bool operator != (Pet left, Pet right)
+ {
+ return !Equals(left, right);
+ }
+
+ ///
+ /// Builder of Pet.
+ ///
+ public sealed class PetBuilder
+ {
+ private long? _Id;
+ private Category _Category;
+ private string _Name;
+ private List _PhotoUrls;
+ private List _Tags;
+ private StatusEnum? _Status;
+
+ internal PetBuilder()
+ {
+ SetupDefaults();
+ }
+
+ private void SetupDefaults()
+ {
+ }
+
+ ///
+ /// Sets value for Pet.Id property.
+ ///
+ /// Id
+ public PetBuilder Id(long? value)
+ {
+ _Id = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for Pet.Category property.
+ ///
+ /// Category
+ public PetBuilder Category(Category value)
+ {
+ _Category = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for Pet.Name property.
+ ///
+ /// Name
+ public PetBuilder Name(string value)
+ {
+ _Name = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for Pet.PhotoUrls property.
+ ///
+ /// PhotoUrls
+ public PetBuilder PhotoUrls(List value)
+ {
+ _PhotoUrls = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for Pet.Tags property.
+ ///
+ /// Tags
+ public PetBuilder Tags(List value)
+ {
+ _Tags = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for Pet.Status property.
+ ///
+ /// pet status in the store
+ public PetBuilder Status(StatusEnum? value)
+ {
+ _Status = value;
+ return this;
+ }
+
+
+ ///
+ /// Builds instance of Pet.
+ ///
+ /// Pet
+ 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 };
+ }
+}
diff --git a/samples/server/petstore/nancyfx/src/IO.Swagger/Models/Tag.cs b/samples/server/petstore/nancyfx/src/IO.Swagger/Models/Tag.cs
new file mode 100644
index 00000000000..36fd8204a8a
--- /dev/null
+++ b/samples/server/petstore/nancyfx/src/IO.Swagger/Models/Tag.cs
@@ -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
+{
+ ///
+ /// Tag
+ ///
+ public sealed class Tag: IEquatable
+ {
+ ///
+ /// Id
+ ///
+ public long? Id { get; private set; }
+
+ ///
+ /// Name
+ ///
+ public string Name { get; private set; }
+
+
+ ///
+ /// Empty constructor required by some serializers.
+ /// Use Tag.Builder() for instance creation instead.
+ ///
+ [Obsolete]
+ public Tag()
+ {
+ }
+
+ private Tag(long? Id, string Name)
+ {
+
+ this.Id = Id;
+
+ this.Name = Name;
+
+ }
+
+ ///
+ /// Returns builder of Tag.
+ ///
+ /// TagBuilder
+ public static TagBuilder Builder()
+ {
+ return new TagBuilder();
+ }
+
+ ///
+ /// Returns TagBuilder with properties set.
+ /// Use it to change properties.
+ ///
+ /// TagBuilder
+ 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();
+ }
+
+ ///
+ /// Implementation of == operator for (Tag.
+ ///
+ /// Compared (Tag
+ /// Compared (Tag
+ /// true if compared items are equals, false otherwise
+ public static bool operator == (Tag left, Tag right)
+ {
+ return Equals(left, right);
+ }
+
+ ///
+ /// Implementation of != operator for (Tag.
+ ///
+ /// Compared (Tag
+ /// Compared (Tag
+ /// true if compared items are not equals, false otherwise
+ public static bool operator != (Tag left, Tag right)
+ {
+ return !Equals(left, right);
+ }
+
+ ///
+ /// Builder of Tag.
+ ///
+ public sealed class TagBuilder
+ {
+ private long? _Id;
+ private string _Name;
+
+ internal TagBuilder()
+ {
+ SetupDefaults();
+ }
+
+ private void SetupDefaults()
+ {
+ }
+
+ ///
+ /// Sets value for Tag.Id property.
+ ///
+ /// Id
+ public TagBuilder Id(long? value)
+ {
+ _Id = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for Tag.Name property.
+ ///
+ /// Name
+ public TagBuilder Name(string value)
+ {
+ _Name = value;
+ return this;
+ }
+
+
+ ///
+ /// Builds instance of Tag.
+ ///
+ /// Tag
+ public Tag Build()
+ {
+ Validate();
+ return new Tag(
+ Id: _Id,
+ Name: _Name
+ );
+ }
+
+ private void Validate()
+ {
+ }
+ }
+
+
+ }
+}
diff --git a/samples/server/petstore/nancyfx/src/IO.Swagger/Models/User.cs b/samples/server/petstore/nancyfx/src/IO.Swagger/Models/User.cs
new file mode 100644
index 00000000000..69d079ff42d
--- /dev/null
+++ b/samples/server/petstore/nancyfx/src/IO.Swagger/Models/User.cs
@@ -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
+{
+ ///
+ /// User
+ ///
+ public sealed class User: IEquatable
+ {
+ ///
+ /// Id
+ ///
+ public long? Id { get; private set; }
+
+ ///
+ /// Username
+ ///
+ public string Username { get; private set; }
+
+ ///
+ /// FirstName
+ ///
+ public string FirstName { get; private set; }
+
+ ///
+ /// LastName
+ ///
+ public string LastName { get; private set; }
+
+ ///
+ /// Email
+ ///
+ public string Email { get; private set; }
+
+ ///
+ /// Password
+ ///
+ public string Password { get; private set; }
+
+ ///
+ /// Phone
+ ///
+ public string Phone { get; private set; }
+
+ ///
+ /// User Status
+ ///
+ public int? UserStatus { get; private set; }
+
+
+ ///
+ /// Empty constructor required by some serializers.
+ /// Use User.Builder() for instance creation instead.
+ ///
+ [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;
+
+ }
+
+ ///
+ /// Returns builder of User.
+ ///
+ /// UserBuilder
+ public static UserBuilder Builder()
+ {
+ return new UserBuilder();
+ }
+
+ ///
+ /// Returns UserBuilder with properties set.
+ /// Use it to change properties.
+ ///
+ /// UserBuilder
+ 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();
+ }
+
+ ///
+ /// Implementation of == operator for (User.
+ ///
+ /// Compared (User
+ /// Compared (User
+ /// true if compared items are equals, false otherwise
+ public static bool operator == (User left, User right)
+ {
+ return Equals(left, right);
+ }
+
+ ///
+ /// Implementation of != operator for (User.
+ ///
+ /// Compared (User
+ /// Compared (User
+ /// true if compared items are not equals, false otherwise
+ public static bool operator != (User left, User right)
+ {
+ return !Equals(left, right);
+ }
+
+ ///
+ /// Builder of User.
+ ///
+ 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()
+ {
+ }
+
+ ///
+ /// Sets value for User.Id property.
+ ///
+ /// Id
+ public UserBuilder Id(long? value)
+ {
+ _Id = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for User.Username property.
+ ///
+ /// Username
+ public UserBuilder Username(string value)
+ {
+ _Username = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for User.FirstName property.
+ ///
+ /// FirstName
+ public UserBuilder FirstName(string value)
+ {
+ _FirstName = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for User.LastName property.
+ ///
+ /// LastName
+ public UserBuilder LastName(string value)
+ {
+ _LastName = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for User.Email property.
+ ///
+ /// Email
+ public UserBuilder Email(string value)
+ {
+ _Email = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for User.Password property.
+ ///
+ /// Password
+ public UserBuilder Password(string value)
+ {
+ _Password = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for User.Phone property.
+ ///
+ /// Phone
+ public UserBuilder Phone(string value)
+ {
+ _Phone = value;
+ return this;
+ }
+
+ ///
+ /// Sets value for User.UserStatus property.
+ ///
+ /// User Status
+ public UserBuilder UserStatus(int? value)
+ {
+ _UserStatus = value;
+ return this;
+ }
+
+
+ ///
+ /// Builds instance of User.
+ ///
+ /// User
+ 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()
+ {
+ }
+ }
+
+
+ }
+}
diff --git a/samples/server/petstore/nancyfx/src/IO.Swagger/Modules/PetModule.cs b/samples/server/petstore/nancyfx/src/IO.Swagger/Modules/PetModule.cs
new file mode 100644
index 00000000000..f3ab9ee2892
--- /dev/null
+++ b/samples/server/petstore/nancyfx/src/IO.Swagger/Modules/PetModule.cs
@@ -0,0 +1,229 @@
+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;
+
+namespace IO.Swagger.v2.Modules
+{
+
+ ///
+ /// Module processing requests of Pet domain.
+ ///
+ public sealed class PetModule : NancyModule
+ {
+ ///
+ /// Sets up HTTP methods mappings.
+ ///
+ /// Service handling requests
+ public PetModule(PetService service) : base("/v2")
+ {
+ Post["/pet"] = parameters =>
+ {
+ var body = this.Bind();
+ service.AddPet(Context, body);
+ return new Response { ContentType = "application/json"};
+ };
+
+ Delete["/pet/{petId}"] = parameters =>
+ {
+ var petId = Parameters.ValueOf(parameters, Context.Request, "petId", ParameterType.Path);
+ var apiKey = Parameters.ValueOf(parameters, Context.Request, "apiKey", ParameterType.Header);
+ Preconditions.IsNotNull(petId, "Required parameter: 'petId' is missing at 'DeletePet'");
+
+ service.DeletePet(Context, petId, apiKey);
+ return new Response { ContentType = "application/json"};
+ };
+
+ Get["/pet/findByStatus"] = parameters =>
+ {
+ var status = Parameters.ValueOf>(parameters, Context.Request, "status", ParameterType.Query);
+ return service.FindPetsByStatus(Context, status);
+ };
+
+ Get["/pet/findByTags"] = parameters =>
+ {
+ var tags = Parameters.ValueOf>(parameters, Context.Request, "tags", ParameterType.Query);
+ return service.FindPetsByTags(Context, tags);
+ };
+
+ Get["/pet/{petId}"] = parameters =>
+ {
+ var petId = Parameters.ValueOf(parameters, Context.Request, "petId", ParameterType.Path);
+ Preconditions.IsNotNull(petId, "Required parameter: 'petId' is missing at 'GetPetById'");
+
+ return service.GetPetById(Context, petId);
+ };
+
+ Put["/pet"] = parameters =>
+ {
+ var body = this.Bind();
+ service.UpdatePet(Context, body);
+ return new Response { ContentType = "application/json"};
+ };
+
+ Post["/pet/{petId}"] = parameters =>
+ {
+ var petId = Parameters.ValueOf(parameters, Context.Request, "petId", ParameterType.Path);
+ var name = Parameters.ValueOf(parameters, Context.Request, "name", ParameterType.Undefined);
+ var status = Parameters.ValueOf(parameters, Context.Request, "status", ParameterType.Undefined);
+ Preconditions.IsNotNull(petId, "Required parameter: 'petId' is missing at 'UpdatePetWithForm'");
+
+ service.UpdatePetWithForm(Context, petId, name, status);
+ return new Response { ContentType = "application/json"};
+ };
+
+ Post["/pet/{petId}/uploadImage"] = parameters =>
+ {
+ var petId = Parameters.ValueOf(parameters, Context.Request, "petId", ParameterType.Path);
+ var additionalMetadata = Parameters.ValueOf(parameters, Context.Request, "additionalMetadata", ParameterType.Undefined);
+ var file = Parameters.ValueOf(parameters, Context.Request, "file", ParameterType.Undefined);
+ Preconditions.IsNotNull(petId, "Required parameter: 'petId' is missing at 'UploadFile'");
+
+ service.UploadFile(Context, petId, additionalMetadata, file);
+ return new Response { ContentType = "application/json"};
+ };
+ }
+ }
+
+ ///
+ /// Service handling Pet requests.
+ ///
+ public interface PetService
+ {
+ ///
+ ///
+ ///
+ /// Context of request
+ /// Pet object that needs to be added to the store (optional)
+ ///
+ void AddPet(NancyContext context, Pet body);
+
+ ///
+ ///
+ ///
+ /// Context of request
+ /// Pet id to delete
+ /// (optional)
+ ///
+ void DeletePet(NancyContext context, long? petId, string apiKey);
+
+ ///
+ /// Multiple status values can be provided with comma seperated strings
+ ///
+ /// Context of request
+ /// Status values that need to be considered for filter (optional, default to available)
+ /// List<Pet>
+ List FindPetsByStatus(NancyContext context, List status);
+
+ ///
+ /// Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing.
+ ///
+ /// Context of request
+ /// Tags to filter by (optional)
+ /// List<Pet>
+ List FindPetsByTags(NancyContext context, List tags);
+
+ ///
+ /// Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions
+ ///
+ /// Context of request
+ /// ID of pet that needs to be fetched
+ /// Pet
+ Pet GetPetById(NancyContext context, long? petId);
+
+ ///
+ ///
+ ///
+ /// Context of request
+ /// Pet object that needs to be added to the store (optional)
+ ///
+ void UpdatePet(NancyContext context, Pet body);
+
+ ///
+ ///
+ ///
+ /// Context of request
+ /// ID of pet that needs to be updated
+ /// Updated name of the pet (optional)
+ /// Updated status of the pet (optional)
+ ///
+ void UpdatePetWithForm(NancyContext context, string petId, string name, string status);
+
+ ///
+ ///
+ ///
+ /// Context of request
+ /// ID of pet to update
+ /// Additional data to pass to server (optional)
+ /// file to upload (optional)
+ ///
+ void UploadFile(NancyContext context, long? petId, string additionalMetadata, System.IO.Stream file);
+ }
+
+ ///
+ /// Abstraction of PetService.
+ ///
+ public abstract class AbstractPetService: PetService
+ {
+ public virtual void AddPet(NancyContext context, Pet body)
+ {
+ AddPet(body);
+ }
+
+ public virtual void DeletePet(NancyContext context, long? petId, string apiKey)
+ {
+ DeletePet(petId, apiKey);
+ }
+
+ public virtual List FindPetsByStatus(NancyContext context, List status)
+ {
+ return FindPetsByStatus(status);
+ }
+
+ public virtual List FindPetsByTags(NancyContext context, List tags)
+ {
+ return FindPetsByTags(tags);
+ }
+
+ public virtual Pet GetPetById(NancyContext context, long? petId)
+ {
+ return GetPetById(petId);
+ }
+
+ public virtual void UpdatePet(NancyContext context, Pet body)
+ {
+ UpdatePet(body);
+ }
+
+ public virtual void UpdatePetWithForm(NancyContext context, string petId, string name, string status)
+ {
+ UpdatePetWithForm(petId, name, status);
+ }
+
+ public virtual void UploadFile(NancyContext context, long? petId, string additionalMetadata, System.IO.Stream file)
+ {
+ UploadFile(petId, additionalMetadata, file);
+ }
+
+ protected abstract void AddPet(Pet body);
+
+ protected abstract void DeletePet(long? petId, string apiKey);
+
+ protected abstract List FindPetsByStatus(List status);
+
+ protected abstract List FindPetsByTags(List tags);
+
+ protected abstract Pet GetPetById(long? petId);
+
+ protected abstract void UpdatePet(Pet body);
+
+ protected abstract void UpdatePetWithForm(string petId, string name, string status);
+
+ protected abstract void UploadFile(long? petId, string additionalMetadata, System.IO.Stream file);
+ }
+
+}
diff --git a/samples/server/petstore/nancyfx/src/IO.Swagger/Modules/StoreModule.cs b/samples/server/petstore/nancyfx/src/IO.Swagger/Modules/StoreModule.cs
new file mode 100644
index 00000000000..06f397db408
--- /dev/null
+++ b/samples/server/petstore/nancyfx/src/IO.Swagger/Modules/StoreModule.cs
@@ -0,0 +1,126 @@
+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;
+
+namespace IO.Swagger.v2.Modules
+{
+
+ ///
+ /// Module processing requests of Store domain.
+ ///
+ public sealed class StoreModule : NancyModule
+ {
+ ///
+ /// Sets up HTTP methods mappings.
+ ///
+ /// Service handling requests
+ public StoreModule(StoreService service) : base("/v2")
+ {
+ Delete["/store/order/{orderId}"] = parameters =>
+ {
+ var orderId = Parameters.ValueOf(parameters, Context.Request, "orderId", ParameterType.Path);
+ Preconditions.IsNotNull(orderId, "Required parameter: 'orderId' is missing at 'DeleteOrder'");
+
+ service.DeleteOrder(Context, orderId);
+ return new Response { ContentType = "application/json"};
+ };
+
+ Get["/store/inventory"] = parameters =>
+ {
+
+ return service.GetInventory(Context);
+ };
+
+ Get["/store/order/{orderId}"] = parameters =>
+ {
+ var orderId = Parameters.ValueOf(parameters, Context.Request, "orderId", ParameterType.Path);
+ Preconditions.IsNotNull(orderId, "Required parameter: 'orderId' is missing at 'GetOrderById'");
+
+ return service.GetOrderById(Context, orderId);
+ };
+
+ Post["/store/order"] = parameters =>
+ {
+ var body = this.Bind();
+ return service.PlaceOrder(Context, body);
+ };
+ }
+ }
+
+ ///
+ /// Service handling Store requests.
+ ///
+ public interface StoreService
+ {
+ ///
+ /// For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors
+ ///
+ /// Context of request
+ /// ID of the order that needs to be deleted
+ ///
+ void DeleteOrder(NancyContext context, string orderId);
+
+ ///
+ /// Returns a map of status codes to quantities
+ ///
+ /// Context of request
+ /// Dictionary<string, int?>
+ Dictionary GetInventory(NancyContext context);
+
+ ///
+ /// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions
+ ///
+ /// Context of request
+ /// ID of pet that needs to be fetched
+ /// Order
+ Order GetOrderById(NancyContext context, string orderId);
+
+ ///
+ ///
+ ///
+ /// Context of request
+ /// order placed for purchasing the pet (optional)
+ /// Order
+ Order PlaceOrder(NancyContext context, Order body);
+ }
+
+ ///
+ /// Abstraction of StoreService.
+ ///
+ public abstract class AbstractStoreService: StoreService
+ {
+ public virtual void DeleteOrder(NancyContext context, string orderId)
+ {
+ DeleteOrder(orderId);
+ }
+
+ public virtual Dictionary GetInventory(NancyContext context)
+ {
+ return GetInventory();
+ }
+
+ public virtual Order GetOrderById(NancyContext context, string orderId)
+ {
+ return GetOrderById(orderId);
+ }
+
+ public virtual Order PlaceOrder(NancyContext context, Order body)
+ {
+ return PlaceOrder(body);
+ }
+
+ protected abstract void DeleteOrder(string orderId);
+
+ protected abstract Dictionary GetInventory();
+
+ protected abstract Order GetOrderById(string orderId);
+
+ protected abstract Order PlaceOrder(Order body);
+ }
+
+}
diff --git a/samples/server/petstore/nancyfx/src/IO.Swagger/Modules/UserModule.cs b/samples/server/petstore/nancyfx/src/IO.Swagger/Modules/UserModule.cs
new file mode 100644
index 00000000000..8350479ef12
--- /dev/null
+++ b/samples/server/petstore/nancyfx/src/IO.Swagger/Modules/UserModule.cs
@@ -0,0 +1,221 @@
+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;
+
+namespace IO.Swagger.v2.Modules
+{
+
+ ///
+ /// Module processing requests of User domain.
+ ///
+ public sealed class UserModule : NancyModule
+ {
+ ///
+ /// Sets up HTTP methods mappings.
+ ///
+ /// Service handling requests
+ public UserModule(UserService service) : base("/v2")
+ {
+ Post["/user"] = parameters =>
+ {
+ var body = this.Bind();
+ service.CreateUser(Context, body);
+ return new Response { ContentType = "application/json"};
+ };
+
+ Post["/user/createWithArray"] = parameters =>
+ {
+ var body = this.Bind>();
+ service.CreateUsersWithArrayInput(Context, body);
+ return new Response { ContentType = "application/json"};
+ };
+
+ Post["/user/createWithList"] = parameters =>
+ {
+ var body = this.Bind>();
+ service.CreateUsersWithListInput(Context, body);
+ return new Response { ContentType = "application/json"};
+ };
+
+ Delete["/user/{username}"] = parameters =>
+ {
+ var username = Parameters.ValueOf(parameters, Context.Request, "username", ParameterType.Path);
+ Preconditions.IsNotNull(username, "Required parameter: 'username' is missing at 'DeleteUser'");
+
+ service.DeleteUser(Context, username);
+ return new Response { ContentType = "application/json"};
+ };
+
+ Get["/user/{username}"] = parameters =>
+ {
+ var username = Parameters.ValueOf(parameters, Context.Request, "username", ParameterType.Path);
+ Preconditions.IsNotNull(username, "Required parameter: 'username' is missing at 'GetUserByName'");
+
+ return service.GetUserByName(Context, username);
+ };
+
+ Get["/user/login"] = parameters =>
+ {
+ var username = Parameters.ValueOf(parameters, Context.Request, "username", ParameterType.Query);
+ var password = Parameters.ValueOf(parameters, Context.Request, "password", ParameterType.Query);
+ return service.LoginUser(Context, username, password);
+ };
+
+ Get["/user/logout"] = parameters =>
+ {
+
+ service.LogoutUser(Context);
+ return new Response { ContentType = "application/json"};
+ };
+
+ Put["/user/{username}"] = parameters =>
+ {
+ var username = Parameters.ValueOf(parameters, Context.Request, "username", ParameterType.Path);
+ var body = this.Bind();
+ Preconditions.IsNotNull(username, "Required parameter: 'username' is missing at 'UpdateUser'");
+
+ service.UpdateUser(Context, username, body);
+ return new Response { ContentType = "application/json"};
+ };
+ }
+ }
+
+ ///
+ /// Service handling User requests.
+ ///
+ public interface UserService
+ {
+ ///
+ /// This can only be done by the logged in user.
+ ///
+ /// Context of request
+ /// Created user object (optional)
+ ///
+ void CreateUser(NancyContext context, User body);
+
+ ///
+ ///
+ ///
+ /// Context of request
+ /// List of user object (optional)
+ ///
+ void CreateUsersWithArrayInput(NancyContext context, List body);
+
+ ///
+ ///
+ ///
+ /// Context of request
+ /// List of user object (optional)
+ ///
+ void CreateUsersWithListInput(NancyContext context, List body);
+
+ ///
+ /// This can only be done by the logged in user.
+ ///
+ /// Context of request
+ /// The name that needs to be deleted
+ ///
+ void DeleteUser(NancyContext context, string username);
+
+ ///
+ ///
+ ///
+ /// Context of request
+ /// The name that needs to be fetched. Use user1 for testing.
+ /// User
+ User GetUserByName(NancyContext context, string username);
+
+ ///
+ ///
+ ///
+ /// Context of request
+ /// The user name for login (optional)
+ /// The password for login in clear text (optional)
+ /// string
+ string LoginUser(NancyContext context, string username, string password);
+
+ ///
+ ///
+ ///
+ /// Context of request
+ ///
+ void LogoutUser(NancyContext context);
+
+ ///
+ /// This can only be done by the logged in user.
+ ///
+ /// Context of request
+ /// name that need to be deleted
+ /// Updated user object (optional)
+ ///
+ void UpdateUser(NancyContext context, string username, User body);
+ }
+
+ ///
+ /// Abstraction of UserService.
+ ///
+ public abstract class AbstractUserService: UserService
+ {
+ public virtual void CreateUser(NancyContext context, User body)
+ {
+ CreateUser(body);
+ }
+
+ public virtual void CreateUsersWithArrayInput(NancyContext context, List body)
+ {
+ CreateUsersWithArrayInput(body);
+ }
+
+ public virtual void CreateUsersWithListInput(NancyContext context, List body)
+ {
+ CreateUsersWithListInput(body);
+ }
+
+ public virtual void DeleteUser(NancyContext context, string username)
+ {
+ DeleteUser(username);
+ }
+
+ public virtual User GetUserByName(NancyContext context, string username)
+ {
+ return GetUserByName(username);
+ }
+
+ public virtual string LoginUser(NancyContext context, string username, string password)
+ {
+ return LoginUser(username, password);
+ }
+
+ public virtual void LogoutUser(NancyContext context)
+ {
+ LogoutUser();
+ }
+
+ public virtual void UpdateUser(NancyContext context, string username, User body)
+ {
+ UpdateUser(username, body);
+ }
+
+ protected abstract void CreateUser(User body);
+
+ protected abstract void CreateUsersWithArrayInput(List body);
+
+ protected abstract void CreateUsersWithListInput(List body);
+
+ protected abstract void DeleteUser(string username);
+
+ protected abstract User GetUserByName(string username);
+
+ protected abstract string LoginUser(string username, string password);
+
+ protected abstract void LogoutUser();
+
+ protected abstract void UpdateUser(string username, User body);
+ }
+
+}
diff --git a/samples/server/petstore/nancyfx/src/IO.Swagger/Utils/Parameters.cs b/samples/server/petstore/nancyfx/src/IO.Swagger/Utils/Parameters.cs
new file mode 100644
index 00000000000..954683f095f
--- /dev/null
+++ b/samples/server/petstore/nancyfx/src/IO.Swagger/Utils/Parameters.cs
@@ -0,0 +1,414 @@
+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> Parsers = CreateParsers();
+
+ internal static TValue ValueOf(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(name, value);
+ }
+ return ValueOf(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(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(dynamic parameters, string name, string value, Type valueType, Request request, ParameterType parameterType)
+ {
+ var parser = Parsers.GetIfPresent(valueType);
+ if (parser != null)
+ {
+ return ParseValueUsing(name, value, valueType, parser);
+ }
+ if (parameterType == ParameterType.Path)
+ {
+ return DynamicValueOf(parameters, name);
+ }
+ if (parameterType == ParameterType.Query)
+ {
+ return DynamicValueOf(request.Query, name);
+ }
+ throw new InvalidOperationException(string.Format("Could not get value for {0} with type {1}", name, valueType));
+ }
+
+ private static TValue ParseValueUsing(string name, string value, Type valueType, Func 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(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> CreateParsers()
+ {
+ var parsers = ImmutableDictionary.CreateBuilder>();
+ parsers.Put(typeof(string), value => value);
+ parsers.Put(typeof(bool), SafeParse(bool.Parse));
+ parsers.Put(typeof(bool?), SafeParse(bool.Parse));
+ parsers.Put(typeof(byte), SafeParse(byte.Parse));
+ 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), value => value);
+ parsers.Put(typeof(ICollection), value => value);
+ parsers.Put(typeof(IList), value => value);
+ parsers.Put(typeof(List), value => value);
+ parsers.Put(typeof(ISet), value => value);
+ parsers.Put(typeof(HashSet), value => value);
+
+ parsers.Put(typeof(IEnumerable), ImmutableListParse(bool.Parse));
+ parsers.Put(typeof(ICollection), ImmutableListParse(bool.Parse));
+ parsers.Put(typeof(IList), ImmutableListParse(bool.Parse));
+ parsers.Put(typeof(List), ListParse(bool.Parse));
+ parsers.Put(typeof(ISet), ImmutableSetParse(bool.Parse));
+ parsers.Put(typeof(HashSet), SetParse(bool.Parse));
+
+ parsers.Put(typeof(IEnumerable), ImmutableListParse(byte.Parse));
+ parsers.Put(typeof(ICollection), ImmutableListParse(byte.Parse));
+ parsers.Put(typeof(IList), ImmutableListParse(byte.Parse));
+ parsers.Put(typeof(List), ListParse(byte.Parse));
+ parsers.Put(typeof(ISet), ImmutableSetParse(byte.Parse));
+ parsers.Put(typeof(HashSet), SetParse(byte.Parse));
+ parsers.Put(typeof(IEnumerable), ImmutableListParse(sbyte.Parse));
+ parsers.Put(typeof(ICollection), ImmutableListParse(sbyte.Parse));
+ parsers.Put(typeof(IList), ImmutableListParse(sbyte.Parse));
+ parsers.Put(typeof(List), ListParse(sbyte.Parse));
+ parsers.Put(typeof(ISet), ImmutableSetParse(sbyte.Parse));
+ parsers.Put(typeof(HashSet), SetParse(sbyte.Parse));
+
+ parsers.Put(typeof(IEnumerable), ImmutableListParse(short.Parse));
+ parsers.Put(typeof(ICollection), ImmutableListParse(short.Parse));
+ parsers.Put(typeof(IList), ImmutableListParse(short.Parse));
+ parsers.Put(typeof(List), ListParse(short.Parse));
+ parsers.Put(typeof(ISet), ImmutableSetParse(short.Parse));
+ parsers.Put(typeof(HashSet), SetParse(short.Parse));
+ parsers.Put(typeof(IEnumerable), ImmutableListParse(ushort.Parse));
+ parsers.Put(typeof(ICollection), ImmutableListParse(ushort.Parse));
+ parsers.Put(typeof(IList), ImmutableListParse(ushort.Parse));
+ parsers.Put(typeof(List), ListParse(ushort.Parse));
+ parsers.Put(typeof(ISet), ImmutableSetParse(ushort.Parse));
+ parsers.Put(typeof(HashSet), SetParse(ushort.Parse));
+
+ parsers.Put(typeof(IEnumerable), ImmutableListParse(int.Parse));
+ parsers.Put(typeof(ICollection), ImmutableListParse(int.Parse));
+ parsers.Put(typeof(IList), ImmutableListParse(int.Parse));
+ parsers.Put(typeof(List), ListParse(int.Parse));
+ parsers.Put(typeof(ISet), ImmutableSetParse(int.Parse));
+ parsers.Put(typeof(HashSet), SetParse(int.Parse));
+ parsers.Put(typeof(IEnumerable), ImmutableListParse(uint.Parse));
+ parsers.Put(typeof(ICollection), ImmutableListParse(uint.Parse));
+ parsers.Put(typeof(IList), ImmutableListParse(uint.Parse));
+ parsers.Put(typeof(List), ListParse(uint.Parse));
+ parsers.Put(typeof(ISet), ImmutableSetParse(uint.Parse));
+ parsers.Put(typeof(HashSet), SetParse(uint.Parse));
+
+ parsers.Put(typeof(IEnumerable), ImmutableListParse(long.Parse));
+ parsers.Put(typeof(ICollection), ImmutableListParse(long.Parse));
+ parsers.Put(typeof(IList), ImmutableListParse(long.Parse));
+ parsers.Put(typeof(List), ListParse(long.Parse));
+ parsers.Put(typeof(ISet), ImmutableSetParse(long.Parse));
+ parsers.Put(typeof(HashSet), SetParse(long.Parse));
+ parsers.Put(typeof(IEnumerable), ImmutableListParse(ulong.Parse));
+ parsers.Put(typeof(ICollection), ImmutableListParse(ulong.Parse));
+ parsers.Put(typeof(IList), ImmutableListParse(ulong.Parse));
+ parsers.Put(typeof(List), ListParse(ulong.Parse));
+ parsers.Put(typeof(ISet), ImmutableSetParse(ulong.Parse));
+ parsers.Put(typeof(HashSet), SetParse(ulong.Parse));
+
+ parsers.Put(typeof(IEnumerable), ImmutableListParse(float.Parse));
+ parsers.Put(typeof(ICollection), ImmutableListParse(float.Parse));
+ parsers.Put(typeof(IList), ImmutableListParse(float.Parse));
+ parsers.Put(typeof(List), ListParse(float.Parse));
+ parsers.Put(typeof(ISet), ImmutableSetParse(float.Parse));
+ parsers.Put(typeof(HashSet), SetParse(float.Parse));
+
+ parsers.Put(typeof(IEnumerable), ImmutableListParse(double.Parse));
+ parsers.Put(typeof(ICollection), ImmutableListParse(double.Parse));
+ parsers.Put(typeof(IList), ImmutableListParse(double.Parse));
+ parsers.Put(typeof(List), ListParse(double.Parse));
+ parsers.Put(typeof(ISet), ImmutableSetParse(double.Parse));
+ parsers.Put(typeof(HashSet), SetParse(double.Parse));
+
+ parsers.Put(typeof(IEnumerable), ImmutableListParse(decimal.Parse));
+ parsers.Put(typeof(ICollection), ImmutableListParse(decimal.Parse));
+ parsers.Put(typeof(IList), ImmutableListParse(decimal.Parse));
+ parsers.Put(typeof(List), ListParse(decimal.Parse));
+ parsers.Put(typeof(ISet), ImmutableSetParse(decimal.Parse));
+ parsers.Put(typeof(HashSet), SetParse(decimal.Parse));
+
+
+ parsers.Put(typeof(IEnumerable), ImmutableListParse(DateTime.Parse));
+ parsers.Put(typeof(ICollection), ImmutableListParse(DateTime.Parse));
+ parsers.Put(typeof(IList), ImmutableListParse(DateTime.Parse));
+ parsers.Put(typeof(List), ListParse(DateTime.Parse));
+ parsers.Put(typeof(ISet), ImmutableSetParse(DateTime.Parse));
+ parsers.Put(typeof(HashSet), SetParse(DateTime.Parse));
+
+ parsers.Put(typeof(IEnumerable), ImmutableListParse(TimeSpan.Parse));
+ parsers.Put(typeof(ICollection), ImmutableListParse(TimeSpan.Parse));
+ parsers.Put(typeof(IList), ImmutableListParse(TimeSpan.Parse));
+ parsers.Put(typeof(List), ListParse(TimeSpan.Parse));
+ parsers.Put(typeof(ISet), ImmutableSetParse(TimeSpan.Parse));
+ parsers.Put(typeof(HashSet), SetParse(TimeSpan.Parse));
+
+ return parsers.ToImmutableDictionary();
+ }
+
+ private static Func SafeParse(Func 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 ListParse(Func itemParser)
+ {
+ return parameter =>
+ {
+ if (string.IsNullOrEmpty(parameter.Value))
+ {
+ return new List();
+ }
+ var results = parameter.Value.Split(new[] { ',' }, StringSplitOptions.None)
+ .Where(it => it != null)
+ .Select(it => it.Trim())
+ .Select(itemParser)
+ .ToList();
+ return results;
+ };
+ }
+
+ private static Func ImmutableListParse(Func itemParser)
+ {
+ return parameter =>
+ {
+ if (string.IsNullOrEmpty(parameter.Value))
+ {
+ return Lists.EmptyList();
+ }
+ var results = parameter.Value.Split(new[] { ',' }, StringSplitOptions.None)
+ .Where(it => it != null)
+ .Select(it => it.Trim())
+ .Select(itemParser)
+ .ToImmutableList();
+ return results;
+ };
+ }
+
+ private static Func SetParse(Func itemParser)
+ {
+ return parameter =>
+ {
+ if (string.IsNullOrEmpty(parameter.Value))
+ {
+ return new HashSet();
+ }
+ var results = parameter.Value.Split(new[] { ',' }, StringSplitOptions.None)
+ .Where(it => it != null)
+ .Select(it => it.Trim())
+ .Select(itemParser)
+ .ToSet();
+ return results;
+ };
+ }
+
+ private static Func ImmutableSetParse(Func itemParser)
+ {
+ return parameter =>
+ {
+ if (string.IsNullOrEmpty(parameter.Value))
+ {
+ return Sets.EmptySet();
+ }
+ var results = parameter.Value.Split(new[] { ',' }, StringSplitOptions.None)
+ .Where(it => it != null)
+ .Select(it => it.Trim())
+ .Select(itemParser)
+ .ToImmutableHashSet();
+ return results;
+ };
+ }
+
+ private static 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 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
+ }
+}
\ No newline at end of file
diff --git a/samples/server/petstore/nancyfx/src/IO.Swagger/packages.config b/samples/server/petstore/nancyfx/src/IO.Swagger/packages.config
new file mode 100644
index 00000000000..6d8651cdcf4
--- /dev/null
+++ b/samples/server/petstore/nancyfx/src/IO.Swagger/packages.config
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file