diff --git a/experiments/.gitattributes b/experiments/.gitattributes new file mode 100755 index 0000000..c094dba --- /dev/null +++ b/experiments/.gitattributes @@ -0,0 +1,2 @@ +# This allows generated code to be indexed correctly +*.cs linguist-generated=false \ No newline at end of file diff --git a/experiments/.gitignore b/experiments/.gitignore new file mode 100755 index 0000000..b004ece --- /dev/null +++ b/experiments/.gitignore @@ -0,0 +1,3 @@ +obj/ +bin/ +debug/ diff --git a/experiments/README.md b/experiments/README.md index f40c2a7..cbe21d1 100644 --- a/experiments/README.md +++ b/experiments/README.md @@ -1 +1,16 @@ # experiments + + + + + + + + + + + + + + + diff --git a/experiments/RELEASES.md b/experiments/RELEASES.md new file mode 100644 index 0000000..b5e73f3 --- /dev/null +++ b/experiments/RELEASES.md @@ -0,0 +1,11 @@ + + +## 2023-10-30 01:23:31 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.wingspan.app/openapi/6470f38d65c260000c025474 +- Speakeasy CLI 1.109.0 (2.173.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [csharp v1.0.0] experiments +### Releases +- [NuGet v1.0.0] https://www.nuget.org/packages/WingspanExperiments/1.0.0 - experiments diff --git a/experiments/SDK.sln b/experiments/SDK.sln new file mode 100755 index 0000000..ffd5e35 --- /dev/null +++ b/experiments/SDK.sln @@ -0,0 +1,17 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SDK", "SDK\SDK.csproj", "{F0CE92B5-F3CC-45A2-AA83-118C38724EB1}" +EndProject + +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F0CE92B5-F3CC-45A2-AA83-118C38724EB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F0CE92B5-F3CC-45A2-AA83-118C38724EB1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0CE92B5-F3CC-45A2-AA83-118C38724EB1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F0CE92B5-F3CC-45A2-AA83-118C38724EB1}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal \ No newline at end of file diff --git a/experiments/SDK/Models/Operations/GetBenefitsEnrollmentIdRequest.cs b/experiments/SDK/Models/Operations/GetBenefitsEnrollmentIdRequest.cs new file mode 100755 index 0000000..72022d6 --- /dev/null +++ b/experiments/SDK/Models/Operations/GetBenefitsEnrollmentIdRequest.cs @@ -0,0 +1,24 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Operations +{ + using SDK.Utils; + + public class GetBenefitsEnrollmentIdRequest + { + + /// + /// Unique identifier + /// + [SpeakeasyMetadata("pathParam:style=simple,explode=false,name=id")] + public string Id { get; set; } = default!; + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Operations/GetBenefitsEnrollmentIdResponse.cs b/experiments/SDK/Models/Operations/GetBenefitsEnrollmentIdResponse.cs new file mode 100755 index 0000000..7102f97 --- /dev/null +++ b/experiments/SDK/Models/Operations/GetBenefitsEnrollmentIdResponse.cs @@ -0,0 +1,40 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Operations +{ + using SDK.Models.Shared; + using System.Net.Http; + using System; + + public class GetBenefitsEnrollmentIdResponse + { + + /// + /// HTTP response content type for this operation + /// + public string? ContentType { get; set; } = default!; + + /// + /// An Enrollment records + /// + public Enrollment? Enrollment { get; set; } + + /// + /// HTTP response status code for this operation + /// + public int StatusCode { get; set; } = default!; + + /// + /// Raw HTTP response; suitable for custom response parsing + /// + public HttpResponseMessage? RawResponse { get; set; } + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Operations/GetBenefitsPlanEnrollmentIdRequest.cs b/experiments/SDK/Models/Operations/GetBenefitsPlanEnrollmentIdRequest.cs new file mode 100755 index 0000000..f260ea5 --- /dev/null +++ b/experiments/SDK/Models/Operations/GetBenefitsPlanEnrollmentIdRequest.cs @@ -0,0 +1,24 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Operations +{ + using SDK.Utils; + + public class GetBenefitsPlanEnrollmentIdRequest + { + + /// + /// Unique identifier + /// + [SpeakeasyMetadata("pathParam:style=simple,explode=false,name=id")] + public string Id { get; set; } = default!; + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Operations/GetBenefitsPlanEnrollmentIdResponse.cs b/experiments/SDK/Models/Operations/GetBenefitsPlanEnrollmentIdResponse.cs new file mode 100755 index 0000000..731049c --- /dev/null +++ b/experiments/SDK/Models/Operations/GetBenefitsPlanEnrollmentIdResponse.cs @@ -0,0 +1,40 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Operations +{ + using SDK.Models.Shared; + using System.Net.Http; + using System; + + public class GetBenefitsPlanEnrollmentIdResponse + { + + /// + /// HTTP response content type for this operation + /// + public string? ContentType { get; set; } = default!; + + /// + /// An enrollment into a plan + /// + public PlanEnrollment? PlanEnrollment { get; set; } + + /// + /// HTTP response status code for this operation + /// + public int StatusCode { get; set; } = default!; + + /// + /// Raw HTTP response; suitable for custom response parsing + /// + public HttpResponseMessage? RawResponse { get; set; } + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Operations/GetBenefitsPlanEnrollmentResponse.cs b/experiments/SDK/Models/Operations/GetBenefitsPlanEnrollmentResponse.cs new file mode 100755 index 0000000..49f1c1a --- /dev/null +++ b/experiments/SDK/Models/Operations/GetBenefitsPlanEnrollmentResponse.cs @@ -0,0 +1,41 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Operations +{ + using SDK.Models.Shared; + using System.Collections.Generic; + using System.Net.Http; + using System; + + public class GetBenefitsPlanEnrollmentResponse + { + + /// + /// HTTP response content type for this operation + /// + public string? ContentType { get; set; } = default!; + + /// + /// List of plan enrollments for a member + /// + public List? PlanEnrollments { get; set; } + + /// + /// HTTP response status code for this operation + /// + public int StatusCode { get; set; } = default!; + + /// + /// Raw HTTP response; suitable for custom response parsing + /// + public HttpResponseMessage? RawResponse { get; set; } + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Operations/GetBenefitsServiceResponse.cs b/experiments/SDK/Models/Operations/GetBenefitsServiceResponse.cs new file mode 100755 index 0000000..9254f37 --- /dev/null +++ b/experiments/SDK/Models/Operations/GetBenefitsServiceResponse.cs @@ -0,0 +1,40 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Operations +{ + using SDK.Models.Shared; + using System.Net.Http; + using System; + + public class GetBenefitsServiceResponse + { + + /// + /// HTTP response content type for this operation + /// + public string? ContentType { get; set; } = default!; + + /// + /// Indicates status of service enablement + /// + public ServiceEnablementResponse? ServiceEnablementResponse { get; set; } + + /// + /// HTTP response status code for this operation + /// + public int StatusCode { get; set; } = default!; + + /// + /// Raw HTTP response; suitable for custom response parsing + /// + public HttpResponseMessage? RawResponse { get; set; } + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Operations/PatchBenefitsServiceIdRequest.cs b/experiments/SDK/Models/Operations/PatchBenefitsServiceIdRequest.cs new file mode 100755 index 0000000..0d09605 --- /dev/null +++ b/experiments/SDK/Models/Operations/PatchBenefitsServiceIdRequest.cs @@ -0,0 +1,28 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Operations +{ + using SDK.Models.Shared; + using SDK.Utils; + + public class PatchBenefitsServiceIdRequest + { + + /// + /// Unique identifier + /// + [SpeakeasyMetadata("pathParam:style=simple,explode=false,name=id")] + public string Id { get; set; } = default!; + + [SpeakeasyMetadata("request:mediaType=application/json")] + public ServiceEnablementUpdate? ServiceEnablementUpdate { get; set; } + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Operations/PatchBenefitsServiceIdResponse.cs b/experiments/SDK/Models/Operations/PatchBenefitsServiceIdResponse.cs new file mode 100755 index 0000000..8acd27b --- /dev/null +++ b/experiments/SDK/Models/Operations/PatchBenefitsServiceIdResponse.cs @@ -0,0 +1,40 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Operations +{ + using SDK.Models.Shared; + using System.Net.Http; + using System; + + public class PatchBenefitsServiceIdResponse + { + + /// + /// HTTP response content type for this operation + /// + public string? ContentType { get; set; } = default!; + + /// + /// Indicates status of service enablement + /// + public ServiceEnablementResponse? ServiceEnablementResponse { get; set; } + + /// + /// HTTP response status code for this operation + /// + public int StatusCode { get; set; } = default!; + + /// + /// Raw HTTP response; suitable for custom response parsing + /// + public HttpResponseMessage? RawResponse { get; set; } + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Shared/A71f30be878693b235f8c5f1650be03c9920ca9821526545760476436104c9dc.cs b/experiments/SDK/Models/Shared/A71f30be878693b235f8c5f1650be03c9920ca9821526545760476436104c9dc.cs new file mode 100755 index 0000000..76465e1 --- /dev/null +++ b/experiments/SDK/Models/Shared/A71f30be878693b235f8c5f1650be03c9920ca9821526545760476436104c9dc.cs @@ -0,0 +1,21 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Shared +{ + using Newtonsoft.Json; + + public class A71f30be878693b235f8c5f1650be03c9920ca9821526545760476436104c9dc + { + + [JsonProperty("deductionIds")] + public object DeductionIds { get; set; } = default!; + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329.cs b/experiments/SDK/Models/Shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329.cs new file mode 100755 index 0000000..5be1f95 --- /dev/null +++ b/experiments/SDK/Models/Shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329.cs @@ -0,0 +1,30 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Shared +{ + using Newtonsoft.Json; + + public class E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329 + { + + [JsonProperty("effectiveDate")] + public string EffectiveDate { get; set; } = default!; + + [JsonProperty("groupNumber")] + public string GroupNumber { get; set; } = default!; + + [JsonProperty("memberNumber")] + public string MemberNumber { get; set; } = default!; + + [JsonProperty("status")] + public E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status Status { get; set; } = default!; + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status.cs b/experiments/SDK/Models/Shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status.cs new file mode 100755 index 0000000..3613ab4 --- /dev/null +++ b/experiments/SDK/Models/Shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status.cs @@ -0,0 +1,58 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Shared +{ + using Newtonsoft.Json; + using System; + + public enum E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status + { + [JsonProperty("Active")] + Active, + [JsonProperty("Paused")] + Paused, + [JsonProperty("Disabled")] + Disabled, + } + + public static class E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329StatusExtension + { + public static string Value(this E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status value) + { + return ((JsonPropertyAttribute)value.GetType().GetMember(value.ToString())[0].GetCustomAttributes(typeof(JsonPropertyAttribute), false)[0]).PropertyName ?? value.ToString(); + } + + public static E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status ToEnum(this string value) + { + foreach(var field in typeof(E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status).GetFields()) + { + var attributes = field.GetCustomAttributes(typeof(JsonPropertyAttribute), false); + if (attributes.Length == 0) + { + continue; + } + + var attribute = attributes[0] as JsonPropertyAttribute; + if (attribute != null && attribute.PropertyName == value) + { + var enumVal = field.GetValue(null); + + if (enumVal is E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status) + { + return (E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status)enumVal; + } + } + } + + throw new Exception($"Unknown value {value} for enum E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status"); + } + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Shared/Enrollment.cs b/experiments/SDK/Models/Shared/Enrollment.cs new file mode 100755 index 0000000..bbe9889 --- /dev/null +++ b/experiments/SDK/Models/Shared/Enrollment.cs @@ -0,0 +1,24 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Shared +{ + using Newtonsoft.Json; + + public class Enrollment + { + + [JsonProperty("memberId")] + public string MemberId { get; set; } = default!; + + [JsonProperty("wingspanBenefits")] + public E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329 WingspanBenefits { get; set; } = default!; + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Shared/PlanEnrollment.cs b/experiments/SDK/Models/Shared/PlanEnrollment.cs new file mode 100755 index 0000000..c609884 --- /dev/null +++ b/experiments/SDK/Models/Shared/PlanEnrollment.cs @@ -0,0 +1,67 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Shared +{ + using Newtonsoft.Json; + using System.Collections.Generic; + + public class PlanEnrollment + { + + [JsonProperty("coverageMonths")] + public List CoverageMonths { get; set; } = default!; + + [JsonProperty("createdAt")] + public string CreatedAt { get; set; } = default!; + + [JsonProperty("currency")] + public object Currency { get; set; } = default!; + + [JsonProperty("effectiveDate")] + public string EffectiveDate { get; set; } = default!; + + [JsonProperty("endDate")] + public string? EndDate { get; set; } + + [JsonProperty("eventActors")] + public Dictionary EventActors { get; set; } = default!; + + [JsonProperty("labels")] + public Dictionary Labels { get; set; } = default!; + + [JsonProperty("memberId")] + public string MemberId { get; set; } = default!; + + [JsonProperty("monthlyPremium")] + public double MonthlyPremium { get; set; } = default!; + + [JsonProperty("name")] + public string Name { get; set; } = default!; + + [JsonProperty("planEnrollmentId")] + public string PlanEnrollmentId { get; set; } = default!; + + [JsonProperty("planType")] + public PlanEnrollmentPlanType PlanType { get; set; } = default!; + + [JsonProperty("sku")] + public string Sku { get; set; } = default!; + + [JsonProperty("status")] + public PlanEnrollmentStatus Status { get; set; } = default!; + + [JsonProperty("updatedAt")] + public string UpdatedAt { get; set; } = default!; + + [JsonProperty("userRoles")] + public UserRoles UserRoles { get; set; } = default!; + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Shared/PlanEnrollmentCoverageMonth.cs b/experiments/SDK/Models/Shared/PlanEnrollmentCoverageMonth.cs new file mode 100755 index 0000000..85ade82 --- /dev/null +++ b/experiments/SDK/Models/Shared/PlanEnrollmentCoverageMonth.cs @@ -0,0 +1,30 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Shared +{ + using Newtonsoft.Json; + + public class PlanEnrollmentCoverageMonth + { + + [JsonProperty("amountCharged")] + public double AmountCharged { get; set; } = default!; + + [JsonProperty("fundingStatus")] + public PlanEnrollmentCoverageMonthFundingStatus FundingStatus { get; set; } = default!; + + [JsonProperty("internal")] + public A71f30be878693b235f8c5f1650be03c9920ca9821526545760476436104c9dc Internal { get; set; } = default!; + + [JsonProperty("month")] + public string Month { get; set; } = default!; + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Shared/PlanEnrollmentCoverageMonthFundingStatus.cs b/experiments/SDK/Models/Shared/PlanEnrollmentCoverageMonthFundingStatus.cs new file mode 100755 index 0000000..66e4631 --- /dev/null +++ b/experiments/SDK/Models/Shared/PlanEnrollmentCoverageMonthFundingStatus.cs @@ -0,0 +1,56 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Shared +{ + using Newtonsoft.Json; + using System; + + public enum PlanEnrollmentCoverageMonthFundingStatus + { + [JsonProperty("Pending")] + Pending, + [JsonProperty("Complete")] + Complete, + } + + public static class PlanEnrollmentCoverageMonthFundingStatusExtension + { + public static string Value(this PlanEnrollmentCoverageMonthFundingStatus value) + { + return ((JsonPropertyAttribute)value.GetType().GetMember(value.ToString())[0].GetCustomAttributes(typeof(JsonPropertyAttribute), false)[0]).PropertyName ?? value.ToString(); + } + + public static PlanEnrollmentCoverageMonthFundingStatus ToEnum(this string value) + { + foreach(var field in typeof(PlanEnrollmentCoverageMonthFundingStatus).GetFields()) + { + var attributes = field.GetCustomAttributes(typeof(JsonPropertyAttribute), false); + if (attributes.Length == 0) + { + continue; + } + + var attribute = attributes[0] as JsonPropertyAttribute; + if (attribute != null && attribute.PropertyName == value) + { + var enumVal = field.GetValue(null); + + if (enumVal is PlanEnrollmentCoverageMonthFundingStatus) + { + return (PlanEnrollmentCoverageMonthFundingStatus)enumVal; + } + } + } + + throw new Exception($"Unknown value {value} for enum PlanEnrollmentCoverageMonthFundingStatus"); + } + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Shared/PlanEnrollmentPlanType.cs b/experiments/SDK/Models/Shared/PlanEnrollmentPlanType.cs new file mode 100755 index 0000000..7b8f84c --- /dev/null +++ b/experiments/SDK/Models/Shared/PlanEnrollmentPlanType.cs @@ -0,0 +1,54 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Shared +{ + using Newtonsoft.Json; + using System; + + public enum PlanEnrollmentPlanType + { + [JsonProperty("MeridioHealth")] + MeridioHealth, + } + + public static class PlanEnrollmentPlanTypeExtension + { + public static string Value(this PlanEnrollmentPlanType value) + { + return ((JsonPropertyAttribute)value.GetType().GetMember(value.ToString())[0].GetCustomAttributes(typeof(JsonPropertyAttribute), false)[0]).PropertyName ?? value.ToString(); + } + + public static PlanEnrollmentPlanType ToEnum(this string value) + { + foreach(var field in typeof(PlanEnrollmentPlanType).GetFields()) + { + var attributes = field.GetCustomAttributes(typeof(JsonPropertyAttribute), false); + if (attributes.Length == 0) + { + continue; + } + + var attribute = attributes[0] as JsonPropertyAttribute; + if (attribute != null && attribute.PropertyName == value) + { + var enumVal = field.GetValue(null); + + if (enumVal is PlanEnrollmentPlanType) + { + return (PlanEnrollmentPlanType)enumVal; + } + } + } + + throw new Exception($"Unknown value {value} for enum PlanEnrollmentPlanType"); + } + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Shared/PlanEnrollmentStatus.cs b/experiments/SDK/Models/Shared/PlanEnrollmentStatus.cs new file mode 100755 index 0000000..d8043ff --- /dev/null +++ b/experiments/SDK/Models/Shared/PlanEnrollmentStatus.cs @@ -0,0 +1,58 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Shared +{ + using Newtonsoft.Json; + using System; + + public enum PlanEnrollmentStatus + { + [JsonProperty("Pending")] + Pending, + [JsonProperty("Active")] + Active, + [JsonProperty("Terminated")] + Terminated, + } + + public static class PlanEnrollmentStatusExtension + { + public static string Value(this PlanEnrollmentStatus value) + { + return ((JsonPropertyAttribute)value.GetType().GetMember(value.ToString())[0].GetCustomAttributes(typeof(JsonPropertyAttribute), false)[0]).PropertyName ?? value.ToString(); + } + + public static PlanEnrollmentStatus ToEnum(this string value) + { + foreach(var field in typeof(PlanEnrollmentStatus).GetFields()) + { + var attributes = field.GetCustomAttributes(typeof(JsonPropertyAttribute), false); + if (attributes.Length == 0) + { + continue; + } + + var attribute = attributes[0] as JsonPropertyAttribute; + if (attribute != null && attribute.PropertyName == value) + { + var enumVal = field.GetValue(null); + + if (enumVal is PlanEnrollmentStatus) + { + return (PlanEnrollmentStatus)enumVal; + } + } + } + + throw new Exception($"Unknown value {value} for enum PlanEnrollmentStatus"); + } + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Shared/ServiceEnablementResponse.cs b/experiments/SDK/Models/Shared/ServiceEnablementResponse.cs new file mode 100755 index 0000000..bd4f458 --- /dev/null +++ b/experiments/SDK/Models/Shared/ServiceEnablementResponse.cs @@ -0,0 +1,28 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Shared +{ + using Newtonsoft.Json; + using System.Collections.Generic; + + public class ServiceEnablementResponse + { + + [JsonProperty("enabled")] + public bool Enabled { get; set; } = default!; + + [JsonProperty("missingProperties")] + public List? MissingProperties { get; set; } + + [JsonProperty("serviceState")] + public ServiceEnablementResponseServiceState ServiceState { get; set; } = default!; + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Shared/ServiceEnablementResponseServiceState.cs b/experiments/SDK/Models/Shared/ServiceEnablementResponseServiceState.cs new file mode 100755 index 0000000..499b3f5 --- /dev/null +++ b/experiments/SDK/Models/Shared/ServiceEnablementResponseServiceState.cs @@ -0,0 +1,58 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Shared +{ + using Newtonsoft.Json; + using System; + + public enum ServiceEnablementResponseServiceState + { + [JsonProperty("Disabled")] + Disabled, + [JsonProperty("Enabled")] + Enabled, + [JsonProperty("Pending")] + Pending, + } + + public static class ServiceEnablementResponseServiceStateExtension + { + public static string Value(this ServiceEnablementResponseServiceState value) + { + return ((JsonPropertyAttribute)value.GetType().GetMember(value.ToString())[0].GetCustomAttributes(typeof(JsonPropertyAttribute), false)[0]).PropertyName ?? value.ToString(); + } + + public static ServiceEnablementResponseServiceState ToEnum(this string value) + { + foreach(var field in typeof(ServiceEnablementResponseServiceState).GetFields()) + { + var attributes = field.GetCustomAttributes(typeof(JsonPropertyAttribute), false); + if (attributes.Length == 0) + { + continue; + } + + var attribute = attributes[0] as JsonPropertyAttribute; + if (attribute != null && attribute.PropertyName == value) + { + var enumVal = field.GetValue(null); + + if (enumVal is ServiceEnablementResponseServiceState) + { + return (ServiceEnablementResponseServiceState)enumVal; + } + } + } + + throw new Exception($"Unknown value {value} for enum ServiceEnablementResponseServiceState"); + } + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Shared/ServiceEnablementUpdate.cs b/experiments/SDK/Models/Shared/ServiceEnablementUpdate.cs new file mode 100755 index 0000000..24aa857 --- /dev/null +++ b/experiments/SDK/Models/Shared/ServiceEnablementUpdate.cs @@ -0,0 +1,21 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Shared +{ + using Newtonsoft.Json; + + public class ServiceEnablementUpdate + { + + [JsonProperty("enabled")] + public bool Enabled { get; set; } = default!; + } +} \ No newline at end of file diff --git a/experiments/SDK/Models/Shared/UserRoles.cs b/experiments/SDK/Models/Shared/UserRoles.cs new file mode 100755 index 0000000..79f3579 --- /dev/null +++ b/experiments/SDK/Models/Shared/UserRoles.cs @@ -0,0 +1,25 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Models.Shared +{ + using Newtonsoft.Json; + using System.Collections.Generic; + + public class UserRoles + { + + [JsonProperty("ownerIds")] + public List OwnerIds { get; set; } = default!; + + [JsonProperty("viewerIds")] + public List ViewerIds { get; set; } = default!; + } +} \ No newline at end of file diff --git a/experiments/SDK/SDK.csproj b/experiments/SDK/SDK.csproj new file mode 100755 index 0000000..4db4bae --- /dev/null +++ b/experiments/SDK/SDK.csproj @@ -0,0 +1,22 @@ + + + true + WingspanExperiments + 1.0.0 + Wingspan Networks, Inc. + net5.0 + enable + README.md + true + 1591 + https://github.com/wingspanHQ/client-sdk-csharp + + + + + + + + + + diff --git a/experiments/SDK/SDKSDK.cs b/experiments/SDK/SDKSDK.cs new file mode 100755 index 0000000..26e87c6 --- /dev/null +++ b/experiments/SDK/SDKSDK.cs @@ -0,0 +1,318 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK +{ + using Newtonsoft.Json; + using SDK.Models.Operations; + using SDK.Models.Shared; + using SDK.Utils; + using System.Collections.Generic; + using System.Net.Http.Headers; + using System.Net.Http; + using System.Threading.Tasks; + using System; + + /// + /// Wingspan Benefits API: Benefits + /// + public interface ISDKSDK + { + + /// + /// Retrieve Enrollment Details for a Specific Member + /// + /// + /// Fetches the enrollment status and details for a member identified by the provided unique identifier. + /// + /// + Task GetBenefitsEnrollmentIdAsync(string id); + + /// + /// List all plan enrollments + /// + Task GetBenefitsPlanEnrollmentAsync(); + + /// + /// Get a particular plan enrollment by ID + /// + Task GetBenefitsPlanEnrollmentIdAsync(string id); + + /// + /// Retrieve Current Benefits Service Status + /// + /// + /// Fetches the current status indicating whether the benefits service is enabled or disabled. + /// + /// + Task GetBenefitsServiceAsync(); + + /// + /// Modify Benefits Service Status + /// + /// + /// Allows users to change the enablement status of a specified benefits service. + /// + /// + Task PatchBenefitsServiceIdAsync(string id, ServiceEnablementUpdate? serviceEnablementUpdate = null); + } + + public class SDKConfig + { + } + + /// + /// Wingspan Benefits API: Benefits + /// + public class SDKSDK: ISDKSDK + { + public SDKConfig Config { get; private set; } + public static List ServerList = new List() + { + "https://api.wingspan.app/benefits", + "https://stagingapi.wingspan.app/benefits", + }; + + private const string _language = "csharp"; + private const string _sdkVersion = "1.0.0"; + private const string _sdkGenVersion = "2.173.0"; + private const string _openapiDocVersion = "1.0.0"; + private const string _userAgent = "speakeasy-sdk/csharp 1.0.0 2.173.0 1.0.0 WingspanExperiments"; + private string _serverUrl = ""; + private ISpeakeasyHttpClient _defaultClient; + private ISpeakeasyHttpClient _securityClient; + + public SDKSDK(string? serverUrl = null, ISpeakeasyHttpClient? client = null) + { + _serverUrl = serverUrl ?? SDKSDK.ServerList[0]; + + _defaultClient = new SpeakeasyHttpClient(client); + _securityClient = _defaultClient; + + Config = new SDKConfig() + { + }; + + } + + public async Task GetBenefitsEnrollmentIdAsync(string id) + { + var request = new GetBenefitsEnrollmentIdRequest() + { + Id = id, + }; + string baseUrl = _serverUrl; + if (baseUrl.EndsWith("/")) + { + baseUrl = baseUrl.Substring(0, baseUrl.Length - 1); + } + var urlString = URLBuilder.Build(baseUrl, "/benefits/enrollment/{id}", request); + + + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); + httpRequest.Headers.Add("user-agent", _userAgent); + + + var client = _defaultClient; + + var httpResponse = await client.SendAsync(httpRequest); + + var contentType = httpResponse.Content.Headers.ContentType?.MediaType; + + var response = new GetBenefitsEnrollmentIdResponse + { + StatusCode = (int)httpResponse.StatusCode, + ContentType = contentType, + RawResponse = httpResponse + }; + + if((response.StatusCode == 200)) + { + if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) + { + response.Enrollment = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); + } + + return response; + } + return response; + } + + public async Task GetBenefitsPlanEnrollmentAsync() + { + string baseUrl = _serverUrl; + if (baseUrl.EndsWith("/")) + { + baseUrl = baseUrl.Substring(0, baseUrl.Length - 1); + } + var urlString = baseUrl + "/benefits/plan-enrollment"; + + + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); + httpRequest.Headers.Add("user-agent", _userAgent); + + + var client = _defaultClient; + + var httpResponse = await client.SendAsync(httpRequest); + + var contentType = httpResponse.Content.Headers.ContentType?.MediaType; + + var response = new GetBenefitsPlanEnrollmentResponse + { + StatusCode = (int)httpResponse.StatusCode, + ContentType = contentType, + RawResponse = httpResponse + }; + + if((response.StatusCode == 200)) + { + if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) + { + response.PlanEnrollments = JsonConvert.DeserializeObject>(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); + } + + return response; + } + return response; + } + + public async Task GetBenefitsPlanEnrollmentIdAsync(string id) + { + var request = new GetBenefitsPlanEnrollmentIdRequest() + { + Id = id, + }; + string baseUrl = _serverUrl; + if (baseUrl.EndsWith("/")) + { + baseUrl = baseUrl.Substring(0, baseUrl.Length - 1); + } + var urlString = URLBuilder.Build(baseUrl, "/benefits/plan-enrollment/{id}", request); + + + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); + httpRequest.Headers.Add("user-agent", _userAgent); + + + var client = _defaultClient; + + var httpResponse = await client.SendAsync(httpRequest); + + var contentType = httpResponse.Content.Headers.ContentType?.MediaType; + + var response = new GetBenefitsPlanEnrollmentIdResponse + { + StatusCode = (int)httpResponse.StatusCode, + ContentType = contentType, + RawResponse = httpResponse + }; + + if((response.StatusCode == 200)) + { + if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) + { + response.PlanEnrollment = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); + } + + return response; + } + return response; + } + + public async Task GetBenefitsServiceAsync() + { + string baseUrl = _serverUrl; + if (baseUrl.EndsWith("/")) + { + baseUrl = baseUrl.Substring(0, baseUrl.Length - 1); + } + var urlString = baseUrl + "/benefits/service"; + + + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); + httpRequest.Headers.Add("user-agent", _userAgent); + + + var client = _defaultClient; + + var httpResponse = await client.SendAsync(httpRequest); + + var contentType = httpResponse.Content.Headers.ContentType?.MediaType; + + var response = new GetBenefitsServiceResponse + { + StatusCode = (int)httpResponse.StatusCode, + ContentType = contentType, + RawResponse = httpResponse + }; + + if((response.StatusCode == 200)) + { + if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) + { + response.ServiceEnablementResponse = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); + } + + return response; + } + return response; + } + + public async Task PatchBenefitsServiceIdAsync(string id, ServiceEnablementUpdate? serviceEnablementUpdate = null) + { + var request = new PatchBenefitsServiceIdRequest() + { + Id = id, + ServiceEnablementUpdate = serviceEnablementUpdate, + }; + string baseUrl = _serverUrl; + if (baseUrl.EndsWith("/")) + { + baseUrl = baseUrl.Substring(0, baseUrl.Length - 1); + } + var urlString = URLBuilder.Build(baseUrl, "/benefits/service/{id}", request); + + + var httpRequest = new HttpRequestMessage(HttpMethod.Patch, urlString); + httpRequest.Headers.Add("user-agent", _userAgent); + + var serializedBody = RequestBodySerializer.Serialize(request, "ServiceEnablementUpdate", "json"); + if (serializedBody != null) + { + httpRequest.Content = serializedBody; + } + + var client = _defaultClient; + + var httpResponse = await client.SendAsync(httpRequest); + + var contentType = httpResponse.Content.Headers.ContentType?.MediaType; + + var response = new PatchBenefitsServiceIdResponse + { + StatusCode = (int)httpResponse.StatusCode, + ContentType = contentType, + RawResponse = httpResponse + }; + + if((response.StatusCode == 200)) + { + if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) + { + response.ServiceEnablementResponse = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); + } + + return response; + } + return response; + } + } +} diff --git a/experiments/SDK/Utils/BigIntSerializer.cs b/experiments/SDK/Utils/BigIntSerializer.cs new file mode 100755 index 0000000..c5c1867 --- /dev/null +++ b/experiments/SDK/Utils/BigIntSerializer.cs @@ -0,0 +1,50 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Utils +{ + using System; + using System.Globalization; + using System.Numerics; + using Newtonsoft.Json; + + internal class BigIntSerializer : JsonConverter + { + public override bool CanConvert(Type objectType) => objectType == typeof(BigInteger); + + public override bool CanRead => true; + + public override object? ReadJson( + JsonReader reader, + Type objectType, + object? existingValue, + JsonSerializer serializer + ) + { + if (reader.Value == null) + { + return null; + } + + return BigInteger.Parse(reader.Value.ToString()!); + } + + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteValue("null"); + return; + } + + writer.WriteValue(((BigInteger)value).ToString(CultureInfo.InvariantCulture)); + } + } +} diff --git a/experiments/SDK/Utils/DecimalSerializer.cs b/experiments/SDK/Utils/DecimalSerializer.cs new file mode 100755 index 0000000..0f4e779 --- /dev/null +++ b/experiments/SDK/Utils/DecimalSerializer.cs @@ -0,0 +1,49 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Utils +{ + using System; + using System.Globalization; + using Newtonsoft.Json; + + internal class DecimalSerializer : JsonConverter + { + public override bool CanConvert(Type objectType) => objectType == typeof(Decimal); + + public override bool CanRead => true; + + public override object? ReadJson( + JsonReader reader, + Type objectType, + object? existingValue, + JsonSerializer serializer + ) + { + if (reader.Value == null) + { + return null; + } + + return Decimal.Parse(reader.Value.ToString()!); + } + + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteValue("null"); + return; + } + + writer.WriteValue(((Decimal)value).ToString(CultureInfo.InvariantCulture)); + } + } +} diff --git a/experiments/SDK/Utils/EnumSerializer.cs b/experiments/SDK/Utils/EnumSerializer.cs new file mode 100755 index 0000000..bc6f068 --- /dev/null +++ b/experiments/SDK/Utils/EnumSerializer.cs @@ -0,0 +1,67 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +using System; +using Newtonsoft.Json; + +namespace SDK.Utils +{ + internal class EnumSerializer : JsonConverter + { + public override bool CanConvert(Type objectType) => objectType.IsEnum; + + public override bool CanRead => true; + + public override object? ReadJson( + JsonReader reader, + Type objectType, + object? existingValue, + JsonSerializer serializer + ) + { + if (reader.Value == null) + { + throw new ArgumentNullException(nameof(reader.Value)); + } + + var extensionType = Type.GetType(objectType.FullName + "Extension"); + if (extensionType == null) + { + return Enum.ToObject(objectType, reader.Value); + } + + var method = extensionType.GetMethod("ToEnum"); + if (method == null) + { + throw new Exception($"Unable to find ToEnum method on {extensionType.FullName}"); + } + + return method.Invoke(null, new[] { (string)reader.Value }); + } + + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteValue("null"); + return; + } + + var extensionType = Type.GetType(value.GetType().FullName + "Extension"); + if (extensionType == null) + { + writer.WriteValue(value); + return; + } + + writer.WriteValue(Utilities.ToString(value)); + } + } +} diff --git a/experiments/SDK/Utils/FlexibleObjectDeserializer.cs b/experiments/SDK/Utils/FlexibleObjectDeserializer.cs new file mode 100755 index 0000000..ac565c9 --- /dev/null +++ b/experiments/SDK/Utils/FlexibleObjectDeserializer.cs @@ -0,0 +1,44 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Utils +{ + using System; + using System.Linq; + using System.Collections.Generic; + using Newtonsoft.Json; + using Newtonsoft.Json.Linq; + + internal class FlexibleObjectDeserializer: JsonConverter + { + public override bool CanConvert(Type objectType) => + objectType == typeof(object); + + public override bool CanWrite => false; + + public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) + { + var token = JToken.ReadFrom(reader); + + if (token is JArray) + { + return new List(token.Select(t => + { + return t.ToString(); + })); + } + + return token.ToObject(objectType); + } + + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) => + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/experiments/SDK/Utils/HeaderSerializer.cs b/experiments/SDK/Utils/HeaderSerializer.cs new file mode 100755 index 0000000..dc57684 --- /dev/null +++ b/experiments/SDK/Utils/HeaderSerializer.cs @@ -0,0 +1,129 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Utils +{ + using System.Collections; + using System.Collections.Generic; + using System.Net.Http; + using System.Reflection; + + internal static class HeaderSerializer + { + public static void PopulateHeaders(ref HttpRequestMessage httpRequest, object? request) + { + if (request == null) + { + return; + } + + var props = request.GetType().GetProperties(); + + foreach (var prop in props) + { + var val = prop.GetValue(request); + if (val == null) + { + continue; + } + + var metadata = prop.GetCustomAttribute()?.GetHeaderMetadata(); + if (metadata == null || metadata.Name == "") + { + continue; + } + + var headerValue = SerializeHeader(val, metadata.Explode); + if (headerValue != "") + { + httpRequest.Headers.Add(metadata.Name, headerValue); + } + } + } + + private static string SerializeHeader(object value, bool explode) + { + if (Utilities.IsClass(value)) + { + var items = new List(); + + var props = value.GetType().GetProperties(); + + foreach (var prop in props) + { + var val = prop.GetValue(value); + if (val == null) + { + continue; + } + + var metadata = prop.GetCustomAttribute()?.GetHeaderMetadata(); + if (metadata == null || metadata.Name == null) + { + continue; + } + + if (explode) + { + items.Add($"{metadata.Name}={Utilities.ValueToString(val)}"); + } + else + { + items.Add(metadata.Name); + items.Add(Utilities.ValueToString(val)); + } + } + + return string.Join(",", items); + } + else if (Utilities.IsDictionary(value)) + { + var items = new List(); + + foreach (DictionaryEntry entry in (IDictionary)value) + { + var key = entry.Key?.ToString(); + + if (key == null) + { + continue; + } + + if (explode) + { + items.Add($"{key}={Utilities.ValueToString(entry.Value)}"); + } + else + { + items.Add(key); + items.Add(Utilities.ValueToString(entry.Value)); + } + } + + return string.Join(",", items); + } + else if (Utilities.IsList(value)) + { + var items = new List(); + + foreach (var item in (IList)value) + { + items.Add(Utilities.ValueToString(item)); + } + + return string.Join(",", items); + } + else + { + return Utilities.ValueToString(value); + } + } + } +} diff --git a/experiments/SDK/Utils/IsoDateTimeSerializer.cs b/experiments/SDK/Utils/IsoDateTimeSerializer.cs new file mode 100755 index 0000000..d671a00 --- /dev/null +++ b/experiments/SDK/Utils/IsoDateTimeSerializer.cs @@ -0,0 +1,41 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Utils +{ + using System; + using System.Globalization; + using Newtonsoft.Json; + + internal class IsoDateTimeSerializer: JsonConverter + { + public override bool CanConvert(Type objectType) => + objectType == typeof(DateTime); + + public override bool CanRead => false; + + public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) => + throw new NotImplementedException(); + + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteValue("null"); + return; + } + + DateTime time = (DateTime)value; + // The built-in Iso converter coerces to local time; + // This standardizes to UTC. + writer.WriteValue(time.ToUniversalTime().ToString("o", CultureInfo.InvariantCulture)); + } + } +} \ No newline at end of file diff --git a/experiments/SDK/Utils/RequestBodySerializer.cs b/experiments/SDK/Utils/RequestBodySerializer.cs new file mode 100755 index 0000000..d833e09 --- /dev/null +++ b/experiments/SDK/Utils/RequestBodySerializer.cs @@ -0,0 +1,502 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Utils +{ + using System; + using System.Collections; + using System.Collections.Generic; + using System.Net.Http; + using System.Reflection; + using System.Text; + + internal class RequestBodySerializer + { + public static HttpContent? Serialize( + object? request, + string requestFieldName, + string serializationMethod + ) + { + if (request == null) + { + return null; + } + + if (Utilities.IsClass(request)) + { + var prop = GetPropertyInfo(request, requestFieldName); + + if (prop != null) + { + var metadata = prop.GetCustomAttribute()?.GetRequestMetadata(); + if (metadata != null) + { + var fieldValue = prop.GetValue(request); + if (fieldValue == null) + { + return null; + } + + return TrySerialize( + fieldValue, + requestFieldName, + serializationMethod, + metadata.MediaType ?? "" + ); + } + } + } + + // Not an object or flattened request + return TrySerialize(request, requestFieldName, serializationMethod); + } + + private static HttpContent? TrySerialize( + object request, + string requestFieldName, + string serializationMethod, + string mediaType = "" + ) + { + if (mediaType == "") + { + mediaType = new Dictionary() + { + { "json", "application/json" }, + { "form", "application/x-www-form-urlencoded" }, + { "multipart", "multipart/form-data" }, + { "raw", "application/octet-stream" }, + { "string", "text/plain" }, + }[serializationMethod]; + } + + switch (serializationMethod) + { + case "json": + return SerializeJson(request, mediaType); + case "form": + return SerializeForm(request, requestFieldName, mediaType); + case "multipart": + return SerializeMultipart(request, mediaType); + default: + // if request is a byte array, use it directly otherwise encode + if (request.GetType() == typeof(byte[])) + { + return SerializeRaw((byte[])request, mediaType); + } + else if (request.GetType() == typeof(string)) + { + return SerializeString((string)request, mediaType); + } + else + { + throw new Exception( + "Cannot serialize request body of type " + + request.GetType().Name + + " with serialization method " + + serializationMethod + + "" + ); + } + } + } + + private static HttpContent SerializeJson(object request, string mediaType) + { + return new StringContent(Utilities.SerializeJSON(request), Encoding.UTF8, mediaType); + } + + private static HttpContent SerializeForm( + object request, + string requestFieldName, + string mediaType + ) + { + Dictionary> form = new Dictionary>(); + + if (Utilities.IsClass(request)) + { + var props = request.GetType().GetProperties(); + + foreach (var prop in props) + { + var val = prop.GetValue(request); + if (val == null) + { + continue; + } + + var metadata = prop.GetCustomAttribute()?.GetFormMetadata(); + if (metadata == null) + { + continue; + } + + if (metadata.Json) + { + var key = metadata.Name ?? prop.Name; + if (key == "") + { + continue; + } + + if (!form.ContainsKey(key)) + { + form.Add(key, new List()); + } + + form[key].Add(Utilities.SerializeJSON(val)); + } + else + { + switch (metadata.Style) + { + case "form": + SerializeFormValue( + metadata.Name ?? prop.Name, + metadata.Explode, + val, + ref form + ); + break; + default: + throw new Exception("Unsupported form style " + metadata.Style); + } + } + } + } + else if (Utilities.IsDictionary(request)) + { + foreach (var k in ((IDictionary)request).Keys) + { + var key = k?.ToString(); + + if (key == null) + { + continue; + } + + if (!form.ContainsKey(key)) + { + form.Add(key, new List()); + } + + form[key].Add(Utilities.ValueToString(((IDictionary)request)[key])); + } + } + else if (Utilities.IsList(request)) + { + foreach (var item in (IList)request) + { + if (!form.ContainsKey(requestFieldName)) + { + form.Add(requestFieldName, new List()); + } + + form[requestFieldName].Add(Utilities.ValueToString(item)); + } + } + else + { + throw new Exception( + "Cannot serialize form data from type " + request.GetType().Name + ); + } + + var formData = new List>(); + + foreach (var key in form.Keys) + { + foreach (var val in form[key]) + { + formData.Add( + new KeyValuePair( + key + (form[key].Count > 1 ? "[]" : ""), + val + ) + ); + } + } + + return new FormUrlEncodedContent(formData); + } + + private static HttpContent SerializeMultipart(object request, string mediaType) + { + var formData = new MultipartFormDataContent(); + + var properties = request.GetType().GetProperties(); + + foreach (var prop in properties) + { + var value = prop.GetValue(request); + if (value == null) + { + continue; + } + + var metadata = prop.GetCustomAttribute()?.GetMultipartFormMetadata(); + if (metadata == null) + { + continue; + } + + if (metadata.File) + { + if (!Utilities.IsClass(value)) + { + throw new Exception( + "Cannot serialize multipart file from type " + value.GetType().Name + ); + } + + var fileProps = value.GetType().GetProperties(); + + byte[]? content = null; + string fileName = ""; + string fieldName = ""; + + foreach (var fileProp in fileProps) + { + var fileMetadata = fileProp + .GetCustomAttribute() + ?.GetMultipartFormMetadata(); + if ( + fileMetadata == null + || (!fileMetadata.Content && fileMetadata.Name == "") + ) + { + continue; + } + + if (fileMetadata.Content) + { + content = (byte[]?)fileProp.GetValue(value); + } + else + { + fieldName = fileMetadata.Name ?? fileProp.Name; + fileName = fileProp.GetValue(value)?.ToString() ?? ""; + } + } + + if (fieldName == "" || fileName == "" || content == null) + { + throw new Exception("Invalid multipart/form-data file"); + } + + formData.Add(new ByteArrayContent(content), fieldName, fileName); + } + else if (metadata.Json) + { + formData.Add( + new StringContent(Utilities.SerializeJSON(value)), + metadata.Name ?? prop.Name + ); + } + else if (Utilities.IsList(value)) + { + var values = new List(); + + foreach (var item in (IList)value) + { + values.Add(Utilities.ValueToString(item)); + } + + foreach (var val in values) + { + formData.Add(new StringContent(val), metadata.Name ?? prop.Name); + } + } + else + { + formData.Add( + new StringContent(Utilities.ValueToString(value)), + metadata.Name ?? prop.Name + ); + } + } + + return formData; + } + + private static HttpContent SerializeRaw(byte[] request, string mediaType) + { + var content = new ByteArrayContent(request); + content.Headers.Add("Content-Type", mediaType); + return content; + } + + private static HttpContent SerializeString(string request, string mediaType) + { + return new StringContent(request, Encoding.UTF8, mediaType); + } + + private static void SerializeFormValue( + string fieldName, + bool explode, + object value, + ref Dictionary> form + ) + { + if (Utilities.IsClass(value)) + { + if (Utilities.IsDate(value)) + { + if (!form.ContainsKey(fieldName)) + { + form[fieldName] = new List(); + } + + form[fieldName].Add(Utilities.ValueToString(value)); + } + else + { + var props = value.GetType().GetProperties(); + + var items = new List(); + + foreach (var prop in props) + { + var val = prop.GetValue(value); + if (val == null) + { + continue; + } + + var metadata = prop.GetCustomAttribute()?.GetFormMetadata(); + if (metadata == null || metadata.Name == null) + { + continue; + } + + if (explode) + { + if (!form.ContainsKey(metadata.Name)) + { + form[metadata.Name] = new List(); + } + + form[metadata.Name].Add(Utilities.ValueToString(val)); + } + else + { + items.Add($"{metadata.Name},{Utilities.ValueToString(val)}"); + } + } + + if (items.Count > 0) + { + if (!form.ContainsKey(fieldName)) + { + form[fieldName] = new List(); + } + + form[fieldName].Add(string.Join(",", items)); + } + } + } + else if (Utilities.IsDictionary(value)) + { + var items = new List(); + + foreach (var k in ((IDictionary)value).Keys) + { + var key = k?.ToString(); + + if (key == null) + { + continue; + } + + if (explode) + { + if (!form.ContainsKey(key)) + { + form[key] = new List(); + } + + form[key].Add( + Utilities.ValueToString(((IDictionary)value)[key]) + ); + } + else + { + items.Add($"{key},{Utilities.ValueToString(((IDictionary)value)[key])}"); + } + } + + if (items.Count > 0) + { + if (!form.ContainsKey(fieldName)) + { + form[fieldName] = new List(); + } + + form[fieldName].Add(string.Join(",", items)); + } + } + else if (Utilities.IsList(value)) + { + var values = new List(); + var items = new List(); + + foreach (var item in (IList)value) + { + if (explode) + { + values.Add(Utilities.ValueToString(item)); + } + else + { + items.Add(Utilities.ValueToString(item)); + } + } + + if (items.Count > 0) + { + values.Add(string.Join(",", items)); + } + + foreach (var val in values) + { + if (!form.ContainsKey(fieldName)) + { + form[fieldName] = new List(); + } + + form[fieldName].Add(val); + } + } + else + { + if (!form.ContainsKey(fieldName)) + { + form[fieldName] = new List(); + } + + form[fieldName].Add(Utilities.ValueToString(value)); + } + } + + private static PropertyInfo? GetPropertyInfo(object value, string propertyName) + { + try + { + return value.GetType().GetProperty(propertyName); + } + catch (Exception) + { + return null; + } + } + } +} \ No newline at end of file diff --git a/experiments/SDK/Utils/SecuritySerializer.cs b/experiments/SDK/Utils/SecuritySerializer.cs new file mode 100755 index 0000000..5cc3147 --- /dev/null +++ b/experiments/SDK/Utils/SecuritySerializer.cs @@ -0,0 +1,227 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Utils +{ + using System; + using System.Reflection; + using System.Text; + + internal static class SecuritySerializer + { + public static ISpeakeasyHttpClient Apply(ISpeakeasyHttpClient client, object security) + { + if (security == null) + { + return client; + } + + client = new SpeakeasyHttpClient(client); + + var props = security.GetType().GetProperties(); + + foreach (var prop in props) + { + var value = prop.GetValue(security, null); + + if (value == null) + { + continue; + } + + var metadata = prop.GetCustomAttribute()?.GetSecurityMetadata(); + if (metadata == null) + { + continue; + } + + if (metadata.Option) + { + ApplyOption(ref client, value); + } + else if (metadata.Scheme) + { + if (metadata.SubType == "basic" && !Utilities.IsClass(value)) + { + ApplyScheme(ref client, metadata, security); + return client; + } + else + { + ApplyScheme(ref client, metadata, value); + } + } + } + + return client; + } + + private static void ApplyOption(ref ISpeakeasyHttpClient client, object option) + { + var props = option.GetType().GetProperties(); + + foreach (var prop in props) + { + var value = prop.GetValue(option, null); + + if (value == null) + { + continue; + } + + var metadata = prop.GetCustomAttribute()?.GetSecurityMetadata(); + if (metadata == null || !metadata.Scheme) + { + continue; + } + + ApplyScheme(ref client, metadata, value); + } + } + + private static void ApplyScheme( + ref ISpeakeasyHttpClient client, + SpeakeasyMetadata.SecurityMetadata schemeMetadata, + object scheme + ) + { + if (Utilities.IsClass(scheme)) + { + if (schemeMetadata.Type == "http" && schemeMetadata.SubType == "basic") + { + ApplyBasicAuthScheme(ref client, scheme); + return; + } + + var props = scheme.GetType().GetProperties(); + + foreach (var prop in props) + { + var value = prop.GetValue(scheme, null); + + if (value == null) + { + continue; + } + + var metadata = prop.GetCustomAttribute()?.GetSecurityMetadata(); + if (metadata == null || metadata.Name == "") + { + continue; + } + + ApplySchemeValue(ref client, schemeMetadata, metadata, value); + } + } + else + { + ApplySchemeValue(ref client, schemeMetadata, schemeMetadata, scheme); + } + } + + private static void ApplySchemeValue( + ref ISpeakeasyHttpClient client, + SpeakeasyMetadata.SecurityMetadata schemeMetadata, + SpeakeasyMetadata.SecurityMetadata valueMetadata, + object value + ) + { + if (valueMetadata.Name == "") + { + return; + } + + switch (schemeMetadata.Type) + { + case "apiKey": + switch (schemeMetadata.SubType) + { + case "header": + client.AddHeader(valueMetadata.Name, Utilities.ValueToString(value)); + break; + case "query": + client.AddQueryParam( + valueMetadata.Name, + Utilities.ValueToString(value) + ); + break; + case "cookie": + client.AddHeader( + "cookie", + $"{valueMetadata.Name}={Utilities.ValueToString(value)}" + ); + break; + default: + throw new Exception( + $"Unknown apiKey subType: {schemeMetadata.SubType}" + ); + } + break; + case "openIdConnect": + client.AddHeader(valueMetadata.Name, Utilities.ValueToString(value)); + break; + case "oauth2": + client.AddHeader(valueMetadata.Name, Utilities.ValueToString(value)); + break; + case "http": + switch (schemeMetadata.SubType) + { + case "bearer": + client.AddHeader( + valueMetadata.Name, + Utilities.PrefixBearer(Utilities.ValueToString(value)) + ); + break; + default: + throw new Exception($"Unknown http subType: {schemeMetadata.SubType}"); + } + break; + default: + throw new Exception($"Unknown security type: {schemeMetadata.Type}"); + } + } + + private static void ApplyBasicAuthScheme(ref ISpeakeasyHttpClient client, object scheme) + { + var props = scheme.GetType().GetProperties(); + + string username = ""; + string password = ""; + + foreach (var prop in props) + { + var value = prop.GetValue(scheme, null); + + if (value == null) + { + continue; + } + + var metadata = prop.GetCustomAttribute()?.GetSecurityMetadata(); + if (metadata == null || metadata.Name == "") + { + continue; + } + + if (metadata.Name == "username") + { + username = Utilities.ValueToString(value); + } + else if (metadata.Name == "password") + { + password = Utilities.ValueToString(value); + } + } + + var auth = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}")); + client.AddHeader("Authorization", $"Basic {auth}"); + } + } +} diff --git a/experiments/SDK/Utils/SpeakeasyHttpClient.cs b/experiments/SDK/Utils/SpeakeasyHttpClient.cs new file mode 100755 index 0000000..4cfdc0b --- /dev/null +++ b/experiments/SDK/Utils/SpeakeasyHttpClient.cs @@ -0,0 +1,96 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Utils +{ + using System; + using System.Collections.Generic; + using System.Net.Http; + using System.Threading.Tasks; + + public interface ISpeakeasyHttpClient + { + void AddHeader(string key, string value); + void AddQueryParam(string key, string value); + Task SendAsync(HttpRequestMessage message); + } + + public class SpeakeasyHttpClient : ISpeakeasyHttpClient + { + private ISpeakeasyHttpClient? client; + + private Dictionary> headers { get; } = + new Dictionary>(); + + private Dictionary> queryParams { get; } = + new Dictionary>(); + + internal SpeakeasyHttpClient(ISpeakeasyHttpClient? client = null) + { + this.client = client; + } + + public void AddHeader(string key, string value) + { + if (headers.ContainsKey(key)) + { + headers[key].Add(value); + } + else + { + headers.Add(key, new List { value }); + } + } + + public void AddQueryParam(string key, string value) + { + if (queryParams.ContainsKey(key)) + { + queryParams[key].Add(value); + } + else + { + queryParams.Add(key, new List { value }); + } + } + + public async Task SendAsync(HttpRequestMessage message) + { + foreach(var hh in headers) + { + foreach(var hv in hh.Value) + { + message.Headers.Add(hh.Key, hv); + } + } + + /*var qp = URLBuilder.SerializeQueryParams(queryParams); + + if (qp != "") + { + if (message.uri.Query == "") + { + message.url += "?" + qp; + } + else + { + message.url += "&" + qp; + } + }*/ + + if (client != null) + { + return await client.SendAsync(message); + } + + return await new HttpClient().SendAsync(message); + } + } +} \ No newline at end of file diff --git a/experiments/SDK/Utils/SpeakeasyMetadata.cs b/experiments/SDK/Utils/SpeakeasyMetadata.cs new file mode 100755 index 0000000..da200e1 --- /dev/null +++ b/experiments/SDK/Utils/SpeakeasyMetadata.cs @@ -0,0 +1,243 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Utils +{ + using System; + using System.Collections.Generic; + + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] + internal class SpeakeasyMetadata : Attribute + { + internal class RequestMetadata + { + public string? MediaType { get; set; } = null; + } + + internal class FormMetadata + { + public string Style { get; set; } = "form"; + public bool Explode { get; set; } = true; + public bool Json { get; set; } = false; + public string Name { get; set; } = ""; + } + + internal class MultipartFormMetadata + { + public bool File { get; set; } = false; + public bool Content { get; set; } = false; + public bool Json { get; set; } = false; + public string Name { get; set; } = ""; + } + + internal class PathParamMetadata + { + public string Style { get; set; } = "simple"; + public bool Explode { get; set; } = false; + public string Name { get; set; } = ""; + public string? Serialization { get; set; } = null; + } + + internal class QueryParamMetadata + { + public string Style { get; set; } = "form"; + public bool Explode { get; set; } = true; + public string Name { get; set; } = ""; + public string? Serialization { get; set; } = null; + } + + internal class HeaderMetadata + { + public string Style { get; set; } = "simple"; + public bool Explode { get; set; } = false; + public string Name { get; set; } = ""; + } + + internal class SecurityMetadata + { + public string? Type { get; set; } = null; + public string? SubType { get; set; } = null; + public bool Option { get; set; } = false; + public bool Scheme { get; set; } = false; + public string Name { get; set; } = ""; + } + + public string Value { get; set; } + private Dictionary? metadata; + + public SpeakeasyMetadata(string value) + { + Value = value; + } + + public RequestMetadata? GetRequestMetadata() + { + if (GetMetadata().TryGetValue("request", out var value)) + { + var metadata = new RequestMetadata(); + + ParseMetadata(value, ref metadata); + + return metadata; + } + + return null; + } + + public FormMetadata? GetFormMetadata() + { + if (GetMetadata().TryGetValue("form", out var value)) + { + var metadata = new FormMetadata(); + + ParseMetadata(value, ref metadata); + + return metadata; + } + + return null; + } + + public MultipartFormMetadata? GetMultipartFormMetadata() + { + if (GetMetadata().TryGetValue("multipartForm", out var value)) + { + var metadata = new MultipartFormMetadata(); + + ParseMetadata(value, ref metadata); + + return metadata; + } + + return null; + } + + public PathParamMetadata? GetPathParamMetadata() + { + if (GetMetadata().TryGetValue("pathParam", out var value)) + { + var metadata = new PathParamMetadata(); + ParseMetadata(value, ref metadata); + return metadata; + } + + return null; + } + + public QueryParamMetadata? GetQueryParamMetadata() + { + if (GetMetadata().TryGetValue("queryParam", out var value)) + { + var metadata = new QueryParamMetadata(); + + ParseMetadata(value, ref metadata); + + return metadata; + } + + return null; + } + + public HeaderMetadata? GetHeaderMetadata() + { + if (GetMetadata().TryGetValue("header", out var value)) + { + var metadata = new HeaderMetadata(); + + ParseMetadata(value, ref metadata); + + return metadata; + } + + return null; + } + + public SecurityMetadata? GetSecurityMetadata() + { + if (GetMetadata().TryGetValue("security", out var value)) + { + var metadata = new SecurityMetadata(); + + ParseMetadata(value, ref metadata); + + return metadata; + } + + return null; + } + + private Dictionary GetMetadata() + { + if (metadata != null) + { + return metadata; + } + + metadata = new Dictionary(); + + var groups = Value.Split(" "); + + foreach (var group in groups) + { + var parts = group.Split(":"); + + if (parts.Length != 2) + { + continue; + } + + metadata.Add(parts[0], parts[1]); + } + + return metadata; + } + + private void ParseMetadata(string raw, ref T metadata) + { + Dictionary values = new Dictionary(); + + var groups = raw.Split(","); + + foreach (var group in groups) + { + var parts = group.Split("="); + var val = ""; + if (parts.Length == 2) + { + val = parts[1]; + } + + values.Add(parts[0], val); + } + + var props = typeof(T).GetProperties(); + + foreach (var prop in props) + { + if ( + values.TryGetValue( + char.ToLower(prop.Name[0]) + prop.Name.Substring(1), + out var value + ) + ) + { + if (prop.PropertyType == typeof(bool) || prop.PropertyType == typeof(Boolean)) + { + prop.SetValue(metadata, value == "true" || value == ""); + } + else + { + prop.SetValue(metadata, value); + } + } + } + } + } +} diff --git a/experiments/SDK/Utils/URLBuilder.cs b/experiments/SDK/Utils/URLBuilder.cs new file mode 100755 index 0000000..eb56107 --- /dev/null +++ b/experiments/SDK/Utils/URLBuilder.cs @@ -0,0 +1,589 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Utils +{ + using System; + using System.Collections; + using System.Collections.Generic; + using System.Net; + using System.Reflection; + + internal static class URLBuilder + { + public static string Build(string baseUrl, string path, object? request) + { + var url = baseUrl; + + if (url.EndsWith("/")) + { + url = url.Substring(0, url.Length - 1); + } + + url += path; + + var parameters = GetPathParameters(request); + + url = ReplaceParameters(url, parameters); + + var queryParams = SerializeQueryParams(TrySerializeQueryParams(request)); + + if (queryParams != "") + { + url += $"?{queryParams}"; + } + + return url; + } + + public static string ReplaceParameters(string url, Dictionary parameters) + { + foreach (var key in parameters.Keys) + { + url = url.Replace($"{{{key}}}", parameters[key]); + } + + return url; + } + + public static string SerializeQueryParams(Dictionary> queryParams) { + var queries = new List(); + + foreach (var key in queryParams.Keys) + { + foreach (var value in queryParams[key]) + { + queries.Add($"{key}={value}"); + } + } + + return string.Join("&", queries); + } + + private static Dictionary GetPathParameters(object? request) + { + var parameters = new Dictionary(); + + if (request == null) + { + return parameters; + } + + var props = request.GetType().GetProperties(); + + foreach (var prop in props) + { + var val = prop.GetValue(request); + + if (val == null) + { + continue; + } + + if (prop.GetCustomAttribute()?.GetRequestMetadata() != null) + { + continue; + } + + var metadata = prop.GetCustomAttribute()?.GetPathParamMetadata(); + + if (metadata == null) + { + continue; + } + + if (metadata.Serialization != null) + { + switch (metadata.Serialization) + { + case "json": + parameters.Add( + metadata.Name ?? prop.Name, + WebUtility.UrlEncode(Utilities.SerializeJSON(val)) + ); + break; + default: + throw new Exception( + $"Unknown serialization type: {metadata.Serialization}" + ); + } + } + else + { + switch (metadata.Style) + { + case "simple": + var simpleParams = SerializeSimplePathParams( + metadata.Name ?? prop.Name, + val, + metadata.Explode + ); + foreach (var key in simpleParams.Keys) + { + parameters.Add(key, simpleParams[key]); + } + break; + default: + throw new Exception($"Unsupported path param style: {metadata.Style}"); + } + } + } + + return parameters; + } + + private static Dictionary> TrySerializeQueryParams(object? request) + { + var parameters = new Dictionary>(); + + if (request == null) + { + return parameters; + } + + var props = request.GetType().GetProperties(); + + foreach (var prop in props) + { + var val = prop.GetValue(request); + + if (val == null) + { + continue; + } + + if (prop.GetCustomAttribute()?.GetRequestMetadata() != null) + { + continue; + } + + var metadata = prop.GetCustomAttribute()?.GetQueryParamMetadata(); + if (metadata == null) + { + continue; + } + + if (metadata.Serialization != null) + { + switch (metadata.Serialization) + { + case "json": + if (!parameters.ContainsKey(metadata.Name ?? prop.Name)) + { + parameters.Add(metadata.Name ?? prop.Name, new List()); + } + + parameters[metadata.Name ?? prop.Name].Add( + Utilities.SerializeJSON(val) + ); + break; + default: + throw new Exception( + $"Unknown serialization type: {metadata.Serialization}" + ); + } + } + else + { + switch (metadata.Style) + { + case "form": + var formParams = SerializeFormQueryParams( + metadata.Name ?? prop.Name, + val, + metadata.Explode, + "," + ); + foreach (var key in formParams.Keys) + { + if (!parameters.ContainsKey(key)) + { + parameters.Add(key, new List()); + } + + foreach (var v in formParams[key]) + { + parameters[key].Add(v); + } + } + break; + case "deepObject": + var deepObjParams = SerializeDeepObjectQueryParams( + metadata.Name ?? prop.Name, + val + ); + foreach (var key in deepObjParams.Keys) + { + if (!parameters.ContainsKey(key)) + { + parameters.Add(key, new List()); + } + + foreach (var v in deepObjParams[key]) + { + parameters[key].Add(v); + } + } + break; + case "pipeDelimited": + var pipeParams = SerializeFormQueryParams( + metadata.Name ?? prop.Name, + val, + metadata.Explode, + "|" + ); + foreach (var key in pipeParams.Keys) + { + if (!parameters.ContainsKey(key)) + { + parameters.Add(key, new List()); + } + + foreach (var v in pipeParams[key]) + { + parameters[key].Add(v); + } + } + break; + default: + throw new Exception($"Unsupported query param style: {metadata.Style}"); + } + } + } + + return parameters; + } + + private static Dictionary SerializeSimplePathParams( + string parentName, + object value, + bool explode + ) + { + var parameters = new Dictionary(); + + if (Utilities.IsClass(value)) + { + var vals = new List(); + + var props = value.GetType().GetProperties(); + + foreach (var prop in props) + { + var val = prop.GetValue(value); + + if (val == null) + { + continue; + } + + var metadata = prop.GetCustomAttribute()?.GetPathParamMetadata(); + if (metadata == null) + { + continue; + } + + if (explode) + { + vals.Add($"{metadata.Name}={Utilities.ToString(val)}"); + } + else + { + vals.Add($"{metadata.Name},{Utilities.ToString(val)}"); + } + } + + parameters.Add(parentName, string.Join(",", vals)); + } + else if (Utilities.IsDictionary(value)) + { + var vals = new List(); + + foreach (var key in ((IDictionary)value).Keys) + { + if (key == null) + { + continue; + } + + var val = ((IDictionary)value)[key]; + + if (explode) + { + vals.Add($"{key}={Utilities.ToString(val)}"); + } + else + { + vals.Add($"{key},{Utilities.ToString(val)}"); + } + } + + parameters.Add(parentName, string.Join(",", vals)); + } + else if (Utilities.IsList(value)) + { + var vals = new List(); + + foreach (var val in (IEnumerable)value) + { + vals.Add(Utilities.ToString(val)); + } + + parameters.Add(parentName, string.Join(",", vals)); + } + else + { + parameters.Add(parentName, Utilities.ToString(value)); + } + + return parameters; + } + + private static Dictionary> SerializeFormQueryParams( + string parentName, + object value, + bool explode, + string delimiter + ) + { + var parameters = new Dictionary>(); + + if (Utilities.IsClass(value) && !Utilities.IsDate(value)) + { + var props = value.GetType().GetProperties(); + + var items = new List(); + + foreach (var prop in props) + { + var val = prop.GetValue(value); + if (val == null) + { + continue; + } + + var metadata = prop.GetCustomAttribute()?.GetQueryParamMetadata(); + if (metadata == null || metadata.Name == null) + { + continue; + } + + if (explode) + { + if (!parameters.ContainsKey(metadata.Name)) + { + parameters.Add(metadata.Name, new List()); + } + + parameters[metadata.Name].Add( + Utilities.ToString(val) + ); + } + else + { + items.Add( + $"{metadata.Name}{delimiter}{Utilities.ValueToString(val)}" + ); + } + } + + if (items.Count > 0) + { + if (!parameters.ContainsKey(parentName)) + { + parameters.Add(parentName, new List()); + } + + parameters[parentName].Add(string.Join(delimiter, items)); + } + } + else if (Utilities.IsDictionary(value)) + { + var items = new List(); + + foreach (var k in ((IDictionary)value).Keys) + { + var key = k?.ToString(); + + if (key == null) + { + continue; + } + + if (explode) + { + if (!parameters.ContainsKey(key)) + { + parameters.Add(key, new List()); + } + + parameters[key].Add( + Utilities.ValueToString(((IDictionary)value)[key]) + ); + } + else + { + items.Add( + $"{key}{delimiter}{Utilities.ValueToString(((IDictionary)value)[key])}" + ); + } + } + + if (items.Count > 0) + { + if (!parameters.ContainsKey(parentName)) + { + parameters.Add(parentName, new List()); + } + + parameters[parentName].Add(string.Join(delimiter, items)); + } + } + else if (Utilities.IsList(value)) + { + var values = new List(); + var items = new List(); + + foreach (var item in (IList)value) + { + if (explode) + { + values.Add(Utilities.ValueToString(item)); + } + else + { + items.Add(Utilities.ValueToString(item)); + } + } + + if (items.Count > 0) + { + values.Add(string.Join(delimiter, items)); + } + + foreach (var val in values) + { + if (!parameters.ContainsKey(parentName)) + { + parameters.Add(parentName, new List()); + } + + parameters[parentName].Add(val); + } + } + else + { + if (!parameters.ContainsKey(parentName)) + { + parameters.Add(parentName, new List()); + } + + parameters[parentName].Add(Utilities.ValueToString(value)); + } + + return parameters; + } + + private static Dictionary> SerializeDeepObjectQueryParams( + string parentName, + object value + ) + { + var parameters = new Dictionary>(); + + if (Utilities.IsClass(value)) + { + var props = value.GetType().GetProperties(); + + foreach (var prop in props) + { + var val = prop.GetValue(value); + + if (val == null) + { + continue; + } + + var metadata = prop.GetCustomAttribute()?.GetQueryParamMetadata(); + if (metadata == null || metadata.Name == null) + { + continue; + } + + var keyName = $"{parentName}[{metadata.Name}]"; + + if (val != null && Utilities.IsList(val)) + { + foreach (var v in (IList)val) + { + if (!parameters.ContainsKey(keyName)) + { + parameters.Add(keyName, new List()); + } + + parameters[keyName].Add( + Utilities.ValueToString(v) + ); + } + } + else + { + if (!parameters.ContainsKey(keyName)) + { + parameters.Add(keyName, new List()); + } + + parameters[keyName].Add(Utilities.ValueToString(val)); + } + } + } + else if (Utilities.IsDictionary(value)) + { + foreach (var key in ((IDictionary)value).Keys) + { + if (key == null) + { + continue; + } + + var val = ((IDictionary)value)[key]; + + var keyName = $"{parentName}[{key}]"; + + if (val != null && Utilities.IsList(val)) + { + foreach (var v in (IList)val) + { + if (!parameters.ContainsKey(keyName)) + { + parameters.Add(keyName, new List()); + } + + parameters[keyName].Add( + Utilities.ValueToString(v) + ); + } + } + else + { + if (!parameters.ContainsKey(keyName)) + { + parameters.Add(keyName, new List()); + } + + parameters[keyName].Add(Utilities.ValueToString(val)); + } + } + } + + return parameters; + } + } +} diff --git a/experiments/SDK/Utils/Utilities.cs b/experiments/SDK/Utils/Utilities.cs new file mode 100755 index 0000000..75344e7 --- /dev/null +++ b/experiments/SDK/Utils/Utilities.cs @@ -0,0 +1,225 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace SDK.Utils +{ + using System; + using System.Linq; + using System.Net.Http.Headers; + using System.Collections.Generic; + using System.Text.RegularExpressions; + using Newtonsoft.Json; + using NodaTime; + using System.Collections; + + public class Utilities + { + public static string SerializeJSON(object obj) + { + return JsonConvert.SerializeObject( + obj, + new JsonSerializerSettings() + { + NullValueHandling = NullValueHandling.Ignore, + Converters = new JsonConverter[] + { + new IsoDateTimeSerializer(), + new EnumSerializer() + } + } + ); + } + + public static bool IsDictionary(object? o) + { + if (o == null) + return false; + return o is IDictionary + && o.GetType().IsGenericType + && o.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(Dictionary<,>)); + } + + public static bool IsList(object? o) + { + if (o == null) + return false; + return o is IList + && o.GetType().IsGenericType + && o.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(List<>)); + } + + public static bool IsClass(object? o) + { + if (o == null) + return false; + return o.GetType().IsClass && (o.GetType().FullName ?? "").StartsWith("SDK.Models"); + } + + // TODO: code review polyfilled for IsAssignableTo + public static bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant) + { + return potentialDescendant.IsSubclassOf(potentialBase) + || potentialDescendant == potentialBase; + } + + public static bool IsString(object? obj) + { + if (obj != null) + { + var type = obj.GetType(); + return IsSameOrSubclass(type, typeof(string)); + } + else + { + return false; + } + } + + public static bool IsPrimitive(object obj) => obj != null && obj.GetType().IsPrimitive; + + public static bool IsEnum(object obj) => obj != null && obj.GetType().IsEnum; + + public static bool IsDate(object obj) => + obj != null && (obj.GetType() == typeof(DateTime) || obj.GetType() == typeof(LocalDate)); + + private static string StripSurroundingQuotes(string input) + { + Regex surroundingQuotesRegex = new Regex("^\"(.*)\"$"); + var match = surroundingQuotesRegex.Match(input); + if(match.Groups.Values.Count() == 2) + { + return match.Groups.Values.Last().ToString(); + } + return input; + } + + public static string ValueToString(object? value) + { + if (value == null) + { + return ""; + } + + if (value.GetType() == typeof(DateTime)) + { + return ((DateTime)value) + .ToUniversalTime() + .ToString("o", System.Globalization.CultureInfo.InvariantCulture); + } + else if (value.GetType() == typeof(LocalDate)) + { + return ((LocalDate)value) + .ToDateTimeUnspecified() + .ToString("yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture); + } + else if (value.GetType() == typeof(bool)) + { + return (bool)value ? "true" : "false"; + } + else if (IsEnum(value)) + { + var method = Type.GetType(value.GetType().FullName + "Extension") + ?.GetMethod("Value"); + if (method == null) + { + return Convert.ChangeType(value, Enum.GetUnderlyingType(value.GetType()))?.ToString() ?? ""; + } + return (string)(method.Invoke(null, new[] { value }) ?? ""); + } + + return value.ToString() ?? ""; + } + + public static string ToString(object? obj) + { + if (obj == null) + { + return ""; + } + + if (IsString(obj)) + { + return obj.ToString() ?? ""; + } + + if (IsPrimitive(obj)) + { + return JsonConvert.SerializeObject(obj); + } + + if (IsEnum(obj)) + { + var attributes = obj.GetType().GetMember(obj.ToString() ?? "").First().CustomAttributes; + if (attributes.Count() == 0) + { + return JsonConvert.SerializeObject(obj); + } + + var args = attributes.First().ConstructorArguments; + if (args.Count() == 0) + { + return JsonConvert.SerializeObject(obj); + } + return StripSurroundingQuotes(args.First().ToString()); + } + + if (IsDate(obj)) + { + return StripSurroundingQuotes(JsonConvert.SerializeObject(obj, new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new IsoDateTimeSerializer(), new EnumSerializer() }})); + } + return JsonConvert.SerializeObject(obj, new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new IsoDateTimeSerializer(), new EnumSerializer() }}); + } + + public static bool IsContentTypeMatch(string expected, string? actual) + { + if (actual == null) + { + return false; + } + + if (expected == actual || expected == "*" || expected == "*/*") + { + return true; + } + + try + { + var mediaType = MediaTypeHeaderValue.Parse(actual).MediaType ?? ""; + + if (expected == mediaType) + { + return true; + } + + var parts = mediaType.Split('/'); + if (parts.Length == 2) + { + if (parts[0] + "/*" == expected || "*/" + parts[1] == expected) + { + return true; + } + } + } + catch (Exception) { } + + return false; + } + + public static string PrefixBearer(string authHeaderValue) + { + if (authHeaderValue.StartsWith("bearer ", StringComparison.InvariantCultureIgnoreCase)) + { + return authHeaderValue; + } + + return $"Bearer {authHeaderValue}"; + } + } +} \ No newline at end of file diff --git a/experiments/USAGE.md b/experiments/USAGE.md new file mode 100755 index 0000000..c25be98 --- /dev/null +++ b/experiments/USAGE.md @@ -0,0 +1,14 @@ + + + +```csharp +using SDK; +using SDK.Models.Operations; + +var sdk = new SDKSDK(); + +var res = await sdk.SDK.GetBenefitsEnrollmentIdAsync("string"); + +// handle response +``` + \ No newline at end of file diff --git a/experiments/docs/models/operations/GetBenefitsEnrollmentIdRequest.md b/experiments/docs/models/operations/GetBenefitsEnrollmentIdRequest.md new file mode 100755 index 0000000..2bddb4c --- /dev/null +++ b/experiments/docs/models/operations/GetBenefitsEnrollmentIdRequest.md @@ -0,0 +1,8 @@ +# GetBenefitsEnrollmentIdRequest + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `Id` | *string* | :heavy_check_mark: | Unique identifier | \ No newline at end of file diff --git a/experiments/docs/models/operations/GetBenefitsEnrollmentIdResponse.md b/experiments/docs/models/operations/GetBenefitsEnrollmentIdResponse.md new file mode 100755 index 0000000..a49cbc8 --- /dev/null +++ b/experiments/docs/models/operations/GetBenefitsEnrollmentIdResponse.md @@ -0,0 +1,11 @@ +# GetBenefitsEnrollmentIdResponse + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation | +| `Enrollment` | [Enrollment](../../models/shared/Enrollment.md) | :heavy_minus_sign: | An Enrollment records | +| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `RawResponse` | [HttpResponseMessage](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpresponsemessage?view=net-5.0) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/experiments/docs/models/operations/GetBenefitsPlanEnrollmentIdRequest.md b/experiments/docs/models/operations/GetBenefitsPlanEnrollmentIdRequest.md new file mode 100755 index 0000000..67542c4 --- /dev/null +++ b/experiments/docs/models/operations/GetBenefitsPlanEnrollmentIdRequest.md @@ -0,0 +1,8 @@ +# GetBenefitsPlanEnrollmentIdRequest + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `Id` | *string* | :heavy_check_mark: | Unique identifier | \ No newline at end of file diff --git a/experiments/docs/models/operations/GetBenefitsPlanEnrollmentIdResponse.md b/experiments/docs/models/operations/GetBenefitsPlanEnrollmentIdResponse.md new file mode 100755 index 0000000..c78fee0 --- /dev/null +++ b/experiments/docs/models/operations/GetBenefitsPlanEnrollmentIdResponse.md @@ -0,0 +1,11 @@ +# GetBenefitsPlanEnrollmentIdResponse + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation | +| `PlanEnrollment` | [PlanEnrollment](../../models/shared/PlanEnrollment.md) | :heavy_minus_sign: | An enrollment into a plan | +| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `RawResponse` | [HttpResponseMessage](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpresponsemessage?view=net-5.0) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/experiments/docs/models/operations/GetBenefitsPlanEnrollmentResponse.md b/experiments/docs/models/operations/GetBenefitsPlanEnrollmentResponse.md new file mode 100755 index 0000000..ecffdac --- /dev/null +++ b/experiments/docs/models/operations/GetBenefitsPlanEnrollmentResponse.md @@ -0,0 +1,11 @@ +# GetBenefitsPlanEnrollmentResponse + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation | +| `PlanEnrollments` | List<[PlanEnrollment](../../models/shared/PlanEnrollment.md)> | :heavy_minus_sign: | List of plan enrollments for a member | +| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `RawResponse` | [HttpResponseMessage](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpresponsemessage?view=net-5.0) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/experiments/docs/models/operations/GetBenefitsServiceResponse.md b/experiments/docs/models/operations/GetBenefitsServiceResponse.md new file mode 100755 index 0000000..a6b847c --- /dev/null +++ b/experiments/docs/models/operations/GetBenefitsServiceResponse.md @@ -0,0 +1,11 @@ +# GetBenefitsServiceResponse + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation | +| `ServiceEnablementResponse` | [ServiceEnablementResponse](../../models/shared/ServiceEnablementResponse.md) | :heavy_minus_sign: | Indicates status of service enablement | +| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `RawResponse` | [HttpResponseMessage](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpresponsemessage?view=net-5.0) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/experiments/docs/models/operations/PatchBenefitsServiceIdRequest.md b/experiments/docs/models/operations/PatchBenefitsServiceIdRequest.md new file mode 100755 index 0000000..24ebd51 --- /dev/null +++ b/experiments/docs/models/operations/PatchBenefitsServiceIdRequest.md @@ -0,0 +1,9 @@ +# PatchBenefitsServiceIdRequest + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| `Id` | *string* | :heavy_check_mark: | Unique identifier | +| `ServiceEnablementUpdate` | [ServiceEnablementUpdate](../../models/shared/ServiceEnablementUpdate.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/experiments/docs/models/operations/PatchBenefitsServiceIdResponse.md b/experiments/docs/models/operations/PatchBenefitsServiceIdResponse.md new file mode 100755 index 0000000..b5920cc --- /dev/null +++ b/experiments/docs/models/operations/PatchBenefitsServiceIdResponse.md @@ -0,0 +1,11 @@ +# PatchBenefitsServiceIdResponse + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation | +| `ServiceEnablementResponse` | [ServiceEnablementResponse](../../models/shared/ServiceEnablementResponse.md) | :heavy_minus_sign: | Indicates status of service enablement | +| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `RawResponse` | [HttpResponseMessage](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpresponsemessage?view=net-5.0) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/experiments/docs/models/shared/A71f30be878693b235f8c5f1650be03c9920ca9821526545760476436104c9dc.md b/experiments/docs/models/shared/A71f30be878693b235f8c5f1650be03c9920ca9821526545760476436104c9dc.md new file mode 100755 index 0000000..03def37 --- /dev/null +++ b/experiments/docs/models/shared/A71f30be878693b235f8c5f1650be03c9920ca9821526545760476436104c9dc.md @@ -0,0 +1,8 @@ +# A71f30be878693b235f8c5f1650be03c9920ca9821526545760476436104c9dc + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `DeductionIds` | *object* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/experiments/docs/models/shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329.md b/experiments/docs/models/shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329.md new file mode 100755 index 0000000..aedb862 --- /dev/null +++ b/experiments/docs/models/shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329.md @@ -0,0 +1,11 @@ +# E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329 + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `EffectiveDate` | *string* | :heavy_check_mark: | N/A | +| `GroupNumber` | *string* | :heavy_check_mark: | N/A | +| `MemberNumber` | *string* | :heavy_check_mark: | N/A | +| `Status` | [E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status](../../models/shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/experiments/docs/models/shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status.md b/experiments/docs/models/shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status.md new file mode 100755 index 0000000..a6db825 --- /dev/null +++ b/experiments/docs/models/shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status.md @@ -0,0 +1,10 @@ +# E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status + + +## Values + +| Name | Value | +| ---------- | ---------- | +| `Active` | Active | +| `Paused` | Paused | +| `Disabled` | Disabled | \ No newline at end of file diff --git a/experiments/docs/models/shared/Enrollment.md b/experiments/docs/models/shared/Enrollment.md new file mode 100755 index 0000000..01df74c --- /dev/null +++ b/experiments/docs/models/shared/Enrollment.md @@ -0,0 +1,9 @@ +# Enrollment + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `MemberId` | *string* | :heavy_check_mark: | N/A | +| `WingspanBenefits` | [E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329](../../models/shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/experiments/docs/models/shared/PlanEnrollment.md b/experiments/docs/models/shared/PlanEnrollment.md new file mode 100755 index 0000000..d5f8ad7 --- /dev/null +++ b/experiments/docs/models/shared/PlanEnrollment.md @@ -0,0 +1,23 @@ +# PlanEnrollment + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | +| `CoverageMonths` | List<[PlanEnrollmentCoverageMonth](../../models/shared/PlanEnrollmentCoverageMonth.md)> | :heavy_check_mark: | N/A | +| `CreatedAt` | *string* | :heavy_check_mark: | N/A | +| `Currency` | *object* | :heavy_check_mark: | N/A | +| `EffectiveDate` | *string* | :heavy_check_mark: | N/A | +| `EndDate` | *string* | :heavy_minus_sign: | N/A | +| `EventActors` | Dictionary | :heavy_check_mark: | N/A | +| `Labels` | Dictionary | :heavy_check_mark: | N/A | +| `MemberId` | *string* | :heavy_check_mark: | N/A | +| `MonthlyPremium` | *double* | :heavy_check_mark: | N/A | +| `Name` | *string* | :heavy_check_mark: | N/A | +| `PlanEnrollmentId` | *string* | :heavy_check_mark: | N/A | +| `PlanType` | [PlanEnrollmentPlanType](../../models/shared/PlanEnrollmentPlanType.md) | :heavy_check_mark: | N/A | +| `Sku` | *string* | :heavy_check_mark: | N/A | +| `Status` | [PlanEnrollmentStatus](../../models/shared/PlanEnrollmentStatus.md) | :heavy_check_mark: | N/A | +| `UpdatedAt` | *string* | :heavy_check_mark: | N/A | +| `UserRoles` | [UserRoles](../../models/shared/UserRoles.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/experiments/docs/models/shared/PlanEnrollmentCoverageMonth.md b/experiments/docs/models/shared/PlanEnrollmentCoverageMonth.md new file mode 100755 index 0000000..b1f1e58 --- /dev/null +++ b/experiments/docs/models/shared/PlanEnrollmentCoverageMonth.md @@ -0,0 +1,11 @@ +# PlanEnrollmentCoverageMonth + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `AmountCharged` | *double* | :heavy_check_mark: | N/A | +| `FundingStatus` | [PlanEnrollmentCoverageMonthFundingStatus](../../models/shared/PlanEnrollmentCoverageMonthFundingStatus.md) | :heavy_check_mark: | N/A | +| `Internal` | [A71f30be878693b235f8c5f1650be03c9920ca9821526545760476436104c9dc](../../models/shared/A71f30be878693b235f8c5f1650be03c9920ca9821526545760476436104c9dc.md) | :heavy_check_mark: | N/A | +| `Month` | *string* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/experiments/docs/models/shared/PlanEnrollmentCoverageMonthFundingStatus.md b/experiments/docs/models/shared/PlanEnrollmentCoverageMonthFundingStatus.md new file mode 100755 index 0000000..76a314f --- /dev/null +++ b/experiments/docs/models/shared/PlanEnrollmentCoverageMonthFundingStatus.md @@ -0,0 +1,9 @@ +# PlanEnrollmentCoverageMonthFundingStatus + + +## Values + +| Name | Value | +| ---------- | ---------- | +| `Pending` | Pending | +| `Complete` | Complete | \ No newline at end of file diff --git a/experiments/docs/models/shared/PlanEnrollmentPlanType.md b/experiments/docs/models/shared/PlanEnrollmentPlanType.md new file mode 100755 index 0000000..b522fb2 --- /dev/null +++ b/experiments/docs/models/shared/PlanEnrollmentPlanType.md @@ -0,0 +1,8 @@ +# PlanEnrollmentPlanType + + +## Values + +| Name | Value | +| --------------- | --------------- | +| `MeridioHealth` | MeridioHealth | \ No newline at end of file diff --git a/experiments/docs/models/shared/PlanEnrollmentStatus.md b/experiments/docs/models/shared/PlanEnrollmentStatus.md new file mode 100755 index 0000000..4341982 --- /dev/null +++ b/experiments/docs/models/shared/PlanEnrollmentStatus.md @@ -0,0 +1,10 @@ +# PlanEnrollmentStatus + + +## Values + +| Name | Value | +| ------------ | ------------ | +| `Pending` | Pending | +| `Active` | Active | +| `Terminated` | Terminated | \ No newline at end of file diff --git a/experiments/docs/models/shared/ServiceEnablementResponse.md b/experiments/docs/models/shared/ServiceEnablementResponse.md new file mode 100755 index 0000000..8d324b8 --- /dev/null +++ b/experiments/docs/models/shared/ServiceEnablementResponse.md @@ -0,0 +1,10 @@ +# ServiceEnablementResponse + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | +| `Enabled` | *bool* | :heavy_check_mark: | N/A | +| `MissingProperties` | List<*string*> | :heavy_minus_sign: | N/A | +| `ServiceState` | [ServiceEnablementResponseServiceState](../../models/shared/ServiceEnablementResponseServiceState.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/experiments/docs/models/shared/ServiceEnablementResponseServiceState.md b/experiments/docs/models/shared/ServiceEnablementResponseServiceState.md new file mode 100755 index 0000000..3cb3356 --- /dev/null +++ b/experiments/docs/models/shared/ServiceEnablementResponseServiceState.md @@ -0,0 +1,10 @@ +# ServiceEnablementResponseServiceState + + +## Values + +| Name | Value | +| ---------- | ---------- | +| `Disabled` | Disabled | +| `Enabled` | Enabled | +| `Pending` | Pending | \ No newline at end of file diff --git a/experiments/docs/models/shared/ServiceEnablementUpdate.md b/experiments/docs/models/shared/ServiceEnablementUpdate.md new file mode 100755 index 0000000..9d46aef --- /dev/null +++ b/experiments/docs/models/shared/ServiceEnablementUpdate.md @@ -0,0 +1,8 @@ +# ServiceEnablementUpdate + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `Enabled` | *bool* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/experiments/docs/models/shared/UserRoles.md b/experiments/docs/models/shared/UserRoles.md new file mode 100755 index 0000000..53f8869 --- /dev/null +++ b/experiments/docs/models/shared/UserRoles.md @@ -0,0 +1,9 @@ +# UserRoles + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `OwnerIds` | List<*string*> | :heavy_check_mark: | N/A | +| `ViewerIds` | List<*string*> | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/experiments/docs/sdks/sdk/README.md b/experiments/docs/sdks/sdk/README.md new file mode 100755 index 0000000..9d97ed8 --- /dev/null +++ b/experiments/docs/sdks/sdk/README.md @@ -0,0 +1,149 @@ +# SDK + + +## Overview + +Wingspan Benefits API: Benefits + +### Available Operations + +* [GetBenefitsEnrollmentId](#getbenefitsenrollmentid) - Retrieve Enrollment Details for a Specific Member +* [GetBenefitsPlanEnrollment](#getbenefitsplanenrollment) - List all plan enrollments +* [GetBenefitsPlanEnrollmentId](#getbenefitsplanenrollmentid) - Get a particular plan enrollment by ID +* [GetBenefitsService](#getbenefitsservice) - Retrieve Current Benefits Service Status +* [PatchBenefitsServiceId](#patchbenefitsserviceid) - Modify Benefits Service Status + +## GetBenefitsEnrollmentId + +Fetches the enrollment status and details for a member identified by the provided unique identifier. + +### Example Usage + +```csharp +using SDK; +using SDK.Models.Operations; + +var sdk = new SDKSDK(); + +var res = await sdk.SDK.GetBenefitsEnrollmentIdAsync("string"); + +// handle response +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `Id` | *string* | :heavy_check_mark: | Unique identifier | + + +### Response + +**[GetBenefitsEnrollmentIdResponse](../../models/operations/GetBenefitsEnrollmentIdResponse.md)** + + +## GetBenefitsPlanEnrollment + +List all plan enrollments + +### Example Usage + +```csharp +using SDK; + +var sdk = new SDKSDK(); + +var res = await sdk.SDK.GetBenefitsPlanEnrollmentAsync(); + +// handle response +``` + + +### Response + +**[GetBenefitsPlanEnrollmentResponse](../../models/operations/GetBenefitsPlanEnrollmentResponse.md)** + + +## GetBenefitsPlanEnrollmentId + +Get a particular plan enrollment by ID + +### Example Usage + +```csharp +using SDK; +using SDK.Models.Operations; + +var sdk = new SDKSDK(); + +var res = await sdk.SDK.GetBenefitsPlanEnrollmentIdAsync("string"); + +// handle response +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `Id` | *string* | :heavy_check_mark: | Unique identifier | + + +### Response + +**[GetBenefitsPlanEnrollmentIdResponse](../../models/operations/GetBenefitsPlanEnrollmentIdResponse.md)** + + +## GetBenefitsService + +Fetches the current status indicating whether the benefits service is enabled or disabled. + +### Example Usage + +```csharp +using SDK; + +var sdk = new SDKSDK(); + +var res = await sdk.SDK.GetBenefitsServiceAsync(); + +// handle response +``` + + +### Response + +**[GetBenefitsServiceResponse](../../models/operations/GetBenefitsServiceResponse.md)** + + +## PatchBenefitsServiceId + +Allows users to change the enablement status of a specified benefits service. + +### Example Usage + +```csharp +using SDK; +using SDK.Models.Operations; +using SDK.Models.Shared; + +var sdk = new SDKSDK(); + +var res = await sdk.SDK.PatchBenefitsServiceIdAsync("string", new ServiceEnablementUpdate() { + Enabled = false, +}); + +// handle response +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| `Id` | *string* | :heavy_check_mark: | Unique identifier | +| `ServiceEnablementUpdate` | [ServiceEnablementUpdate](../../models/shared/ServiceEnablementUpdate.md) | :heavy_minus_sign: | N/A | + + +### Response + +**[PatchBenefitsServiceIdResponse](../../models/operations/PatchBenefitsServiceIdResponse.md)** + diff --git a/experiments/files.gen b/experiments/files.gen new file mode 100755 index 0000000..4bae880 --- /dev/null +++ b/experiments/files.gen @@ -0,0 +1,60 @@ +SDK/SDKSDK.cs +SDK/Utils/BigIntSerializer.cs +SDK/Utils/DecimalSerializer.cs +SDK/Utils/EnumSerializer.cs +SDK/Utils/FlexibleObjectDeserializer.cs +SDK/Utils/HeaderSerializer.cs +SDK/Utils/IsoDateTimeSerializer.cs +SDK/Utils/RequestBodySerializer.cs +SDK/Utils/SecuritySerializer.cs +SDK/Utils/SpeakeasyHttpClient.cs +SDK/Utils/SpeakeasyMetadata.cs +SDK/Utils/URLBuilder.cs +SDK/Utils/Utilities.cs +SDK/SDK.csproj +SDK.sln +SDK/Models/Operations/GetBenefitsEnrollmentIdRequest.cs +SDK/Models/Operations/GetBenefitsEnrollmentIdResponse.cs +SDK/Models/Operations/GetBenefitsPlanEnrollmentResponse.cs +SDK/Models/Operations/GetBenefitsPlanEnrollmentIdRequest.cs +SDK/Models/Operations/GetBenefitsPlanEnrollmentIdResponse.cs +SDK/Models/Operations/GetBenefitsServiceResponse.cs +SDK/Models/Operations/PatchBenefitsServiceIdRequest.cs +SDK/Models/Operations/PatchBenefitsServiceIdResponse.cs +SDK/Models/Shared/Enrollment.cs +SDK/Models/Shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status.cs +SDK/Models/Shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329.cs +SDK/Models/Shared/PlanEnrollmentPlanType.cs +SDK/Models/Shared/PlanEnrollmentStatus.cs +SDK/Models/Shared/PlanEnrollment.cs +SDK/Models/Shared/UserRoles.cs +SDK/Models/Shared/PlanEnrollmentCoverageMonthFundingStatus.cs +SDK/Models/Shared/PlanEnrollmentCoverageMonth.cs +SDK/Models/Shared/A71f30be878693b235f8c5f1650be03c9920ca9821526545760476436104c9dc.cs +SDK/Models/Shared/ServiceEnablementResponseServiceState.cs +SDK/Models/Shared/ServiceEnablementResponse.cs +SDK/Models/Shared/ServiceEnablementUpdate.cs +USAGE.md +docs/models/operations/GetBenefitsEnrollmentIdRequest.md +docs/models/operations/GetBenefitsEnrollmentIdResponse.md +docs/models/operations/GetBenefitsPlanEnrollmentResponse.md +docs/models/operations/GetBenefitsPlanEnrollmentIdRequest.md +docs/models/operations/GetBenefitsPlanEnrollmentIdResponse.md +docs/models/operations/GetBenefitsServiceResponse.md +docs/models/operations/PatchBenefitsServiceIdRequest.md +docs/models/operations/PatchBenefitsServiceIdResponse.md +docs/models/shared/Enrollment.md +docs/models/shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329Status.md +docs/models/shared/E974d9e9e5676123cf56d2fd858ece1c24be8be15b96a100963b7cb1afada329.md +docs/models/shared/PlanEnrollmentPlanType.md +docs/models/shared/PlanEnrollmentStatus.md +docs/models/shared/PlanEnrollment.md +docs/models/shared/UserRoles.md +docs/models/shared/PlanEnrollmentCoverageMonthFundingStatus.md +docs/models/shared/PlanEnrollmentCoverageMonth.md +docs/models/shared/A71f30be878693b235f8c5f1650be03c9920ca9821526545760476436104c9dc.md +docs/models/shared/ServiceEnablementResponseServiceState.md +docs/models/shared/ServiceEnablementResponse.md +docs/models/shared/ServiceEnablementUpdate.md +docs/sdks/sdk/README.md +.gitattributes \ No newline at end of file diff --git a/experiments/gen.yaml b/experiments/gen.yaml new file mode 100755 index 0000000..e2a3bb3 --- /dev/null +++ b/experiments/gen.yaml @@ -0,0 +1,23 @@ +configVersion: 1.0.0 +management: + docChecksum: e377727f5ba4f1205fcadb3246757bab + docVersion: 1.0.0 + speakeasyVersion: 1.109.0 + generationVersion: 2.173.0 +generation: + repoURL: https://github.com/wingspanHQ/client-sdk-csharp.git + sdkClassName: SDK + singleTagPerOp: false +features: + csharp: + core: 2.93.0 + flattening: 2.81.1 + globalServerURLs: 2.82.0 +csharp: + version: 1.0.0 + author: Wingspan Networks, Inc. + dotnetVersion: net5.0 + maxMethodParams: 4 + packageName: WingspanExperiments + published: true + repoSubDirectory: experiments