diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 4808d97d..b29b3b64 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "5.1.0" + ".": "5.2.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index 647de165..92aa6915 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 78 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/courier%2Fcourier-b79e0eb1ab06f4076c48fa519e2b2ad792a0c483a5d017e43c938ca4c4be6988.yml -openapi_spec_hash: cb3cc2c1145503e5737a880326857aa4 -config_hash: ff903e824043dc81aca51a0ce21896d6 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/courier%2Fcourier-e3e54d99e2a73fd87519270f2685131050d342e86a4e96130247b854deae5c20.yml +openapi_spec_hash: 897a3fbee24f24d021d6af0df480220c +config_hash: 66a5c28bb74d78454456d9ce7d1c0a0c diff --git a/CHANGELOG.md b/CHANGELOG.md index bacc4d24..9e6374ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,49 @@ # Changelog +## 5.2.0 (2026-01-14) + +Full Changelog: [v5.1.0...v5.2.0](https://github.com/trycourier/courier-csharp/compare/v5.1.0...v5.2.0) + +### Features + +* **client:** add helper functions for raw messages ([1781a38](https://github.com/trycourier/courier-csharp/commit/1781a383b5b5bcce7e006a7977330c60e0378792)) + + +### Bug Fixes + +* **client:** add missing serializer options ([73bd7dd](https://github.com/trycourier/courier-csharp/commit/73bd7dd5e3c5894b25f897bb017093d378425892)) +* **client:** bad deserialize call for void method ([a2a5845](https://github.com/trycourier/courier-csharp/commit/a2a584544f27a936f8fc5013aa62b49ca5cc183b)) +* **client:** bad reference ([9170476](https://github.com/trycourier/courier-csharp/commit/917047605d71bccfa9bf59761d2d25929dab6c3c)) +* **client:** dictionary type ([ad0d8ff](https://github.com/trycourier/courier-csharp/commit/ad0d8ff101b399e4641ed08152123a6a64817699)) +* **client:** ensure deep immutability for deep array/dict structures ([fda9700](https://github.com/trycourier/courier-csharp/commit/fda9700d880e6d5c2a599cc857eb5084cd6d878a)) +* **client:** freeze models on property access ([196bf8e](https://github.com/trycourier/courier-csharp/commit/196bf8ece6a08921215aa1bf4d3629c630a577f6)) +* **client:** missing immutable -> readonly conversion ([2afcb10](https://github.com/trycourier/courier-csharp/commit/2afcb10726e2439230fd872b7034619f155f97f6)) +* **client:** throw api enum errors as invalid data exception ([9bf8de8](https://github.com/trycourier/courier-csharp/commit/9bf8de8236efef6e948df983098b1fc5a82a4a23)) +* **client:** use readonly type for param ([5b2c657](https://github.com/trycourier/courier-csharp/commit/5b2c6573f744cdf6456381871d0d2653aedeb796)) + + +### Performance Improvements + +* **client:** add json deserialization caching ([fda9700](https://github.com/trycourier/courier-csharp/commit/fda9700d880e6d5c2a599cc857eb5084cd6d878a)) + + +### Chores + +* **client:** consistently use serializer options ([bc7871a](https://github.com/trycourier/courier-csharp/commit/bc7871afce7fc9f938996de63e88cf72a19f5152)) +* **client:** refactor union instantiation ([ebb48fc](https://github.com/trycourier/courier-csharp/commit/ebb48fc9ce86e1dbb34b0dcb08e897dc29708c04)) +* **client:** use mutable collections for union deserialization ([2d1ab11](https://github.com/trycourier/courier-csharp/commit/2d1ab11aa146ff88da5b65e256c5f590ac8bd713)) +* **internal:** regenerate SDK with no functional changes ([0aed83e](https://github.com/trycourier/courier-csharp/commit/0aed83e54c9b607c1eb5d9bfb1d93842f12ec66b)) +* **internal:** regenerate SDK with no functional changes ([d7df223](https://github.com/trycourier/courier-csharp/commit/d7df223f4f4aa1c432793713da5d925d8ffbdbaf)) +* **internal:** use better namespace aliases ([b754fec](https://github.com/trycourier/courier-csharp/commit/b754fec848c4f2a633817e99521350471ce4500a)) +* **readme:** remove beta warning now that we're in ga ([1974856](https://github.com/trycourier/courier-csharp/commit/19748567c2051affb0156e4651f686cbddecf352)) +* remove custom code ([0324583](https://github.com/trycourier/courier-csharp/commit/0324583376b98670d8affb868689b3e16da9d366)) + + +### Refactors + +* **client:** add `JsonDictionary` identity methods ([588abd9](https://github.com/trycourier/courier-csharp/commit/588abd9557c5cc0a82b257ed9ac2cd17780ac060)) +* **internal:** `JsonElement` constant construction ([d9577f1](https://github.com/trycourier/courier-csharp/commit/d9577f117079196532685b723308272e2b53c1ff)) + ## 5.1.0 (2026-01-12) Full Changelog: [v5.0.0...v5.1.0](https://github.com/trycourier/courier-csharp/compare/v5.0.0...v5.1.0) diff --git a/LICENSE b/LICENSE index efaa7fe8..ca8054ae 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2025 Courier + Copyright 2026 Courier Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index a28c0c03..ba54e5a4 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,5 @@ # Courier C# API Library -> [!NOTE] -> The Courier C# API Library is currently in **beta** and we're excited for you to experiment with it! -> -> This library has not yet been exhaustively tested in production environments and may be missing some features you'd expect in a stable release. As we continue development, there may be breaking changes that require updates to your code. -> -> **We'd love your feedback!** Please share any suggestions, bug reports, feature requests, or general thoughts by [filing an issue](https://www.github.com/trycourier/courier-csharp/issues/new). - The Courier C# SDK provides convenient access to the [Courier REST API](https://www.courier.com/docs) from applications written in C#. It is generated with [Stainless](https://www.stainless.com/). @@ -122,10 +115,12 @@ To access this data, prefix any HTTP method call on a client or service with `Wi ```csharp var response = await client.WithRawResponse.Send.Message(parameters); -var statusCode = response.Message.StatusCode; -var headers = response.Message.Headers; +var statusCode = response.StatusCode; +var headers = response.Headers; ``` +The raw `HttpResponseMessage` can also be accessed through the `RawMessage` property. + For non-streaming responses, you can deserialize the response into an instance of a C# class if needed: ```csharp diff --git a/src/Courier.Tests/Core/FreezableDictionaryTest.cs b/src/Courier.Tests/Core/FreezableDictionaryTest.cs deleted file mode 100644 index 9cfcdfd6..00000000 --- a/src/Courier.Tests/Core/FreezableDictionaryTest.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using Courier.Core; - -namespace Courier.Tests.Core; - -public class FreezableDictionaryTest : TestBase -{ - [Fact] - public void Unfrozen_Works() - { - var freezable = new FreezableDictionary(); - Assert.Throws(() => freezable["foo"]); - freezable["foo"] = "bar"; - Assert.Equal("bar", freezable["foo"]); - - // overwriting key - freezable["foo"] = "baz"; - Assert.Equal("baz", freezable["foo"]); - - // inserting new key - freezable["bar"] = "foo"; - Assert.Equal("foo", freezable["bar"]); - - Assert.Equal("baz", freezable["foo"]); - } - - [Fact] - public void Frozen_Works() - { - var freezable = new FreezableDictionary() { ["foo"] = "bar" }; - Assert.Equal("bar", freezable.Freeze()["foo"]); - Assert.Equal("bar", freezable["foo"]); - Assert.Throws(() => freezable["bar"]); - Assert.Throws(() => freezable.Freeze()["bar"]); - - // overwriting key - Assert.Throws(() => freezable["foo"] = "baz"); - - // inserting new key - Assert.Throws(() => freezable["baz"] = "buzz"); - } -} diff --git a/src/Courier.Tests/Core/JsonDictionaryTest.cs b/src/Courier.Tests/Core/JsonDictionaryTest.cs new file mode 100644 index 00000000..8475be13 --- /dev/null +++ b/src/Courier.Tests/Core/JsonDictionaryTest.cs @@ -0,0 +1,406 @@ +using System; +using System.Collections.Frozen; +using System.Collections.Generic; +using System.Text.Json; +using Courier.Core; +using Courier.Exceptions; + +namespace Courier.Tests.Core; + +public class JsonDictionaryTest : TestBase +{ + [Fact] + public void DefaultConstructor_CreatesEmptyDictionary() + { + var dict = new JsonDictionary(); + + Assert.Empty(dict.Freeze()); + } + + [Fact] + public void DictionaryConstructor_CopiesData() + { + var source = new Dictionary + { + ["foo"] = JsonSerializer.SerializeToElement("bar"), + ["bar"] = JsonSerializer.SerializeToElement(42), + }; + + var dict = new JsonDictionary(source); + + var frozen = dict.Freeze(); + Assert.Equal(2, frozen.Count); + Assert.Equal("bar", frozen["foo"].GetString()); + Assert.Equal(42, frozen["bar"].GetInt32()); + } + + [Fact] + public void FrozenDictionaryConstructor_UsesProvidedDictionary() + { + var source = FrozenDictionary.ToFrozenDictionary( + new Dictionary + { + ["foo"] = JsonSerializer.SerializeToElement("bar"), + } + ); + + var dict = new JsonDictionary(source); + + var frozen = dict.Freeze(); + Assert.Same(source, frozen); + } + + [Fact] + public void Set_AddsValueWhenUnfrozen() + { + var dict = new JsonDictionary(); + + dict.Set("name", "Alice"); + dict.Set("age", 30); + + var frozen = dict.Freeze(); + Assert.Equal("Alice", frozen["name"].GetString()); + Assert.Equal(30, frozen["age"].GetInt32()); + } + + [Fact] + public void Set_OverwritesExistingValue() + { + var dict = new JsonDictionary(); + + dict.Set("foo", "bar"); + dict.Set("foo", "baz"); + + var frozen = dict.Freeze(); + Assert.Equal("baz", frozen["foo"].GetString()); + } + + [Fact] + public void Set_ThrowsAfterFreezing() + { + var dict = new JsonDictionary(); + dict.Freeze(); + + Assert.Throws(() => dict.Set("foo", "bar")); + } + + [Fact] + public void Freeze_ReturnsFrozenDictionary() + { + var dict = new JsonDictionary(); + dict.Set("foo", "bar"); + + var frozen1 = dict.Freeze(); + var frozen2 = dict.Freeze(); + + Assert.Same(frozen1, frozen2); + } + + [Fact] + public void GetNotNullClass_ReturnsValue() + { + var dict = new JsonDictionary(); + dict.Set("name", "Alice"); + + Assert.Equal("Alice", dict.GetNotNullClass("name")); + } + + [Fact] + public void GetNotNullClass_CachesDeserializedValue() + { + var dict = new JsonDictionary(); + dict.Set("name", "Alice"); + + var first = dict.GetNotNullClass("name"); + var second = dict.GetNotNullClass("name"); + + Assert.Same(first, second); + } + + [Fact] + public void GetNotNullClass_ThrowsWhenKeyAbsent() + { + var dict = new JsonDictionary(); + + var exception = Assert.Throws(() => + dict.GetNotNullClass("missing") + ); + Assert.Contains("'missing' cannot be absent", exception.Message); + } + + [Fact] + public void GetNotNullClass_ThrowsWhenValueIsNull() + { + var dict = new JsonDictionary( + new Dictionary + { + ["nullable"] = JsonSerializer.SerializeToElement(null), + } + ); + + var exception = Assert.Throws(() => + dict.GetNotNullClass("nullable") + ); + Assert.Contains("'nullable' cannot be null", exception.Message); + } + + [Fact] + public void GetNotNullClass_ThrowsWhenTypeInvalid() + { + var dict = new JsonDictionary(); + dict.Set("number", 42); + + var exception = Assert.Throws(() => + dict.GetNotNullClass("number") + ); + Assert.Contains("'number' must be of type", exception.Message); + } + + [Fact] + public void GetNotNullStruct_ReturnsValue() + { + var dict = new JsonDictionary(); + dict.Set("age", 30); + + var age = dict.GetNotNullStruct("age"); + + Assert.Equal(30, age); + } + + [Fact] + public void GetNotNullStruct_ThrowsWhenKeyAbsent() + { + var dict = new JsonDictionary(); + + var exception = Assert.Throws(() => + dict.GetNotNullStruct("missing") + ); + Assert.Contains("'missing' cannot be absent", exception.Message); + } + + [Fact] + public void GetNotNullStruct_ThrowsWhenValueIsNull() + { + var dict = new JsonDictionary( + new Dictionary + { + ["nullable"] = JsonSerializer.SerializeToElement(null), + } + ); + + var exception = Assert.Throws(() => + dict.GetNotNullStruct("nullable") + ); + Assert.Contains("'nullable' cannot be null", exception.Message); + } + + [Fact] + public void GetNotNullStruct_ThrowsWhenTypeInvalid() + { + var dict = new JsonDictionary(); + dict.Set("text", "not a number"); + + var exception = Assert.Throws(() => + dict.GetNotNullStruct("text") + ); + Assert.Contains("'text' must be of type", exception.Message); + } + + [Fact] + public void GetNullableClass_ReturnsValueWhenPresent() + { + var dict = new JsonDictionary(); + dict.Set("name", "Alice"); + + var name = dict.GetNullableClass("name"); + + Assert.Equal("Alice", name); + } + + [Fact] + public void GetNullableClass_ReturnsNullWhenKeyAbsent() + { + var dict = new JsonDictionary(); + + var missing = dict.GetNullableClass("missing"); + + Assert.Null(missing); + } + + [Fact] + public void GetNullableClass_ReturnsNullWhenValueIsNull() + { + var dict = new JsonDictionary( + new Dictionary + { + ["nullable"] = JsonSerializer.SerializeToElement(null), + } + ); + + var nullable = dict.GetNullableClass("nullable"); + + Assert.Null(nullable); + } + + [Fact] + public void GetNullableClass_CachesDeserializedValue() + { + var dict = new JsonDictionary(); + dict.Set("name", "Alice"); + + var first = dict.GetNullableClass("name"); + var second = dict.GetNullableClass("name"); + + Assert.Same(first, second); + } + + [Fact] + public void GetNullableClass_ThrowsWhenTypeInvalid() + { + var dict = new JsonDictionary(); + dict.Set("number", 42); + + var exception = Assert.Throws(() => + dict.GetNullableClass("number") + ); + Assert.Contains("'number' must be of type", exception.Message); + } + + [Fact] + public void GetNullableStruct_ReturnsValueWhenPresent() + { + var dict = new JsonDictionary(); + dict.Set("age", 30); + + var age = dict.GetNullableStruct("age"); + + Assert.Equal(30, age); + } + + [Fact] + public void GetNullableStruct_ReturnsNullWhenKeyAbsent() + { + var dict = new JsonDictionary(); + + var missing = dict.GetNullableStruct("missing"); + + Assert.Null(missing); + } + + [Fact] + public void GetNullableStruct_ReturnsNullWhenValueIsNull() + { + var dict = new JsonDictionary( + new Dictionary + { + ["nullable"] = JsonSerializer.SerializeToElement(null), + } + ); + + var nullable = dict.GetNullableStruct("nullable"); + + Assert.Null(nullable); + } + + [Fact] + public void GetNullableStruct_ThrowsWhenTypeInvalid() + { + var dict = new JsonDictionary(); + dict.Set("text", "not a number"); + + var exception = Assert.Throws(() => + dict.GetNullableStruct("text") + ); + Assert.Contains("'text' must be of type", exception.Message); + } + + [Fact] + public void ComplexWorkflow_SetFreezeAndGet() + { + var dict = new JsonDictionary(); + dict.Set("name", "Alice"); + dict.Set("age", 30); + dict.Set("active", true); + + var frozen = dict.Freeze(); + + Assert.Equal("Alice", dict.GetNotNullClass("name")); + Assert.Equal(30, dict.GetNotNullStruct("age")); + Assert.True(dict.GetNotNullStruct("active")); + Assert.Null(dict.GetNullableClass("missing")); + + Assert.Throws(() => dict.Set("new", "value")); + } + + [Fact] + public void ToString_ContainsJsonValues() + { + var dict = new JsonDictionary(); + dict.Set("name", "Alice"); + dict.Set("age", 30); + + var json = dict.ToString(); + + Assert.Contains("\"name\"", json); + Assert.Contains("\"Alice\"", json); + Assert.Contains("\"age\"", json); + Assert.Contains("30", json); + } + + [Fact] + public void Equals_ReturnsTrueForSameContent() + { + var dict1 = new JsonDictionary(); + dict1.Set("name", "Alice"); + dict1.Set("age", 30); + + var dict2 = new JsonDictionary(); + dict2.Set("name", "Alice"); + dict2.Set("age", 30); + + Assert.True(dict1.Equals(dict2)); + } + + [Fact] + public void Equals_ReturnsFalseForDifferentContent() + { + var dict1 = new JsonDictionary(); + dict1.Set("name", "Alice"); + + var dict2 = new JsonDictionary(); + dict2.Set("name", "Bob"); + + Assert.False(dict1.Equals(dict2)); + } + + [Fact] + public void Equals_ReturnsFalseForDifferentCounts() + { + var dict1 = new JsonDictionary(); + dict1.Set("name", "Alice"); + dict1.Set("age", 30); + + var dict2 = new JsonDictionary(); + dict2.Set("name", "Alice"); + + Assert.False(dict1.Equals(dict2)); + } + + [Fact] + public void Equals_ReturnsFalseForNull() + { + var dict = new JsonDictionary(); + dict.Set("name", "Alice"); + + Assert.False(dict.Equals(null)); + } + + [Fact] + public void Equals_ReturnsFalseForDifferentType() + { + var dict = new JsonDictionary(); + dict.Set("name", "Alice"); + + Assert.False(dict.Equals("not a dictionary")); + } +} diff --git a/src/Courier.Tests/Core/JsonModelTest.cs b/src/Courier.Tests/Core/JsonModelTest.cs deleted file mode 100644 index 3f941f4f..00000000 --- a/src/Courier.Tests/Core/JsonModelTest.cs +++ /dev/null @@ -1,197 +0,0 @@ -using System.Collections.Generic; -using System.Text.Json; -using Courier.Core; -using Courier.Exceptions; - -namespace Courier.Tests.Core; - -public class JsonModelTest -{ - [Fact] - public void GetNotNullClass_WhenPresent_Works() - { - var dictionary = new Dictionary(); - JsonModel.Set(dictionary, "key", "value"); - - var value = JsonModel.GetNotNullClass(dictionary, "key"); - - Assert.Equal("value", value); - } - - [Fact] - public void GetNotNullClass_WhenAbsent_Throws() - { - var dictionary = new Dictionary(); - - var exception = Assert.Throws(() => - JsonModel.GetNotNullClass(dictionary, "key") - ); - - Assert.Equal("'key' cannot be absent", exception.Message); - } - - [Fact] - public void GetNotNullClass_WhenNull_Throws() - { - var dictionary = new Dictionary(); - JsonModel.Set(dictionary, "key", null); - - var exception = Assert.Throws(() => - JsonModel.GetNotNullClass(dictionary, "key") - ); - - Assert.Equal("'key' cannot be null", exception.Message); - } - - [Fact] - public void GetNotNullClass_WhenMismatchedType_Throws() - { - var dictionary = new Dictionary(); - JsonModel.Set(dictionary, "key", 42); - - var exception = Assert.Throws(() => - JsonModel.GetNotNullClass(dictionary, "key") - ); - - Assert.Equal("'key' must be of type System.String", exception.Message); - } - - [Fact] - public void GetNotNullStruct_WhenPresent_Works() - { - var dictionary = new Dictionary(); - JsonModel.Set(dictionary, "key", 42); - - var value = JsonModel.GetNotNullStruct(dictionary, "key"); - - Assert.Equal(42, value); - } - - [Fact] - public void GetNotNullStruct_WhenAbsent_Throws() - { - var dictionary = new Dictionary(); - - var exception = Assert.Throws(() => - JsonModel.GetNotNullStruct(dictionary, "key") - ); - - Assert.Equal("'key' cannot be absent", exception.Message); - } - - [Fact] - public void GetNotNullStruct_WhenNull_Throws() - { - var dictionary = new Dictionary(); - JsonModel.Set(dictionary, "key", null); - - var exception = Assert.Throws(() => - JsonModel.GetNotNullStruct(dictionary, "key") - ); - - Assert.Equal("'key' cannot be null", exception.Message); - } - - [Fact] - public void GetNotNullStruct_WhenMismatchedType_Throws() - { - var dictionary = new Dictionary(); - JsonModel.Set(dictionary, "key", "value"); - - var exception = Assert.Throws(() => - JsonModel.GetNotNullStruct(dictionary, "key") - ); - - Assert.Equal("'key' must be of type System.Int32", exception.Message); - } - - [Fact] - public void GetNullableClass_WhenPresent_Works() - { - var dictionary = new Dictionary(); - JsonModel.Set(dictionary, "key", "value"); - - var value = JsonModel.GetNullableClass(dictionary, "key"); - - Assert.Equal("value", value); - } - - [Fact] - public void GetNullableClass_WhenAbsent_ReturnsNull() - { - var dictionary = new Dictionary(); - - var value = JsonModel.GetNullableClass(dictionary, "key"); - - Assert.Null(value); - } - - [Fact] - public void GetNullableClass_WhenNull_ReturnsNull() - { - var dictionary = new Dictionary(); - JsonModel.Set(dictionary, "key", null); - - var value = JsonModel.GetNullableClass(dictionary, "key"); - - Assert.Null(value); - } - - [Fact] - public void GetNullableClass_WhenMismatchedType_Throws() - { - var dictionary = new Dictionary(); - JsonModel.Set(dictionary, "key", 42); - - var exception = Assert.Throws(() => - JsonModel.GetNullableClass(dictionary, "key") - ); - - Assert.Equal("'key' must be of type System.String", exception.Message); - } - - [Fact] - public void GetNullableStruct_WhenPresent_Works() - { - var dictionary = new Dictionary(); - JsonModel.Set(dictionary, "key", 42); - - var value = JsonModel.GetNullableStruct(dictionary, "key"); - - Assert.Equal(42, value); - } - - [Fact] - public void GetNullableStruct_WhenAbsent_ReturnsNull() - { - var dictionary = new Dictionary(); - - var value = JsonModel.GetNullableStruct(dictionary, "key"); - - Assert.Null(value); - } - - [Fact] - public void GetNullableStruct_WhenNull_ReturnsNull() - { - var dictionary = new Dictionary(); - JsonModel.Set(dictionary, "key", null); - - var value = JsonModel.GetNullableStruct(dictionary, "key"); - - Assert.Null(value); - } - - [Fact] - public void GetNullableStruct_WhenMismatchedType_Throws() - { - var dictionary = new Dictionary(); - JsonModel.Set(dictionary, "key", "value"); - - var exception = Assert.Throws(() => - JsonModel.GetNullableStruct(dictionary, "key") - ); - - Assert.Equal("'key' must be of type System.Int32", exception.Message); - } -} diff --git a/src/Courier.Tests/Core/MultipartJsonDictionaryTest.cs b/src/Courier.Tests/Core/MultipartJsonDictionaryTest.cs new file mode 100644 index 00000000..b79be965 --- /dev/null +++ b/src/Courier.Tests/Core/MultipartJsonDictionaryTest.cs @@ -0,0 +1,333 @@ +using System; +using System.Collections.Frozen; +using System.Collections.Generic; +using Courier.Core; +using Courier.Exceptions; + +namespace Courier.Tests.Core; + +public class MultipartJsonDictionaryTest : TestBase +{ + [Fact] + public void DefaultConstructor_CreatesEmptyDictionary() + { + var dict = new MultipartJsonDictionary(); + + Assert.Empty(dict.Freeze()); + } + + [Fact] + public void DictionaryConstructor_CopiesData() + { + var source = new Dictionary + { + ["foo"] = MultipartJsonSerializer.SerializeToElement("bar"), + ["bar"] = MultipartJsonSerializer.SerializeToElement(42), + }; + + var dict = new MultipartJsonDictionary(source); + + var frozen = dict.Freeze(); + Assert.Equal(2, frozen.Count); + Assert.Equal("bar", frozen["foo"].Json.GetString()); + Assert.Equal(42, frozen["bar"].Json.GetInt32()); + } + + [Fact] + public void FrozenDictionaryConstructor_UsesProvidedDictionary() + { + var source = FrozenDictionary.ToFrozenDictionary( + new Dictionary + { + ["foo"] = MultipartJsonSerializer.SerializeToElement("bar"), + } + ); + + var dict = new MultipartJsonDictionary(source); + + var frozen = dict.Freeze(); + Assert.Same(source, frozen); + } + + [Fact] + public void Set_AddsValueWhenUnfrozen() + { + var dict = new MultipartJsonDictionary(); + + dict.Set("name", "Alice"); + dict.Set("age", 30); + + var frozen = dict.Freeze(); + Assert.Equal("Alice", frozen["name"].Json.GetString()); + Assert.Equal(30, frozen["age"].Json.GetInt32()); + } + + [Fact] + public void Set_OverwritesExistingValue() + { + var dict = new MultipartJsonDictionary(); + + dict.Set("foo", "bar"); + dict.Set("foo", "baz"); + + var frozen = dict.Freeze(); + Assert.Equal("baz", frozen["foo"].Json.GetString()); + } + + [Fact] + public void Set_ThrowsAfterFreezing() + { + var dict = new MultipartJsonDictionary(); + dict.Freeze(); + + Assert.Throws(() => dict.Set("foo", "bar")); + } + + [Fact] + public void Freeze_ReturnsFrozenDictionary() + { + var dict = new MultipartJsonDictionary(); + dict.Set("foo", "bar"); + + var frozen1 = dict.Freeze(); + var frozen2 = dict.Freeze(); + + Assert.Same(frozen1, frozen2); + } + + [Fact] + public void GetNotNullClass_ReturnsValue() + { + var dict = new MultipartJsonDictionary(); + dict.Set("name", "Alice"); + + Assert.Equal("Alice", dict.GetNotNullClass("name")); + } + + [Fact] + public void GetNotNullClass_CachesDeserializedValue() + { + var dict = new MultipartJsonDictionary(); + dict.Set("name", "Alice"); + + var first = dict.GetNotNullClass("name"); + var second = dict.GetNotNullClass("name"); + + Assert.Same(first, second); + } + + [Fact] + public void GetNotNullClass_ThrowsWhenKeyAbsent() + { + var dict = new MultipartJsonDictionary(); + + var exception = Assert.Throws(() => + dict.GetNotNullClass("missing") + ); + Assert.Contains("'missing' cannot be absent", exception.Message); + } + + [Fact] + public void GetNotNullClass_ThrowsWhenValueIsNull() + { + var dict = new MultipartJsonDictionary( + new Dictionary + { + ["nullable"] = MultipartJsonSerializer.SerializeToElement(null), + } + ); + + var exception = Assert.Throws(() => + dict.GetNotNullClass("nullable") + ); + Assert.Contains("'nullable' cannot be null", exception.Message); + } + + [Fact] + public void GetNotNullClass_ThrowsWhenTypeInvalid() + { + var dict = new MultipartJsonDictionary(); + dict.Set("number", 42); + + var exception = Assert.Throws(() => + dict.GetNotNullClass("number") + ); + Assert.Contains("'number' must be of type", exception.Message); + } + + [Fact] + public void GetNotNullStruct_ReturnsValue() + { + var dict = new MultipartJsonDictionary(); + dict.Set("age", 30); + + var age = dict.GetNotNullStruct("age"); + + Assert.Equal(30, age); + } + + [Fact] + public void GetNotNullStruct_ThrowsWhenKeyAbsent() + { + var dict = new MultipartJsonDictionary(); + + var exception = Assert.Throws(() => + dict.GetNotNullStruct("missing") + ); + Assert.Contains("'missing' cannot be absent", exception.Message); + } + + [Fact] + public void GetNotNullStruct_ThrowsWhenValueIsNull() + { + var dict = new MultipartJsonDictionary( + new Dictionary + { + ["nullable"] = MultipartJsonSerializer.SerializeToElement(null), + } + ); + + var exception = Assert.Throws(() => + dict.GetNotNullStruct("nullable") + ); + Assert.Contains("'nullable' cannot be null", exception.Message); + } + + [Fact] + public void GetNotNullStruct_ThrowsWhenTypeInvalid() + { + var dict = new MultipartJsonDictionary(); + dict.Set("text", "not a number"); + + var exception = Assert.Throws(() => + dict.GetNotNullStruct("text") + ); + Assert.Contains("'text' must be of type", exception.Message); + } + + [Fact] + public void GetNullableClass_ReturnsValueWhenPresent() + { + var dict = new MultipartJsonDictionary(); + dict.Set("name", "Alice"); + + var name = dict.GetNullableClass("name"); + + Assert.Equal("Alice", name); + } + + [Fact] + public void GetNullableClass_ReturnsNullWhenKeyAbsent() + { + var dict = new MultipartJsonDictionary(); + + var missing = dict.GetNullableClass("missing"); + + Assert.Null(missing); + } + + [Fact] + public void GetNullableClass_ReturnsNullWhenValueIsNull() + { + var dict = new MultipartJsonDictionary( + new Dictionary + { + ["nullable"] = MultipartJsonSerializer.SerializeToElement(null), + } + ); + + var nullable = dict.GetNullableClass("nullable"); + + Assert.Null(nullable); + } + + [Fact] + public void GetNullableClass_CachesDeserializedValue() + { + var dict = new MultipartJsonDictionary(); + dict.Set("name", "Alice"); + + var first = dict.GetNullableClass("name"); + var second = dict.GetNullableClass("name"); + + Assert.Same(first, second); + } + + [Fact] + public void GetNullableClass_ThrowsWhenTypeInvalid() + { + var dict = new MultipartJsonDictionary(); + dict.Set("number", 42); + + var exception = Assert.Throws(() => + dict.GetNullableClass("number") + ); + Assert.Contains("'number' must be of type", exception.Message); + } + + [Fact] + public void GetNullableStruct_ReturnsValueWhenPresent() + { + var dict = new MultipartJsonDictionary(); + dict.Set("age", 30); + + var age = dict.GetNullableStruct("age"); + + Assert.Equal(30, age); + } + + [Fact] + public void GetNullableStruct_ReturnsNullWhenKeyAbsent() + { + var dict = new MultipartJsonDictionary(); + + var missing = dict.GetNullableStruct("missing"); + + Assert.Null(missing); + } + + [Fact] + public void GetNullableStruct_ReturnsNullWhenValueIsNull() + { + var dict = new MultipartJsonDictionary( + new Dictionary + { + ["nullable"] = MultipartJsonSerializer.SerializeToElement(null), + } + ); + + var nullable = dict.GetNullableStruct("nullable"); + + Assert.Null(nullable); + } + + [Fact] + public void GetNullableStruct_ThrowsWhenTypeInvalid() + { + var dict = new MultipartJsonDictionary(); + dict.Set("text", "not a number"); + + var exception = Assert.Throws(() => + dict.GetNullableStruct("text") + ); + Assert.Contains("'text' must be of type", exception.Message); + } + + [Fact] + public void ComplexWorkflow_SetFreezeAndGet() + { + var dict = new MultipartJsonDictionary(); + dict.Set("name", "Alice"); + dict.Set("age", 30); + dict.Set("active", true); + + var frozen = dict.Freeze(); + + Assert.Equal("Alice", dict.GetNotNullClass("name")); + Assert.Equal(30, dict.GetNotNullStruct("age")); + Assert.True(dict.GetNotNullStruct("active")); + Assert.Null(dict.GetNullableClass("missing")); + + Assert.Throws(() => dict.Set("new", "value")); + } +} diff --git a/src/Courier.Tests/Core/MultipartJsonModelTest.cs b/src/Courier.Tests/Core/MultipartJsonModelTest.cs deleted file mode 100644 index ba93324c..00000000 --- a/src/Courier.Tests/Core/MultipartJsonModelTest.cs +++ /dev/null @@ -1,196 +0,0 @@ -using System.Collections.Generic; -using Courier.Core; -using Courier.Exceptions; - -namespace Courier.Tests.Core; - -public class MultipartJsonModelTest -{ - [Fact] - public void GetNotNullClass_WhenPresent_Works() - { - var dictionary = new Dictionary(); - MultipartJsonModel.Set(dictionary, "key", "value"); - - var value = MultipartJsonModel.GetNotNullClass(dictionary, "key"); - - Assert.Equal("value", value); - } - - [Fact] - public void GetNotNullClass_WhenAbsent_Throws() - { - var dictionary = new Dictionary(); - - var exception = Assert.Throws(() => - MultipartJsonModel.GetNotNullClass(dictionary, "key") - ); - - Assert.Equal("'key' cannot be absent", exception.Message); - } - - [Fact] - public void GetNotNullClass_WhenNull_Throws() - { - var dictionary = new Dictionary(); - MultipartJsonModel.Set(dictionary, "key", null); - - var exception = Assert.Throws(() => - MultipartJsonModel.GetNotNullClass(dictionary, "key") - ); - - Assert.Equal("'key' cannot be null", exception.Message); - } - - [Fact] - public void GetNotNullClass_WhenMismatchedType_Throws() - { - var dictionary = new Dictionary(); - MultipartJsonModel.Set(dictionary, "key", 42); - - var exception = Assert.Throws(() => - MultipartJsonModel.GetNotNullClass(dictionary, "key") - ); - - Assert.Equal("'key' must be of type System.String", exception.Message); - } - - [Fact] - public void GetNotNullStruct_WhenPresent_Works() - { - var dictionary = new Dictionary(); - MultipartJsonModel.Set(dictionary, "key", 42); - - var value = MultipartJsonModel.GetNotNullStruct(dictionary, "key"); - - Assert.Equal(42, value); - } - - [Fact] - public void GetNotNullStruct_WhenAbsent_Throws() - { - var dictionary = new Dictionary(); - - var exception = Assert.Throws(() => - MultipartJsonModel.GetNotNullStruct(dictionary, "key") - ); - - Assert.Equal("'key' cannot be absent", exception.Message); - } - - [Fact] - public void GetNotNullStruct_WhenNull_Throws() - { - var dictionary = new Dictionary(); - MultipartJsonModel.Set(dictionary, "key", null); - - var exception = Assert.Throws(() => - MultipartJsonModel.GetNotNullStruct(dictionary, "key") - ); - - Assert.Equal("'key' cannot be null", exception.Message); - } - - [Fact] - public void GetNotNullStruct_WhenMismatchedType_Throws() - { - var dictionary = new Dictionary(); - MultipartJsonModel.Set(dictionary, "key", "value"); - - var exception = Assert.Throws(() => - MultipartJsonModel.GetNotNullStruct(dictionary, "key") - ); - - Assert.Equal("'key' must be of type System.Int32", exception.Message); - } - - [Fact] - public void GetNullableClass_WhenPresent_Works() - { - var dictionary = new Dictionary(); - MultipartJsonModel.Set(dictionary, "key", "value"); - - var value = MultipartJsonModel.GetNullableClass(dictionary, "key"); - - Assert.Equal("value", value); - } - - [Fact] - public void GetNullableClass_WhenAbsent_ReturnsNull() - { - var dictionary = new Dictionary(); - - var value = MultipartJsonModel.GetNullableClass(dictionary, "key"); - - Assert.Null(value); - } - - [Fact] - public void GetNullableClass_WhenNull_ReturnsNull() - { - var dictionary = new Dictionary(); - MultipartJsonModel.Set(dictionary, "key", null); - - var value = MultipartJsonModel.GetNullableClass(dictionary, "key"); - - Assert.Null(value); - } - - [Fact] - public void GetNullableClass_WhenMismatchedType_Throws() - { - var dictionary = new Dictionary(); - MultipartJsonModel.Set(dictionary, "key", 42); - - var exception = Assert.Throws(() => - MultipartJsonModel.GetNullableClass(dictionary, "key") - ); - - Assert.Equal("'key' must be of type System.String", exception.Message); - } - - [Fact] - public void GetNullableStruct_WhenPresent_Works() - { - var dictionary = new Dictionary(); - MultipartJsonModel.Set(dictionary, "key", 42); - - var value = MultipartJsonModel.GetNullableStruct(dictionary, "key"); - - Assert.Equal(42, value); - } - - [Fact] - public void GetNullableStruct_WhenAbsent_ReturnsNull() - { - var dictionary = new Dictionary(); - - var value = MultipartJsonModel.GetNullableStruct(dictionary, "key"); - - Assert.Null(value); - } - - [Fact] - public void GetNullableStruct_WhenNull_ReturnsNull() - { - var dictionary = new Dictionary(); - MultipartJsonModel.Set(dictionary, "key", null); - - var value = MultipartJsonModel.GetNullableStruct(dictionary, "key"); - - Assert.Null(value); - } - - [Fact] - public void GetNullableStruct_WhenMismatchedType_Throws() - { - var dictionary = new Dictionary(); - MultipartJsonModel.Set(dictionary, "key", "value"); - - var exception = Assert.Throws(() => - MultipartJsonModel.GetNullableStruct(dictionary, "key") - ); - - Assert.Equal("'key' must be of type System.Int32", exception.Message); - } -} diff --git a/src/Courier.Tests/Models/AirshipProfileAudienceTest.cs b/src/Courier.Tests/Models/AirshipProfileAudienceTest.cs index 266089a0..21e82810 100644 --- a/src/Courier.Tests/Models/AirshipProfileAudienceTest.cs +++ b/src/Courier.Tests/Models/AirshipProfileAudienceTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -20,8 +21,11 @@ public void SerializationRoundtrip_Works() { var model = new AirshipProfileAudience { NamedUser = "named_user" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -31,8 +35,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new AirshipProfileAudience { NamedUser = "named_user" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedNamedUser = "named_user"; diff --git a/src/Courier.Tests/Models/AirshipProfileTest.cs b/src/Courier.Tests/Models/AirshipProfileTest.cs index 0e4fe150..38fe5957 100644 --- a/src/Courier.Tests/Models/AirshipProfileTest.cs +++ b/src/Courier.Tests/Models/AirshipProfileTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -27,8 +28,11 @@ public void SerializationRoundtrip_Works() { var model = new AirshipProfile { Audience = new("named_user"), DeviceTypes = ["string"] }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -38,8 +42,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new AirshipProfile { Audience = new("named_user"), DeviceTypes = ["string"] }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); AirshipProfileAudience expectedAudience = new("named_user"); diff --git a/src/Courier.Tests/Models/AlignmentTest.cs b/src/Courier.Tests/Models/AlignmentTest.cs index 23730868..85adb750 100644 --- a/src/Courier.Tests/Models/AlignmentTest.cs +++ b/src/Courier.Tests/Models/AlignmentTest.cs @@ -23,7 +23,7 @@ public void Validation_Works(Alignment rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -54,7 +54,7 @@ public void SerializationRoundtrip_Works(Alignment rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/AudienceFilterConfigTest.cs b/src/Courier.Tests/Models/AudienceFilterConfigTest.cs new file mode 100644 index 00000000..897d6ee2 --- /dev/null +++ b/src/Courier.Tests/Models/AudienceFilterConfigTest.cs @@ -0,0 +1,132 @@ +using System.Collections.Generic; +using System.Text.Json; +using Courier.Core; +using Courier.Models; + +namespace Courier.Tests.Models; + +public class AudienceFilterConfigTest : TestBase +{ + [Fact] + public void FieldRoundtrip_Works() + { + var model = new AudienceFilterConfig + { + Filters = + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ], + }; + + List expectedFilters = + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ]; + + Assert.Equal(expectedFilters.Count, model.Filters.Count); + for (int i = 0; i < expectedFilters.Count; i++) + { + Assert.Equal(expectedFilters[i], model.Filters[i]); + } + } + + [Fact] + public void SerializationRoundtrip_Works() + { + var model = new AudienceFilterConfig + { + Filters = + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ], + }; + + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); + + Assert.Equal(model, deserialized); + } + + [Fact] + public void FieldRoundtripThroughSerialization_Works() + { + var model = new AudienceFilterConfig + { + Filters = + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ], + }; + + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); + Assert.NotNull(deserialized); + + List expectedFilters = + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ]; + + Assert.Equal(expectedFilters.Count, deserialized.Filters.Count); + for (int i = 0; i < expectedFilters.Count; i++) + { + Assert.Equal(expectedFilters[i], deserialized.Filters[i]); + } + } + + [Fact] + public void Validation_Works() + { + var model = new AudienceFilterConfig + { + Filters = + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ], + }; + + model.Validate(); + } +} diff --git a/src/Courier.Tests/Models/AudienceFilterTest.cs b/src/Courier.Tests/Models/AudienceFilterTest.cs index ade61b7d..24d55abd 100644 --- a/src/Courier.Tests/Models/AudienceFilterTest.cs +++ b/src/Courier.Tests/Models/AudienceFilterTest.cs @@ -36,8 +36,11 @@ public void SerializationRoundtrip_Works() Value = "value", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -52,8 +55,11 @@ public void FieldRoundtripThroughSerialization_Works() Value = "value", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedOperator = Operator.MemberOf; @@ -94,7 +100,7 @@ public void Validation_Works(Operator rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -122,7 +128,7 @@ public void SerializationRoundtrip_Works(Operator rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -150,7 +156,7 @@ public void Validation_Works(Path rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -178,7 +184,7 @@ public void SerializationRoundtrip_Works(Path rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/AudienceRecipientTest.cs b/src/Courier.Tests/Models/AudienceRecipientTest.cs index b40a75c4..ef899331 100644 --- a/src/Courier.Tests/Models/AudienceRecipientTest.cs +++ b/src/Courier.Tests/Models/AudienceRecipientTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -80,8 +81,11 @@ public void SerializationRoundtrip_Works() ], }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -107,8 +111,11 @@ public void FieldRoundtripThroughSerialization_Works() ], }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedAudienceID = "audience_id"; diff --git a/src/Courier.Tests/Models/Audiences/AudienceListMembersResponseTest.cs b/src/Courier.Tests/Models/Audiences/AudienceListMembersResponseTest.cs index 40f71cb3..2b4795a1 100644 --- a/src/Courier.Tests/Models/Audiences/AudienceListMembersResponseTest.cs +++ b/src/Courier.Tests/Models/Audiences/AudienceListMembersResponseTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.Audiences; @@ -66,8 +67,11 @@ public void SerializationRoundtrip_Works() Paging = new() { More = true, Cursor = "cursor" }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -91,8 +95,11 @@ public void FieldRoundtripThroughSerialization_Works() Paging = new() { More = true, Cursor = "cursor" }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedItems = @@ -178,8 +185,8 @@ public void SerializationRoundtrip_Works() Reason = "reason", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -196,8 +203,8 @@ public void FieldRoundtripThroughSerialization_Works() Reason = "reason", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedAddedAt = "added_at"; diff --git a/src/Courier.Tests/Models/Audiences/AudienceListResponseTest.cs b/src/Courier.Tests/Models/Audiences/AudienceListResponseTest.cs index cfc23a47..1f761f5d 100644 --- a/src/Courier.Tests/Models/Audiences/AudienceListResponseTest.cs +++ b/src/Courier.Tests/Models/Audiences/AudienceListResponseTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.Audiences; @@ -19,14 +20,20 @@ public void FieldRoundtrip_Works() ID = "id", CreatedAt = "created_at", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, Name = "name", UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + Operator = AudienceOperator.And, }, ], Paging = new() { More = true, Cursor = "cursor" }, @@ -39,14 +46,20 @@ public void FieldRoundtrip_Works() ID = "id", CreatedAt = "created_at", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, Name = "name", UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + Operator = AudienceOperator.And, }, ]; Paging expectedPaging = new() { More = true, Cursor = "cursor" }; @@ -71,21 +84,30 @@ public void SerializationRoundtrip_Works() ID = "id", CreatedAt = "created_at", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, Name = "name", UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + Operator = AudienceOperator.And, }, ], Paging = new() { More = true, Cursor = "cursor" }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -102,21 +124,30 @@ public void FieldRoundtripThroughSerialization_Works() ID = "id", CreatedAt = "created_at", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, Name = "name", UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + Operator = AudienceOperator.And, }, ], Paging = new() { More = true, Cursor = "cursor" }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedItems = @@ -126,14 +157,20 @@ public void FieldRoundtripThroughSerialization_Works() ID = "id", CreatedAt = "created_at", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, Name = "name", UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + Operator = AudienceOperator.And, }, ]; Paging expectedPaging = new() { More = true, Cursor = "cursor" }; @@ -158,14 +195,20 @@ public void Validation_Works() ID = "id", CreatedAt = "created_at", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, Name = "name", UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + Operator = AudienceOperator.And, }, ], Paging = new() { More = true, Cursor = "cursor" }, diff --git a/src/Courier.Tests/Models/Audiences/AudienceTest.cs b/src/Courier.Tests/Models/Audiences/AudienceTest.cs index b1ef6f05..65e2ff0d 100644 --- a/src/Courier.Tests/Models/Audiences/AudienceTest.cs +++ b/src/Courier.Tests/Models/Audiences/AudienceTest.cs @@ -1,4 +1,7 @@ using System.Text.Json; +using Courier.Core; +using Courier.Exceptions; +using Courier.Models; using Courier.Models.Audiences; namespace Courier.Tests.Models.Audiences; @@ -13,34 +16,47 @@ public void FieldRoundtrip_Works() ID = "id", CreatedAt = "created_at", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, Name = "name", UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + Operator = AudienceOperator.And, }; string expectedID = "id"; string expectedCreatedAt = "created_at"; string expectedDescription = "description"; - Filter expectedFilter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }; string expectedName = "name"; string expectedUpdatedAt = "updated_at"; + AudienceFilterConfig expectedFilter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ); + ApiEnum expectedOperator = AudienceOperator.And; Assert.Equal(expectedID, model.ID); Assert.Equal(expectedCreatedAt, model.CreatedAt); Assert.Equal(expectedDescription, model.Description); - Assert.Equal(expectedFilter, model.Filter); Assert.Equal(expectedName, model.Name); Assert.Equal(expectedUpdatedAt, model.UpdatedAt); + Assert.Equal(expectedFilter, model.Filter); + Assert.Equal(expectedOperator, model.Operator); } [Fact] @@ -51,18 +67,24 @@ public void SerializationRoundtrip_Works() ID = "id", CreatedAt = "created_at", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, Name = "name", UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + Operator = AudienceOperator.And, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -75,38 +97,54 @@ public void FieldRoundtripThroughSerialization_Works() ID = "id", CreatedAt = "created_at", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, Name = "name", UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + Operator = AudienceOperator.And, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedID = "id"; string expectedCreatedAt = "created_at"; string expectedDescription = "description"; - Filter expectedFilter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }; string expectedName = "name"; string expectedUpdatedAt = "updated_at"; + AudienceFilterConfig expectedFilter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ); + ApiEnum expectedOperator = AudienceOperator.And; Assert.Equal(expectedID, deserialized.ID); Assert.Equal(expectedCreatedAt, deserialized.CreatedAt); Assert.Equal(expectedDescription, deserialized.Description); - Assert.Equal(expectedFilter, deserialized.Filter); Assert.Equal(expectedName, deserialized.Name); Assert.Equal(expectedUpdatedAt, deserialized.UpdatedAt); + Assert.Equal(expectedFilter, deserialized.Filter); + Assert.Equal(expectedOperator, deserialized.Operator); } [Fact] @@ -117,16 +155,262 @@ public void Validation_Works() ID = "id", CreatedAt = "created_at", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, Name = "name", UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + Operator = AudienceOperator.And, + }; + + model.Validate(); + } + + [Fact] + public void OptionalNonNullablePropertiesUnsetAreNotSet_Works() + { + var model = new Audience + { + ID = "id", + CreatedAt = "created_at", + Description = "description", + Name = "name", + UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + }; + + Assert.Null(model.Operator); + Assert.False(model.RawData.ContainsKey("operator")); + } + + [Fact] + public void OptionalNonNullablePropertiesUnsetValidation_Works() + { + var model = new Audience + { + ID = "id", + CreatedAt = "created_at", + Description = "description", + Name = "name", + UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + }; + + model.Validate(); + } + + [Fact] + public void OptionalNonNullablePropertiesSetToNullAreNotSet_Works() + { + var model = new Audience + { + ID = "id", + CreatedAt = "created_at", + Description = "description", + Name = "name", + UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + + // Null should be interpreted as omitted for these properties + Operator = null, + }; + + Assert.Null(model.Operator); + Assert.False(model.RawData.ContainsKey("operator")); + } + + [Fact] + public void OptionalNonNullablePropertiesSetToNullValidation_Works() + { + var model = new Audience + { + ID = "id", + CreatedAt = "created_at", + Description = "description", + Name = "name", + UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + + // Null should be interpreted as omitted for these properties + Operator = null, + }; + + model.Validate(); + } + + [Fact] + public void OptionalNullablePropertiesUnsetAreNotSet_Works() + { + var model = new Audience + { + ID = "id", + CreatedAt = "created_at", + Description = "description", + Name = "name", + UpdatedAt = "updated_at", + Operator = AudienceOperator.And, + }; + + Assert.Null(model.Filter); + Assert.False(model.RawData.ContainsKey("filter")); + } + + [Fact] + public void OptionalNullablePropertiesUnsetValidation_Works() + { + var model = new Audience + { + ID = "id", + CreatedAt = "created_at", + Description = "description", + Name = "name", + UpdatedAt = "updated_at", + Operator = AudienceOperator.And, + }; + + model.Validate(); + } + + [Fact] + public void OptionalNullablePropertiesSetToNullAreSetToNull_Works() + { + var model = new Audience + { + ID = "id", + CreatedAt = "created_at", + Description = "description", + Name = "name", + UpdatedAt = "updated_at", + Operator = AudienceOperator.And, + + Filter = null, + }; + + Assert.Null(model.Filter); + Assert.True(model.RawData.ContainsKey("filter")); + } + + [Fact] + public void OptionalNullablePropertiesSetToNullValidation_Works() + { + var model = new Audience + { + ID = "id", + CreatedAt = "created_at", + Description = "description", + Name = "name", + UpdatedAt = "updated_at", + Operator = AudienceOperator.And, + + Filter = null, }; model.Validate(); } } + +public class AudienceOperatorTest : TestBase +{ + [Theory] + [InlineData(AudienceOperator.And)] + [InlineData(AudienceOperator.Or)] + public void Validation_Works(AudienceOperator rawValue) + { + // force implicit conversion because Theory can't do that for us + ApiEnum value = rawValue; + value.Validate(); + } + + [Fact] + public void InvalidEnumValidationThrows_Works() + { + var value = JsonSerializer.Deserialize>( + JsonSerializer.SerializeToElement("invalid value"), + ModelBase.SerializerOptions + ); + + Assert.NotNull(value); + Assert.Throws(() => value.Validate()); + } + + [Theory] + [InlineData(AudienceOperator.And)] + [InlineData(AudienceOperator.Or)] + public void SerializationRoundtrip_Works(AudienceOperator rawValue) + { + // force implicit conversion because Theory can't do that for us + ApiEnum value = rawValue; + + string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize>( + json, + ModelBase.SerializerOptions + ); + + Assert.Equal(value, deserialized); + } + + [Fact] + public void InvalidEnumSerializationRoundtrip_Works() + { + var value = JsonSerializer.Deserialize>( + JsonSerializer.SerializeToElement("invalid value"), + ModelBase.SerializerOptions + ); + string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize>( + json, + ModelBase.SerializerOptions + ); + + Assert.Equal(value, deserialized); + } +} diff --git a/src/Courier.Tests/Models/Audiences/AudienceUpdateParamsTest.cs b/src/Courier.Tests/Models/Audiences/AudienceUpdateParamsTest.cs index 66dd1a4f..0635e9d4 100644 --- a/src/Courier.Tests/Models/Audiences/AudienceUpdateParamsTest.cs +++ b/src/Courier.Tests/Models/Audiences/AudienceUpdateParamsTest.cs @@ -1,5 +1,9 @@ using System; +using System.Text.Json; +using Courier.Core; +using Courier.Exceptions; using Courier.Models.Audiences; +using Models = Courier.Models; namespace Courier.Tests.Models.Audiences; @@ -12,29 +16,42 @@ public void FieldRoundtrip_Works() { AudienceID = "audience_id", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), Name = "name", + Operator = Operator.And, }; string expectedAudienceID = "audience_id"; string expectedDescription = "description"; - Filter expectedFilter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }; + Models::AudienceFilterConfig expectedFilter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ); string expectedName = "name"; + ApiEnum expectedOperator = Operator.And; Assert.Equal(expectedAudienceID, parameters.AudienceID); Assert.Equal(expectedDescription, parameters.Description); Assert.Equal(expectedFilter, parameters.Filter); Assert.Equal(expectedName, parameters.Name); + Assert.Equal(expectedOperator, parameters.Operator); } [Fact] @@ -48,6 +65,8 @@ public void OptionalNullableParamsUnsetAreNotSet_Works() Assert.False(parameters.RawBodyData.ContainsKey("filter")); Assert.Null(parameters.Name); Assert.False(parameters.RawBodyData.ContainsKey("name")); + Assert.Null(parameters.Operator); + Assert.False(parameters.RawBodyData.ContainsKey("operator")); } [Fact] @@ -60,6 +79,7 @@ public void OptionalNullableParamsSetToNullAreSetToNull_Works() Description = null, Filter = null, Name = null, + Operator = null, }; Assert.Null(parameters.Description); @@ -68,6 +88,8 @@ public void OptionalNullableParamsSetToNullAreSetToNull_Works() Assert.True(parameters.RawBodyData.ContainsKey("filter")); Assert.Null(parameters.Name); Assert.True(parameters.RawBodyData.ContainsKey("name")); + Assert.Null(parameters.Operator); + Assert.True(parameters.RawBodyData.ContainsKey("operator")); } [Fact] @@ -80,3 +102,61 @@ public void Url_Works() Assert.Equal(new Uri("https://api.courier.com/audiences/audience_id"), url); } } + +public class OperatorTest : TestBase +{ + [Theory] + [InlineData(Operator.And)] + [InlineData(Operator.Or)] + public void Validation_Works(Operator rawValue) + { + // force implicit conversion because Theory can't do that for us + ApiEnum value = rawValue; + value.Validate(); + } + + [Fact] + public void InvalidEnumValidationThrows_Works() + { + var value = JsonSerializer.Deserialize>( + JsonSerializer.SerializeToElement("invalid value"), + ModelBase.SerializerOptions + ); + + Assert.NotNull(value); + Assert.Throws(() => value.Validate()); + } + + [Theory] + [InlineData(Operator.And)] + [InlineData(Operator.Or)] + public void SerializationRoundtrip_Works(Operator rawValue) + { + // force implicit conversion because Theory can't do that for us + ApiEnum value = rawValue; + + string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize>( + json, + ModelBase.SerializerOptions + ); + + Assert.Equal(value, deserialized); + } + + [Fact] + public void InvalidEnumSerializationRoundtrip_Works() + { + var value = JsonSerializer.Deserialize>( + JsonSerializer.SerializeToElement("invalid value"), + ModelBase.SerializerOptions + ); + string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize>( + json, + ModelBase.SerializerOptions + ); + + Assert.Equal(value, deserialized); + } +} diff --git a/src/Courier.Tests/Models/Audiences/AudienceUpdateResponseTest.cs b/src/Courier.Tests/Models/Audiences/AudienceUpdateResponseTest.cs index 97c783af..343667cc 100644 --- a/src/Courier.Tests/Models/Audiences/AudienceUpdateResponseTest.cs +++ b/src/Courier.Tests/Models/Audiences/AudienceUpdateResponseTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Audiences; namespace Courier.Tests.Models.Audiences; @@ -15,14 +16,20 @@ public void FieldRoundtrip_Works() ID = "id", CreatedAt = "created_at", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, Name = "name", UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + Operator = AudienceOperator.And, }, }; @@ -31,14 +38,20 @@ public void FieldRoundtrip_Works() ID = "id", CreatedAt = "created_at", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, Name = "name", UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + Operator = AudienceOperator.And, }; Assert.Equal(expectedAudience, model.Audience); @@ -54,19 +67,28 @@ public void SerializationRoundtrip_Works() ID = "id", CreatedAt = "created_at", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, Name = "name", UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + Operator = AudienceOperator.And, }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -81,19 +103,28 @@ public void FieldRoundtripThroughSerialization_Works() ID = "id", CreatedAt = "created_at", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, Name = "name", UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + Operator = AudienceOperator.And, }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Audience expectedAudience = new() @@ -101,14 +132,20 @@ public void FieldRoundtripThroughSerialization_Works() ID = "id", CreatedAt = "created_at", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, Name = "name", UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + Operator = AudienceOperator.And, }; Assert.Equal(expectedAudience, deserialized.Audience); @@ -124,14 +161,20 @@ public void Validation_Works() ID = "id", CreatedAt = "created_at", Description = "description", - Filter = new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, Name = "name", UpdatedAt = "updated_at", + Filter = new( + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ] + ), + Operator = AudienceOperator.And, }, }; diff --git a/src/Courier.Tests/Models/Audiences/FilterTest.cs b/src/Courier.Tests/Models/Audiences/FilterTest.cs deleted file mode 100644 index 2a32b759..00000000 --- a/src/Courier.Tests/Models/Audiences/FilterTest.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System.Text.Json; -using Courier.Models.Audiences; - -namespace Courier.Tests.Models.Audiences; - -public class FilterTest : TestBase -{ - [Fact] - public void SingleFilterConfigValidationWorks() - { - Filter value = new( - new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - } - ); - value.Validate(); - } - - [Fact] - public void NestedFilterConfigValidationWorks() - { - Filter value = new( - new NestedFilterConfig() - { - Operator = Operator.EndsWith, - Rules = - [ - new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, - ], - } - ); - value.Validate(); - } - - [Fact] - public void SingleFilterConfigSerializationRoundtripWorks() - { - Filter value = new( - new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - } - ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); - - Assert.Equal(value, deserialized); - } - - [Fact] - public void NestedFilterConfigSerializationRoundtripWorks() - { - Filter value = new( - new NestedFilterConfig() - { - Operator = Operator.EndsWith, - Rules = - [ - new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, - ], - } - ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); - - Assert.Equal(value, deserialized); - } -} diff --git a/src/Courier.Tests/Models/Audiences/NestedFilterConfigTest.cs b/src/Courier.Tests/Models/Audiences/NestedFilterConfigTest.cs deleted file mode 100644 index c2146b9c..00000000 --- a/src/Courier.Tests/Models/Audiences/NestedFilterConfigTest.cs +++ /dev/null @@ -1,213 +0,0 @@ -using System.Collections.Generic; -using System.Text.Json; -using Courier.Core; -using Courier.Exceptions; -using Courier.Models.Audiences; - -namespace Courier.Tests.Models.Audiences; - -public class NestedFilterConfigTest : TestBase -{ - [Fact] - public void FieldRoundtrip_Works() - { - var model = new NestedFilterConfig - { - Operator = Operator.EndsWith, - Rules = - [ - new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, - ], - }; - - ApiEnum expectedOperator = Operator.EndsWith; - List expectedRules = - [ - new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, - ]; - - Assert.Equal(expectedOperator, model.Operator); - Assert.Equal(expectedRules.Count, model.Rules.Count); - for (int i = 0; i < expectedRules.Count; i++) - { - Assert.Equal(expectedRules[i], model.Rules[i]); - } - } - - [Fact] - public void SerializationRoundtrip_Works() - { - var model = new NestedFilterConfig - { - Operator = Operator.EndsWith, - Rules = - [ - new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, - ], - }; - - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); - - Assert.Equal(model, deserialized); - } - - [Fact] - public void FieldRoundtripThroughSerialization_Works() - { - var model = new NestedFilterConfig - { - Operator = Operator.EndsWith, - Rules = - [ - new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, - ], - }; - - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); - Assert.NotNull(deserialized); - - ApiEnum expectedOperator = Operator.EndsWith; - List expectedRules = - [ - new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, - ]; - - Assert.Equal(expectedOperator, deserialized.Operator); - Assert.Equal(expectedRules.Count, deserialized.Rules.Count); - for (int i = 0; i < expectedRules.Count; i++) - { - Assert.Equal(expectedRules[i], deserialized.Rules[i]); - } - } - - [Fact] - public void Validation_Works() - { - var model = new NestedFilterConfig - { - Operator = Operator.EndsWith, - Rules = - [ - new SingleFilterConfig() - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }, - ], - }; - - model.Validate(); - } -} - -public class OperatorTest : TestBase -{ - [Theory] - [InlineData(Operator.EndsWith)] - [InlineData(Operator.Eq)] - [InlineData(Operator.Exists)] - [InlineData(Operator.Gt)] - [InlineData(Operator.Gte)] - [InlineData(Operator.Includes)] - [InlineData(Operator.IsAfter)] - [InlineData(Operator.IsBefore)] - [InlineData(Operator.Lt)] - [InlineData(Operator.Lte)] - [InlineData(Operator.Neq)] - [InlineData(Operator.Omit)] - [InlineData(Operator.StartsWith)] - [InlineData(Operator.And)] - [InlineData(Operator.Or)] - public void Validation_Works(Operator rawValue) - { - // force implicit conversion because Theory can't do that for us - ApiEnum value = rawValue; - value.Validate(); - } - - [Fact] - public void InvalidEnumValidationThrows_Works() - { - var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); - - Assert.NotNull(value); - Assert.Throws(() => value.Validate()); - } - - [Theory] - [InlineData(Operator.EndsWith)] - [InlineData(Operator.Eq)] - [InlineData(Operator.Exists)] - [InlineData(Operator.Gt)] - [InlineData(Operator.Gte)] - [InlineData(Operator.Includes)] - [InlineData(Operator.IsAfter)] - [InlineData(Operator.IsBefore)] - [InlineData(Operator.Lt)] - [InlineData(Operator.Lte)] - [InlineData(Operator.Neq)] - [InlineData(Operator.Omit)] - [InlineData(Operator.StartsWith)] - [InlineData(Operator.And)] - [InlineData(Operator.Or)] - public void SerializationRoundtrip_Works(Operator rawValue) - { - // force implicit conversion because Theory can't do that for us - ApiEnum value = rawValue; - - string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); - var deserialized = JsonSerializer.Deserialize>( - json, - ModelBase.SerializerOptions - ); - - Assert.Equal(value, deserialized); - } - - [Fact] - public void InvalidEnumSerializationRoundtrip_Works() - { - var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); - string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); - var deserialized = JsonSerializer.Deserialize>( - json, - ModelBase.SerializerOptions - ); - - Assert.Equal(value, deserialized); - } -} diff --git a/src/Courier.Tests/Models/Audiences/SingleFilterConfigTest.cs b/src/Courier.Tests/Models/Audiences/SingleFilterConfigTest.cs deleted file mode 100644 index baf095e3..00000000 --- a/src/Courier.Tests/Models/Audiences/SingleFilterConfigTest.cs +++ /dev/null @@ -1,166 +0,0 @@ -using System.Text.Json; -using Courier.Core; -using Courier.Exceptions; -using Courier.Models.Audiences; - -namespace Courier.Tests.Models.Audiences; - -public class SingleFilterConfigTest : TestBase -{ - [Fact] - public void FieldRoundtrip_Works() - { - var model = new SingleFilterConfig - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }; - - ApiEnum expectedOperator = - SingleFilterConfigOperator.EndsWith; - string expectedPath = "path"; - string expectedValue = "value"; - - Assert.Equal(expectedOperator, model.Operator); - Assert.Equal(expectedPath, model.Path); - Assert.Equal(expectedValue, model.Value); - } - - [Fact] - public void SerializationRoundtrip_Works() - { - var model = new SingleFilterConfig - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }; - - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); - - Assert.Equal(model, deserialized); - } - - [Fact] - public void FieldRoundtripThroughSerialization_Works() - { - var model = new SingleFilterConfig - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }; - - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); - Assert.NotNull(deserialized); - - ApiEnum expectedOperator = - SingleFilterConfigOperator.EndsWith; - string expectedPath = "path"; - string expectedValue = "value"; - - Assert.Equal(expectedOperator, deserialized.Operator); - Assert.Equal(expectedPath, deserialized.Path); - Assert.Equal(expectedValue, deserialized.Value); - } - - [Fact] - public void Validation_Works() - { - var model = new SingleFilterConfig - { - Operator = SingleFilterConfigOperator.EndsWith, - Path = "path", - Value = "value", - }; - - model.Validate(); - } -} - -public class SingleFilterConfigOperatorTest : TestBase -{ - [Theory] - [InlineData(SingleFilterConfigOperator.EndsWith)] - [InlineData(SingleFilterConfigOperator.Eq)] - [InlineData(SingleFilterConfigOperator.Exists)] - [InlineData(SingleFilterConfigOperator.Gt)] - [InlineData(SingleFilterConfigOperator.Gte)] - [InlineData(SingleFilterConfigOperator.Includes)] - [InlineData(SingleFilterConfigOperator.IsAfter)] - [InlineData(SingleFilterConfigOperator.IsBefore)] - [InlineData(SingleFilterConfigOperator.Lt)] - [InlineData(SingleFilterConfigOperator.Lte)] - [InlineData(SingleFilterConfigOperator.Neq)] - [InlineData(SingleFilterConfigOperator.Omit)] - [InlineData(SingleFilterConfigOperator.StartsWith)] - [InlineData(SingleFilterConfigOperator.And)] - [InlineData(SingleFilterConfigOperator.Or)] - public void Validation_Works(SingleFilterConfigOperator rawValue) - { - // force implicit conversion because Theory can't do that for us - ApiEnum value = rawValue; - value.Validate(); - } - - [Fact] - public void InvalidEnumValidationThrows_Works() - { - var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); - - Assert.NotNull(value); - Assert.Throws(() => value.Validate()); - } - - [Theory] - [InlineData(SingleFilterConfigOperator.EndsWith)] - [InlineData(SingleFilterConfigOperator.Eq)] - [InlineData(SingleFilterConfigOperator.Exists)] - [InlineData(SingleFilterConfigOperator.Gt)] - [InlineData(SingleFilterConfigOperator.Gte)] - [InlineData(SingleFilterConfigOperator.Includes)] - [InlineData(SingleFilterConfigOperator.IsAfter)] - [InlineData(SingleFilterConfigOperator.IsBefore)] - [InlineData(SingleFilterConfigOperator.Lt)] - [InlineData(SingleFilterConfigOperator.Lte)] - [InlineData(SingleFilterConfigOperator.Neq)] - [InlineData(SingleFilterConfigOperator.Omit)] - [InlineData(SingleFilterConfigOperator.StartsWith)] - [InlineData(SingleFilterConfigOperator.And)] - [InlineData(SingleFilterConfigOperator.Or)] - public void SerializationRoundtrip_Works(SingleFilterConfigOperator rawValue) - { - // force implicit conversion because Theory can't do that for us - ApiEnum value = rawValue; - - string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); - var deserialized = JsonSerializer.Deserialize>( - json, - ModelBase.SerializerOptions - ); - - Assert.Equal(value, deserialized); - } - - [Fact] - public void InvalidEnumSerializationRoundtrip_Works() - { - var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); - string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); - var deserialized = JsonSerializer.Deserialize>( - json, - ModelBase.SerializerOptions - ); - - Assert.Equal(value, deserialized); - } -} diff --git a/src/Courier.Tests/Models/AuditEvents/AuditEventListResponseTest.cs b/src/Courier.Tests/Models/AuditEvents/AuditEventListResponseTest.cs index 3843c4e2..50c8f761 100644 --- a/src/Courier.Tests/Models/AuditEvents/AuditEventListResponseTest.cs +++ b/src/Courier.Tests/Models/AuditEvents/AuditEventListResponseTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.AuditEvents; @@ -69,8 +70,11 @@ public void SerializationRoundtrip_Works() ], }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -95,8 +99,11 @@ public void FieldRoundtripThroughSerialization_Works() ], }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Paging expectedPaging = new() { More = true, Cursor = "cursor" }; diff --git a/src/Courier.Tests/Models/AuditEvents/AuditEventTest.cs b/src/Courier.Tests/Models/AuditEvents/AuditEventTest.cs index fdc2f182..b82e89de 100644 --- a/src/Courier.Tests/Models/AuditEvents/AuditEventTest.cs +++ b/src/Courier.Tests/Models/AuditEvents/AuditEventTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.AuditEvents; namespace Courier.Tests.Models.AuditEvents; @@ -46,8 +47,11 @@ public void SerializationRoundtrip_Works() Type = "type", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -65,8 +69,11 @@ public void FieldRoundtripThroughSerialization_Works() Type = "type", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Actor expectedActor = new() { ID = "id", Email = "email" }; @@ -120,8 +127,8 @@ public void SerializationRoundtrip_Works() { var model = new Actor { ID = "id", Email = "email" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -131,8 +138,8 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new Actor { ID = "id", Email = "email" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedID = "id"; diff --git a/src/Courier.Tests/Models/Auth/AuthIssueTokenResponseTest.cs b/src/Courier.Tests/Models/Auth/AuthIssueTokenResponseTest.cs index 93981f68..89ab60d8 100644 --- a/src/Courier.Tests/Models/Auth/AuthIssueTokenResponseTest.cs +++ b/src/Courier.Tests/Models/Auth/AuthIssueTokenResponseTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Auth; namespace Courier.Tests.Models.Auth; @@ -20,8 +21,11 @@ public void SerializationRoundtrip_Works() { var model = new AuthIssueTokenResponse { Token = "token" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -31,8 +35,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new AuthIssueTokenResponse { Token = "token" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedToken = "token"; diff --git a/src/Courier.Tests/Models/Automations/AutomationInvokeResponseTest.cs b/src/Courier.Tests/Models/Automations/AutomationInvokeResponseTest.cs index b6ec21cd..426736eb 100644 --- a/src/Courier.Tests/Models/Automations/AutomationInvokeResponseTest.cs +++ b/src/Courier.Tests/Models/Automations/AutomationInvokeResponseTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Automations; namespace Courier.Tests.Models.Automations; @@ -20,8 +21,11 @@ public void SerializationRoundtrip_Works() { var model = new AutomationInvokeResponse { RunID = "runId" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -31,8 +35,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new AutomationInvokeResponse { RunID = "runId" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedRunID = "runId"; diff --git a/src/Courier.Tests/Models/Automations/AutomationListParamsTest.cs b/src/Courier.Tests/Models/Automations/AutomationListParamsTest.cs index 1f1f2707..930d51ed 100644 --- a/src/Courier.Tests/Models/Automations/AutomationListParamsTest.cs +++ b/src/Courier.Tests/Models/Automations/AutomationListParamsTest.cs @@ -85,7 +85,7 @@ public void Validation_Works(Automations::Version rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -114,7 +114,7 @@ public void SerializationRoundtrip_Works(Automations::Version rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Automations/AutomationTemplateListResponseTest.cs b/src/Courier.Tests/Models/Automations/AutomationTemplateListResponseTest.cs index 8a9fb115..bf940ed1 100644 --- a/src/Courier.Tests/Models/Automations/AutomationTemplateListResponseTest.cs +++ b/src/Courier.Tests/Models/Automations/AutomationTemplateListResponseTest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models.Automations; namespace Courier.Tests.Models.Automations; @@ -67,8 +68,11 @@ public void SerializationRoundtrip_Works() ], }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -92,8 +96,11 @@ public void FieldRoundtripThroughSerialization_Works() ], }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedCursor = "cursor"; diff --git a/src/Courier.Tests/Models/Automations/AutomationTemplateTest.cs b/src/Courier.Tests/Models/Automations/AutomationTemplateTest.cs index d5c803ec..4b1793f0 100644 --- a/src/Courier.Tests/Models/Automations/AutomationTemplateTest.cs +++ b/src/Courier.Tests/Models/Automations/AutomationTemplateTest.cs @@ -46,8 +46,11 @@ public void SerializationRoundtrip_Works() UpdatedAt = DateTimeOffset.Parse("2019-12-27T18:11:19.117Z"), }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -64,8 +67,11 @@ public void FieldRoundtripThroughSerialization_Works() UpdatedAt = DateTimeOffset.Parse("2019-12-27T18:11:19.117Z"), }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedID = "id"; @@ -180,7 +186,7 @@ public void Validation_Works(AutomationTemplateVersion rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -209,7 +215,7 @@ public void SerializationRoundtrip_Works(AutomationTemplateVersion rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Automations/Invoke/InvokeInvokeAdHocParamsTest.cs b/src/Courier.Tests/Models/Automations/Invoke/InvokeInvokeAdHocParamsTest.cs index 5b33b295..385a8e8a 100644 --- a/src/Courier.Tests/Models/Automations/Invoke/InvokeInvokeAdHocParamsTest.cs +++ b/src/Courier.Tests/Models/Automations/Invoke/InvokeInvokeAdHocParamsTest.cs @@ -313,8 +313,11 @@ public void SerializationRoundtrip_Works() CancelationToken = "cancelation_token", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -336,8 +339,11 @@ public void FieldRoundtripThroughSerialization_Works() CancelationToken = "cancelation_token", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedSteps = @@ -467,135 +473,122 @@ public class StepTest : TestBase [Fact] public void AutomationDelayValidationWorks() { - Invoke::Step value = new( - new Invoke::AutomationDelayStep() - { - Action = Invoke::Action.Delay, - Duration = "duration", - Until = "until", - } - ); + Invoke::Step value = new Invoke::AutomationDelayStep() + { + Action = Invoke::Action.Delay, + Duration = "duration", + Until = "until", + }; value.Validate(); } [Fact] public void AutomationSendValidationWorks() { - Invoke::Step value = new( - new Invoke::AutomationSendStep() + Invoke::Step value = new Invoke::AutomationSendStep() + { + Action = Invoke::AutomationSendStepAction.Send, + Brand = "brand", + Data = new Dictionary() { - Action = Invoke::AutomationSendStepAction.Send, - Brand = "brand", - Data = new Dictionary() - { - { "foo", JsonSerializer.SerializeToElement("bar") }, - }, - Profile = new Dictionary() - { - { "foo", JsonSerializer.SerializeToElement("bar") }, - }, - Recipient = "recipient", - Template = "template", - } - ); + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + Profile = new Dictionary() + { + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + Recipient = "recipient", + Template = "template", + }; value.Validate(); } [Fact] public void AutomationSendListValidationWorks() { - Invoke::Step value = new( - new Invoke::AutomationSendListStep() + Invoke::Step value = new Invoke::AutomationSendListStep() + { + Action = Invoke::AutomationSendListStepAction.SendList, + List = "list", + Brand = "brand", + Data = new Dictionary() { - Action = Invoke::AutomationSendListStepAction.SendList, - List = "list", - Brand = "brand", - Data = new Dictionary() - { - { "foo", JsonSerializer.SerializeToElement("bar") }, - }, - } - ); + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + }; value.Validate(); } [Fact] public void AutomationUpdateProfileValidationWorks() { - Invoke::Step value = new( - new Invoke::AutomationUpdateProfileStep() + Invoke::Step value = new Invoke::AutomationUpdateProfileStep() + { + Action = Invoke::AutomationUpdateProfileStepAction.UpdateProfile, + Profile = new Dictionary() { - Action = Invoke::AutomationUpdateProfileStepAction.UpdateProfile, - Profile = new Dictionary() - { - { "foo", JsonSerializer.SerializeToElement("bar") }, - }, - Merge = Invoke::Merge.None, - RecipientID = "recipient_id", - } - ); + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + Merge = Invoke::Merge.None, + RecipientID = "recipient_id", + }; value.Validate(); } [Fact] public void AutomationCancelValidationWorks() { - Invoke::Step value = new( - new Invoke::AutomationCancelStep() - { - Action = Invoke::AutomationCancelStepAction.Cancel, - CancelationToken = "cancelation_token", - } - ); + Invoke::Step value = new Invoke::AutomationCancelStep() + { + Action = Invoke::AutomationCancelStepAction.Cancel, + CancelationToken = "cancelation_token", + }; value.Validate(); } [Fact] public void AutomationFetchDataValidationWorks() { - Invoke::Step value = new( - new Invoke::AutomationFetchDataStep() + Invoke::Step value = new Invoke::AutomationFetchDataStep() + { + Action = Invoke::AutomationFetchDataStepAction.FetchData, + Webhook = new() { - Action = Invoke::AutomationFetchDataStepAction.FetchData, - Webhook = new() - { - Method = Invoke::Method.Get, - Url = "url", - Body = "body", - Headers = new Dictionary() { { "foo", "string" } }, - }, - MergeStrategy = Invoke::MergeStrategy.Replace, - } - ); + Method = Invoke::Method.Get, + Url = "url", + Body = "body", + Headers = new Dictionary() { { "foo", "string" } }, + }, + MergeStrategy = Invoke::MergeStrategy.Replace, + }; value.Validate(); } [Fact] public void AutomationInvokeValidationWorks() { - Invoke::Step value = new( - new Invoke::AutomationInvokeStep() - { - Action = Invoke::AutomationInvokeStepAction.Invoke, - Template = "template", - } - ); + Invoke::Step value = new Invoke::AutomationInvokeStep() + { + Action = Invoke::AutomationInvokeStepAction.Invoke, + Template = "template", + }; value.Validate(); } [Fact] public void AutomationDelaySerializationRoundtripWorks() { - Invoke::Step value = new( - new Invoke::AutomationDelayStep() - { - Action = Invoke::Action.Delay, - Duration = "duration", - Until = "until", - } + Invoke::Step value = new Invoke::AutomationDelayStep() + { + Action = Invoke::Action.Delay, + Duration = "duration", + Until = "until", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -603,25 +596,26 @@ public void AutomationDelaySerializationRoundtripWorks() [Fact] public void AutomationSendSerializationRoundtripWorks() { - Invoke::Step value = new( - new Invoke::AutomationSendStep() + Invoke::Step value = new Invoke::AutomationSendStep() + { + Action = Invoke::AutomationSendStepAction.Send, + Brand = "brand", + Data = new Dictionary() { - Action = Invoke::AutomationSendStepAction.Send, - Brand = "brand", - Data = new Dictionary() - { - { "foo", JsonSerializer.SerializeToElement("bar") }, - }, - Profile = new Dictionary() - { - { "foo", JsonSerializer.SerializeToElement("bar") }, - }, - Recipient = "recipient", - Template = "template", - } + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + Profile = new Dictionary() + { + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + Recipient = "recipient", + Template = "template", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -629,20 +623,21 @@ public void AutomationSendSerializationRoundtripWorks() [Fact] public void AutomationSendListSerializationRoundtripWorks() { - Invoke::Step value = new( - new Invoke::AutomationSendListStep() + Invoke::Step value = new Invoke::AutomationSendListStep() + { + Action = Invoke::AutomationSendListStepAction.SendList, + List = "list", + Brand = "brand", + Data = new Dictionary() { - Action = Invoke::AutomationSendListStepAction.SendList, - List = "list", - Brand = "brand", - Data = new Dictionary() - { - { "foo", JsonSerializer.SerializeToElement("bar") }, - }, - } + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -650,20 +645,21 @@ public void AutomationSendListSerializationRoundtripWorks() [Fact] public void AutomationUpdateProfileSerializationRoundtripWorks() { - Invoke::Step value = new( - new Invoke::AutomationUpdateProfileStep() + Invoke::Step value = new Invoke::AutomationUpdateProfileStep() + { + Action = Invoke::AutomationUpdateProfileStepAction.UpdateProfile, + Profile = new Dictionary() { - Action = Invoke::AutomationUpdateProfileStepAction.UpdateProfile, - Profile = new Dictionary() - { - { "foo", JsonSerializer.SerializeToElement("bar") }, - }, - Merge = Invoke::Merge.None, - RecipientID = "recipient_id", - } + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + Merge = Invoke::Merge.None, + RecipientID = "recipient_id", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -671,15 +667,16 @@ public void AutomationUpdateProfileSerializationRoundtripWorks() [Fact] public void AutomationCancelSerializationRoundtripWorks() { - Invoke::Step value = new( - new Invoke::AutomationCancelStep() - { - Action = Invoke::AutomationCancelStepAction.Cancel, - CancelationToken = "cancelation_token", - } + Invoke::Step value = new Invoke::AutomationCancelStep() + { + Action = Invoke::AutomationCancelStepAction.Cancel, + CancelationToken = "cancelation_token", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -687,22 +684,23 @@ public void AutomationCancelSerializationRoundtripWorks() [Fact] public void AutomationFetchDataSerializationRoundtripWorks() { - Invoke::Step value = new( - new Invoke::AutomationFetchDataStep() + Invoke::Step value = new Invoke::AutomationFetchDataStep() + { + Action = Invoke::AutomationFetchDataStepAction.FetchData, + Webhook = new() { - Action = Invoke::AutomationFetchDataStepAction.FetchData, - Webhook = new() - { - Method = Invoke::Method.Get, - Url = "url", - Body = "body", - Headers = new Dictionary() { { "foo", "string" } }, - }, - MergeStrategy = Invoke::MergeStrategy.Replace, - } + Method = Invoke::Method.Get, + Url = "url", + Body = "body", + Headers = new Dictionary() { { "foo", "string" } }, + }, + MergeStrategy = Invoke::MergeStrategy.Replace, + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -710,15 +708,16 @@ public void AutomationFetchDataSerializationRoundtripWorks() [Fact] public void AutomationInvokeSerializationRoundtripWorks() { - Invoke::Step value = new( - new Invoke::AutomationInvokeStep() - { - Action = Invoke::AutomationInvokeStepAction.Invoke, - Template = "template", - } + Invoke::Step value = new Invoke::AutomationInvokeStep() + { + Action = Invoke::AutomationInvokeStepAction.Invoke, + Template = "template", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -755,8 +754,11 @@ public void SerializationRoundtrip_Works() Until = "until", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -771,8 +773,11 @@ public void FieldRoundtripThroughSerialization_Works() Until = "until", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedAction = Invoke::Action.Delay; @@ -863,7 +868,7 @@ public void Validation_Works(Invoke::Action rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -891,7 +896,7 @@ public void SerializationRoundtrip_Works(Invoke::Action rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -980,8 +985,11 @@ public void SerializationRoundtrip_Works() Template = "template", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -1005,8 +1013,11 @@ public void FieldRoundtripThroughSerialization_Works() Template = "template", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedAction = @@ -1157,7 +1168,7 @@ public void Validation_Works(Invoke::AutomationSendStepAction rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -1184,7 +1195,7 @@ public void SerializationRoundtrip_Works(Invoke::AutomationSendStepAction rawVal public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -1248,8 +1259,11 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -1268,8 +1282,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedAction = @@ -1388,10 +1405,7 @@ public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); Assert.NotNull(value); Assert.Throws(() => value.Validate()); @@ -1417,10 +1431,7 @@ public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); var deserialized = JsonSerializer.Deserialize< ApiEnum @@ -1481,8 +1492,11 @@ public void SerializationRoundtrip_Works() RecipientID = "recipient_id", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -1501,8 +1515,11 @@ public void FieldRoundtripThroughSerialization_Works() RecipientID = "recipient_id", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedAction = @@ -1632,10 +1649,7 @@ public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); Assert.NotNull(value); Assert.Throws(() => value.Validate()); @@ -1661,10 +1675,7 @@ public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); var deserialized = JsonSerializer.Deserialize< ApiEnum @@ -1692,7 +1703,7 @@ public void Validation_Works(Invoke::Merge rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -1723,7 +1734,7 @@ public void SerializationRoundtrip_Works(Invoke::Merge rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -1764,8 +1775,11 @@ public void SerializationRoundtrip_Works() CancelationToken = "cancelation_token", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -1779,8 +1793,11 @@ public void FieldRoundtripThroughSerialization_Works() CancelationToken = "cancelation_token", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedAction = @@ -1819,7 +1836,7 @@ public void Validation_Works(Invoke::AutomationCancelStepAction rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -1846,7 +1863,7 @@ public void SerializationRoundtrip_Works(Invoke::AutomationCancelStepAction rawV public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -1909,8 +1926,11 @@ public void SerializationRoundtrip_Works() MergeStrategy = Invoke::MergeStrategy.Replace, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -1931,8 +1951,11 @@ public void FieldRoundtripThroughSerialization_Works() MergeStrategy = Invoke::MergeStrategy.Replace, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedAction = @@ -2066,10 +2089,7 @@ public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); Assert.NotNull(value); Assert.Throws(() => value.Validate()); @@ -2095,10 +2115,7 @@ public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); var deserialized = JsonSerializer.Deserialize< ApiEnum @@ -2150,8 +2167,11 @@ public void SerializationRoundtrip_Works() Headers = new Dictionary() { { "foo", "string" } }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -2167,8 +2187,11 @@ public void FieldRoundtripThroughSerialization_Works() Headers = new Dictionary() { { "foo", "string" } }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedMethod = Invoke::Method.Get; @@ -2275,7 +2298,7 @@ public void Validation_Works(Invoke::Method rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -2307,7 +2330,7 @@ public void SerializationRoundtrip_Works(Invoke::Method rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -2337,7 +2360,7 @@ public void Validation_Works(Invoke::MergeStrategy rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -2367,7 +2390,7 @@ public void SerializationRoundtrip_Works(Invoke::MergeStrategy rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -2408,8 +2431,11 @@ public void SerializationRoundtrip_Works() Template = "template", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -2423,8 +2449,11 @@ public void FieldRoundtripThroughSerialization_Works() Template = "template", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedAction = @@ -2463,7 +2492,7 @@ public void Validation_Works(Invoke::AutomationInvokeStepAction rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -2490,7 +2519,7 @@ public void SerializationRoundtrip_Works(Invoke::AutomationInvokeStepAction rawV public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Brands/BrandColorsTest.cs b/src/Courier.Tests/Models/Brands/BrandColorsTest.cs index 61fd990f..1d7e350f 100644 --- a/src/Courier.Tests/Models/Brands/BrandColorsTest.cs +++ b/src/Courier.Tests/Models/Brands/BrandColorsTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Brands; namespace Courier.Tests.Models.Brands; @@ -22,8 +23,11 @@ public void SerializationRoundtrip_Works() { var model = new BrandColors { Primary = "primary", Secondary = "secondary" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -33,8 +37,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new BrandColors { Primary = "primary", Secondary = "secondary" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedPrimary = "primary"; diff --git a/src/Courier.Tests/Models/Brands/BrandListResponseTest.cs b/src/Courier.Tests/Models/Brands/BrandListResponseTest.cs index 1999448a..f2574e20 100644 --- a/src/Courier.Tests/Models/Brands/BrandListResponseTest.cs +++ b/src/Courier.Tests/Models/Brands/BrandListResponseTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.Brands; @@ -225,8 +226,11 @@ public void SerializationRoundtrip_Works() ], }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -303,8 +307,11 @@ public void FieldRoundtripThroughSerialization_Works() ], }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Paging expectedPaging = new() { More = true, Cursor = "cursor" }; diff --git a/src/Courier.Tests/Models/Brands/BrandSettingsEmailTest.cs b/src/Courier.Tests/Models/Brands/BrandSettingsEmailTest.cs index 121b1b65..fac7371d 100644 --- a/src/Courier.Tests/Models/Brands/BrandSettingsEmailTest.cs +++ b/src/Courier.Tests/Models/Brands/BrandSettingsEmailTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Brands; namespace Courier.Tests.Models.Brands; @@ -116,8 +117,11 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -159,8 +163,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); EmailFooter expectedFooter = new() { Content = "content", InheritDefault = true }; @@ -385,8 +392,11 @@ public void SerializationRoundtrip_Works() FooterFullWidth = true, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -417,8 +427,11 @@ public void FieldRoundtripThroughSerialization_Works() FooterFullWidth = true, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); bool expectedEnabled = true; @@ -673,8 +686,11 @@ public void SerializationRoundtrip_Works() FooterFullWidth = true, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -698,8 +714,11 @@ public void FieldRoundtripThroughSerialization_Works() FooterFullWidth = true, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); BrandTemplate expectedMjml = new() diff --git a/src/Courier.Tests/Models/Brands/BrandSettingsInAppTest.cs b/src/Courier.Tests/Models/Brands/BrandSettingsInAppTest.cs index 7dd33e65..68a0b1ba 100644 --- a/src/Courier.Tests/Models/Brands/BrandSettingsInAppTest.cs +++ b/src/Courier.Tests/Models/Brands/BrandSettingsInAppTest.cs @@ -56,8 +56,11 @@ public void SerializationRoundtrip_Works() Placement = Placement.Top, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -76,8 +79,11 @@ public void FieldRoundtripThroughSerialization_Works() Placement = Placement.Top, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); BrandColors expectedColors = new() { Primary = "primary", Secondary = "secondary" }; @@ -213,7 +219,7 @@ public void Validation_Works(Placement rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -244,7 +250,7 @@ public void SerializationRoundtrip_Works(Placement rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Brands/BrandSettingsTest.cs b/src/Courier.Tests/Models/Brands/BrandSettingsTest.cs index 541cd276..f8f686bf 100644 --- a/src/Courier.Tests/Models/Brands/BrandSettingsTest.cs +++ b/src/Courier.Tests/Models/Brands/BrandSettingsTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Brands; namespace Courier.Tests.Models.Brands; @@ -157,8 +158,11 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -214,8 +218,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); BrandColors expectedColors = new() { Primary = "primary", Secondary = "secondary" }; diff --git a/src/Courier.Tests/Models/Brands/BrandSnippetTest.cs b/src/Courier.Tests/Models/Brands/BrandSnippetTest.cs index efedc30c..6e9b718c 100644 --- a/src/Courier.Tests/Models/Brands/BrandSnippetTest.cs +++ b/src/Courier.Tests/Models/Brands/BrandSnippetTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Brands; namespace Courier.Tests.Models.Brands; @@ -22,8 +23,11 @@ public void SerializationRoundtrip_Works() { var model = new BrandSnippet { Name = "name", Value = "value" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -33,8 +37,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new BrandSnippet { Name = "name", Value = "value" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedName = "name"; diff --git a/src/Courier.Tests/Models/Brands/BrandSnippetsTest.cs b/src/Courier.Tests/Models/Brands/BrandSnippetsTest.cs index fa4f3ddb..10e0da97 100644 --- a/src/Courier.Tests/Models/Brands/BrandSnippetsTest.cs +++ b/src/Courier.Tests/Models/Brands/BrandSnippetsTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models.Brands; namespace Courier.Tests.Models.Brands; @@ -26,8 +27,11 @@ public void SerializationRoundtrip_Works() { var model = new BrandSnippets { Items = [new() { Name = "name", Value = "value" }] }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -37,8 +41,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new BrandSnippets { Items = [new() { Name = "name", Value = "value" }] }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedItems = [new() { Name = "name", Value = "value" }]; diff --git a/src/Courier.Tests/Models/Brands/BrandTemplateTest.cs b/src/Courier.Tests/Models/Brands/BrandTemplateTest.cs index b411d54e..2e240926 100644 --- a/src/Courier.Tests/Models/Brands/BrandTemplateTest.cs +++ b/src/Courier.Tests/Models/Brands/BrandTemplateTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Brands; namespace Courier.Tests.Models.Brands; @@ -50,8 +51,11 @@ public void SerializationRoundtrip_Works() Width = "width", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -70,8 +74,11 @@ public void FieldRoundtripThroughSerialization_Works() Width = "width", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); bool expectedEnabled = true; diff --git a/src/Courier.Tests/Models/Brands/BrandTest.cs b/src/Courier.Tests/Models/Brands/BrandTest.cs index cbba055a..7b35e8df 100644 --- a/src/Courier.Tests/Models/Brands/BrandTest.cs +++ b/src/Courier.Tests/Models/Brands/BrandTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Brands; namespace Courier.Tests.Models.Brands; @@ -195,8 +196,8 @@ public void SerializationRoundtrip_Works() Version = "version", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -262,8 +263,8 @@ public void FieldRoundtripThroughSerialization_Works() Version = "version", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedID = "id"; diff --git a/src/Courier.Tests/Models/Brands/EmailFooterTest.cs b/src/Courier.Tests/Models/Brands/EmailFooterTest.cs index 85d58180..f3b37c59 100644 --- a/src/Courier.Tests/Models/Brands/EmailFooterTest.cs +++ b/src/Courier.Tests/Models/Brands/EmailFooterTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Brands; namespace Courier.Tests.Models.Brands; @@ -22,8 +23,11 @@ public void SerializationRoundtrip_Works() { var model = new EmailFooter { Content = "content", InheritDefault = true }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -33,8 +37,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new EmailFooter { Content = "content", InheritDefault = true }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedContent = "content"; diff --git a/src/Courier.Tests/Models/Brands/EmailHeadTest.cs b/src/Courier.Tests/Models/Brands/EmailHeadTest.cs index d1973a60..e9808842 100644 --- a/src/Courier.Tests/Models/Brands/EmailHeadTest.cs +++ b/src/Courier.Tests/Models/Brands/EmailHeadTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Brands; namespace Courier.Tests.Models.Brands; @@ -22,8 +23,8 @@ public void SerializationRoundtrip_Works() { var model = new EmailHead { InheritDefault = true, Content = "content" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -33,8 +34,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new EmailHead { InheritDefault = true, Content = "content" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); bool expectedInheritDefault = true; diff --git a/src/Courier.Tests/Models/Brands/EmailHeaderTest.cs b/src/Courier.Tests/Models/Brands/EmailHeaderTest.cs index e34e7a76..6a811ad7 100644 --- a/src/Courier.Tests/Models/Brands/EmailHeaderTest.cs +++ b/src/Courier.Tests/Models/Brands/EmailHeaderTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Brands; namespace Courier.Tests.Models.Brands; @@ -34,8 +35,11 @@ public void SerializationRoundtrip_Works() InheritDefault = true, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -50,8 +54,11 @@ public void FieldRoundtripThroughSerialization_Works() InheritDefault = true, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Logo expectedLogo = new() { Href = "href", Image = "image" }; diff --git a/src/Courier.Tests/Models/Brands/IconsTest.cs b/src/Courier.Tests/Models/Brands/IconsTest.cs index 5f4e99e6..93393860 100644 --- a/src/Courier.Tests/Models/Brands/IconsTest.cs +++ b/src/Courier.Tests/Models/Brands/IconsTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Brands; namespace Courier.Tests.Models.Brands; @@ -22,8 +23,8 @@ public void SerializationRoundtrip_Works() { var model = new Icons { Bell = "bell", Message = "message" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -33,8 +34,8 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new Icons { Bell = "bell", Message = "message" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedBell = "bell"; diff --git a/src/Courier.Tests/Models/Brands/LogoTest.cs b/src/Courier.Tests/Models/Brands/LogoTest.cs index 54377d36..d0b2cec0 100644 --- a/src/Courier.Tests/Models/Brands/LogoTest.cs +++ b/src/Courier.Tests/Models/Brands/LogoTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Brands; namespace Courier.Tests.Models.Brands; @@ -22,8 +23,8 @@ public void SerializationRoundtrip_Works() { var model = new Logo { Href = "href", Image = "image" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -33,8 +34,8 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new Logo { Href = "href", Image = "image" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedHref = "href"; diff --git a/src/Courier.Tests/Models/Brands/WidgetBackgroundTest.cs b/src/Courier.Tests/Models/Brands/WidgetBackgroundTest.cs index 9d602c6b..8298bc5d 100644 --- a/src/Courier.Tests/Models/Brands/WidgetBackgroundTest.cs +++ b/src/Courier.Tests/Models/Brands/WidgetBackgroundTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Brands; namespace Courier.Tests.Models.Brands; @@ -22,8 +23,11 @@ public void SerializationRoundtrip_Works() { var model = new WidgetBackground { BottomColor = "bottomColor", TopColor = "topColor" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -33,8 +37,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new WidgetBackground { BottomColor = "bottomColor", TopColor = "topColor" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedBottomColor = "bottomColor"; diff --git a/src/Courier.Tests/Models/Bulk/BulkCreateJobParamsTest.cs b/src/Courier.Tests/Models/Bulk/BulkCreateJobParamsTest.cs index 777f49cc..818028a9 100644 --- a/src/Courier.Tests/Models/Bulk/BulkCreateJobParamsTest.cs +++ b/src/Courier.Tests/Models/Bulk/BulkCreateJobParamsTest.cs @@ -22,7 +22,7 @@ public void FieldRoundtrip_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -49,7 +49,7 @@ public void FieldRoundtrip_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -83,7 +83,7 @@ public void Url_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", diff --git a/src/Courier.Tests/Models/Bulk/BulkCreateJobResponseTest.cs b/src/Courier.Tests/Models/Bulk/BulkCreateJobResponseTest.cs index 8e00e58e..858f3756 100644 --- a/src/Courier.Tests/Models/Bulk/BulkCreateJobResponseTest.cs +++ b/src/Courier.Tests/Models/Bulk/BulkCreateJobResponseTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Bulk; namespace Courier.Tests.Models.Bulk; @@ -20,8 +21,11 @@ public void SerializationRoundtrip_Works() { var model = new BulkCreateJobResponse { JobID = "jobId" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -31,8 +35,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new BulkCreateJobResponse { JobID = "jobId" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedJobID = "jobId"; diff --git a/src/Courier.Tests/Models/Bulk/BulkListUsersResponseTest.cs b/src/Courier.Tests/Models/Bulk/BulkListUsersResponseTest.cs index 29c05c6c..b99b71d9 100644 --- a/src/Courier.Tests/Models/Bulk/BulkListUsersResponseTest.cs +++ b/src/Courier.Tests/Models/Bulk/BulkListUsersResponseTest.cs @@ -335,8 +335,11 @@ public void SerializationRoundtrip_Works() Paging = new() { More = true, Cursor = "cursor" }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -450,8 +453,11 @@ public void FieldRoundtripThroughSerialization_Works() Paging = new() { More = true, Cursor = "cursor" }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedItems = @@ -961,8 +967,8 @@ public void SerializationRoundtrip_Works() MessageID = "messageId", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -1060,8 +1066,8 @@ public void FieldRoundtripThroughSerialization_Works() MessageID = "messageId", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); JsonElement expectedData = JsonSerializer.Deserialize("{}"); @@ -1744,8 +1750,11 @@ public void SerializationRoundtrip_Works() { var model = new IntersectionMember1 { Status = Status.Pending, MessageID = "messageId" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -1755,8 +1764,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new IntersectionMember1 { Status = Status.Pending, MessageID = "messageId" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedStatus = Status.Pending; @@ -1836,7 +1848,7 @@ public void Validation_Works(Status rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -1866,7 +1878,7 @@ public void SerializationRoundtrip_Works(Status rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Bulk/BulkRetrieveJobResponseTest.cs b/src/Courier.Tests/Models/Bulk/BulkRetrieveJobResponseTest.cs index 63667924..caeeff14 100644 --- a/src/Courier.Tests/Models/Bulk/BulkRetrieveJobResponseTest.cs +++ b/src/Courier.Tests/Models/Bulk/BulkRetrieveJobResponseTest.cs @@ -25,7 +25,7 @@ public void FieldRoundtrip_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -59,7 +59,7 @@ public void FieldRoundtrip_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -100,7 +100,7 @@ public void SerializationRoundtrip_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -123,8 +123,11 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -145,7 +148,7 @@ public void FieldRoundtripThroughSerialization_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -168,8 +171,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Job expectedJob = new() @@ -183,7 +189,7 @@ public void FieldRoundtripThroughSerialization_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -224,7 +230,7 @@ public void Validation_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -267,7 +273,7 @@ public void FieldRoundtrip_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -298,7 +304,7 @@ public void FieldRoundtrip_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -340,7 +346,7 @@ public void SerializationRoundtrip_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -362,8 +368,8 @@ public void SerializationRoundtrip_Works() Status = JobStatus.Created, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -382,7 +388,7 @@ public void FieldRoundtripThroughSerialization_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -404,8 +410,8 @@ public void FieldRoundtripThroughSerialization_Works() Status = JobStatus.Created, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); InboundBulkMessage expectedDefinition = new() @@ -417,7 +423,7 @@ public void FieldRoundtripThroughSerialization_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -459,7 +465,7 @@ public void Validation_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -503,7 +509,7 @@ public void Validation_Works(JobStatus rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -534,7 +540,7 @@ public void SerializationRoundtrip_Works(JobStatus rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Bulk/InboundBulkMessageTest.cs b/src/Courier.Tests/Models/Bulk/InboundBulkMessageTest.cs index 13621d60..ae8c2619 100644 --- a/src/Courier.Tests/Models/Bulk/InboundBulkMessageTest.cs +++ b/src/Courier.Tests/Models/Bulk/InboundBulkMessageTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.Bulk; @@ -19,7 +20,7 @@ public void FieldRoundtrip_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -107,7 +108,7 @@ public void SerializationRoundtrip_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -124,8 +125,11 @@ public void SerializationRoundtrip_Works() Template = "template", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -142,7 +146,7 @@ public void FieldRoundtripThroughSerialization_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -159,8 +163,11 @@ public void FieldRoundtripThroughSerialization_Works() Template = "template", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedEvent = "event"; @@ -236,7 +243,7 @@ public void Validation_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", @@ -336,40 +343,41 @@ public class ContentTest : TestBase [Fact] public void ElementalContentSugarValidationWorks() { - Content value = new(new ElementalContentSugar() { Body = "body", Title = "title" }); + Content value = new ElementalContentSugar() { Body = "body", Title = "title" }; value.Validate(); } [Fact] public void ElementalValidationWorks() { - Content value = new( - new ElementalContent() - { - Elements = - [ - new ElementalTextNodeWithType() - { - Channels = ["string"], - If = "if", - Loop = "loop", - Ref = "ref", - Type = ElementalTextNodeWithTypeIntersectionMember1Type.Text, - }, - ], - Version = "version", - Brand = "brand", - } - ); + Content value = new ElementalContent() + { + Elements = + [ + new ElementalTextNodeWithType() + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Type = ElementalTextNodeWithTypeIntersectionMember1Type.Text, + }, + ], + Version = "version", + Brand = "brand", + }; value.Validate(); } [Fact] public void ElementalContentSugarSerializationRoundtripWorks() { - Content value = new(new ElementalContentSugar() { Body = "body", Title = "title" }); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + Content value = new ElementalContentSugar() { Body = "body", Title = "title" }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.Equal(value, deserialized); } @@ -377,26 +385,27 @@ public void ElementalContentSugarSerializationRoundtripWorks() [Fact] public void ElementalSerializationRoundtripWorks() { - Content value = new( - new ElementalContent() - { - Elements = - [ - new ElementalTextNodeWithType() - { - Channels = ["string"], - If = "if", - Loop = "loop", - Ref = "ref", - Type = ElementalTextNodeWithTypeIntersectionMember1Type.Text, - }, - ], - Version = "version", - Brand = "brand", - } + Content value = new ElementalContent() + { + Elements = + [ + new ElementalTextNodeWithType() + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Type = ElementalTextNodeWithTypeIntersectionMember1Type.Text, + }, + ], + Version = "version", + Brand = "brand", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } diff --git a/src/Courier.Tests/Models/Bulk/InboundBulkMessageUserTest.cs b/src/Courier.Tests/Models/Bulk/InboundBulkMessageUserTest.cs index 89e3b365..68c48f76 100644 --- a/src/Courier.Tests/Models/Bulk/InboundBulkMessageUserTest.cs +++ b/src/Courier.Tests/Models/Bulk/InboundBulkMessageUserTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.Bulk; @@ -271,8 +272,11 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -362,8 +366,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); JsonElement expectedData = JsonSerializer.Deserialize("{}"); diff --git a/src/Courier.Tests/Models/ChannelClassificationTest.cs b/src/Courier.Tests/Models/ChannelClassificationTest.cs index f255195f..e271ec1d 100644 --- a/src/Courier.Tests/Models/ChannelClassificationTest.cs +++ b/src/Courier.Tests/Models/ChannelClassificationTest.cs @@ -25,7 +25,7 @@ public void Validation_Works(ChannelClassification rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -58,7 +58,7 @@ public void SerializationRoundtrip_Works(ChannelClassification rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/ChannelPreferenceTest.cs b/src/Courier.Tests/Models/ChannelPreferenceTest.cs index 837e1790..58f19c1f 100644 --- a/src/Courier.Tests/Models/ChannelPreferenceTest.cs +++ b/src/Courier.Tests/Models/ChannelPreferenceTest.cs @@ -22,8 +22,11 @@ public void SerializationRoundtrip_Works() { var model = new ChannelPreference { Channel = ChannelClassification.DirectMessage }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -33,8 +36,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new ChannelPreference { Channel = ChannelClassification.DirectMessage }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedChannel = diff --git a/src/Courier.Tests/Models/DiscordTest.cs b/src/Courier.Tests/Models/DiscordTest.cs index 7505a51a..2dff26de 100644 --- a/src/Courier.Tests/Models/DiscordTest.cs +++ b/src/Courier.Tests/Models/DiscordTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -8,23 +9,26 @@ public class DiscordTest : TestBase [Fact] public void SendToChannelValidationWorks() { - Discord value = new(new SendToChannel("channel_id")); + Discord value = new SendToChannel("channel_id"); value.Validate(); } [Fact] public void SendDirectMessageValidationWorks() { - Discord value = new(new SendDirectMessage("user_id")); + Discord value = new SendDirectMessage("user_id"); value.Validate(); } [Fact] public void SendToChannelSerializationRoundtripWorks() { - Discord value = new(new SendToChannel("channel_id")); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + Discord value = new SendToChannel("channel_id"); + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.Equal(value, deserialized); } @@ -32,9 +36,12 @@ public void SendToChannelSerializationRoundtripWorks() [Fact] public void SendDirectMessageSerializationRoundtripWorks() { - Discord value = new(new SendDirectMessage("user_id")); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + Discord value = new SendDirectMessage("user_id"); + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.Equal(value, deserialized); } diff --git a/src/Courier.Tests/Models/ElementalActionNodeWithTypeTest.cs b/src/Courier.Tests/Models/ElementalActionNodeWithTypeTest.cs index 1bdb1174..b6fa66f8 100644 --- a/src/Courier.Tests/Models/ElementalActionNodeWithTypeTest.cs +++ b/src/Courier.Tests/Models/ElementalActionNodeWithTypeTest.cs @@ -50,8 +50,11 @@ public void SerializationRoundtrip_Works() Type = Type.Action, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -68,8 +71,11 @@ public void FieldRoundtripThroughSerialization_Works() Type = Type.Action, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedChannels = ["string"]; @@ -249,8 +255,11 @@ public void SerializationRoundtrip_Works() { var model = new IntersectionMember1 { Type = Type.Action }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -260,8 +269,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new IntersectionMember1 { Type = Type.Action }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedType = Type.Action; @@ -335,7 +347,7 @@ public void Validation_Works(Type rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -363,7 +375,7 @@ public void SerializationRoundtrip_Works(Type rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/ElementalBaseNodeTest.cs b/src/Courier.Tests/Models/ElementalBaseNodeTest.cs index f50c3176..ad73df42 100644 --- a/src/Courier.Tests/Models/ElementalBaseNodeTest.cs +++ b/src/Courier.Tests/Models/ElementalBaseNodeTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -44,8 +45,11 @@ public void SerializationRoundtrip_Works() Ref = "ref", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -61,8 +65,11 @@ public void FieldRoundtripThroughSerialization_Works() Ref = "ref", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedChannels = ["string"]; diff --git a/src/Courier.Tests/Models/ElementalChannelNodeTest.cs b/src/Courier.Tests/Models/ElementalChannelNodeTest.cs index 4d0a9d4f..f3f9c667 100644 --- a/src/Courier.Tests/Models/ElementalChannelNodeTest.cs +++ b/src/Courier.Tests/Models/ElementalChannelNodeTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -68,8 +69,11 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -90,8 +94,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedChannels = ["string"]; @@ -143,6 +150,86 @@ public void Validation_Works() model.Validate(); } + [Fact] + public void OptionalNonNullablePropertiesUnsetAreNotSet_Works() + { + var model = new ElementalChannelNode + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Raw = new Dictionary() + { + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + }; + + Assert.Null(model.Channel); + Assert.False(model.RawData.ContainsKey("channel")); + } + + [Fact] + public void OptionalNonNullablePropertiesUnsetValidation_Works() + { + var model = new ElementalChannelNode + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Raw = new Dictionary() + { + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + }; + + model.Validate(); + } + + [Fact] + public void OptionalNonNullablePropertiesSetToNullAreNotSet_Works() + { + var model = new ElementalChannelNode + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Raw = new Dictionary() + { + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + + // Null should be interpreted as omitted for these properties + Channel = null, + }; + + Assert.Null(model.Channel); + Assert.False(model.RawData.ContainsKey("channel")); + } + + [Fact] + public void OptionalNonNullablePropertiesSetToNullValidation_Works() + { + var model = new ElementalChannelNode + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Raw = new Dictionary() + { + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + + // Null should be interpreted as omitted for these properties + Channel = null, + }; + + model.Validate(); + } + [Fact] public void OptionalNullablePropertiesUnsetAreNotSet_Works() { @@ -255,9 +342,10 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); var deserialized = JsonSerializer.Deserialize( - json + json, + ModelBase.SerializerOptions ); Assert.Equal(model, deserialized); @@ -275,9 +363,10 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); var deserialized = JsonSerializer.Deserialize( - element + element, + ModelBase.SerializerOptions ); Assert.NotNull(deserialized); @@ -313,6 +402,70 @@ public void Validation_Works() model.Validate(); } + [Fact] + public void OptionalNonNullablePropertiesUnsetAreNotSet_Works() + { + var model = new ElementalChannelNodeIntersectionMember1 + { + Raw = new Dictionary() + { + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + }; + + Assert.Null(model.Channel); + Assert.False(model.RawData.ContainsKey("channel")); + } + + [Fact] + public void OptionalNonNullablePropertiesUnsetValidation_Works() + { + var model = new ElementalChannelNodeIntersectionMember1 + { + Raw = new Dictionary() + { + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + }; + + model.Validate(); + } + + [Fact] + public void OptionalNonNullablePropertiesSetToNullAreNotSet_Works() + { + var model = new ElementalChannelNodeIntersectionMember1 + { + Raw = new Dictionary() + { + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + + // Null should be interpreted as omitted for these properties + Channel = null, + }; + + Assert.Null(model.Channel); + Assert.False(model.RawData.ContainsKey("channel")); + } + + [Fact] + public void OptionalNonNullablePropertiesSetToNullValidation_Works() + { + var model = new ElementalChannelNodeIntersectionMember1 + { + Raw = new Dictionary() + { + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + + // Null should be interpreted as omitted for these properties + Channel = null, + }; + + model.Validate(); + } + [Fact] public void OptionalNullablePropertiesUnsetAreNotSet_Works() { diff --git a/src/Courier.Tests/Models/ElementalChannelNodeWithTypeTest.cs b/src/Courier.Tests/Models/ElementalChannelNodeWithTypeTest.cs index 9b39cd72..2a3f26dd 100644 --- a/src/Courier.Tests/Models/ElementalChannelNodeWithTypeTest.cs +++ b/src/Courier.Tests/Models/ElementalChannelNodeWithTypeTest.cs @@ -75,8 +75,11 @@ public void SerializationRoundtrip_Works() Type = ElementalChannelNodeWithTypeIntersectionMember1Type.Channel, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -98,8 +101,11 @@ public void FieldRoundtripThroughSerialization_Works() Type = ElementalChannelNodeWithTypeIntersectionMember1Type.Channel, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedChannels = ["string"]; @@ -164,13 +170,14 @@ public void OptionalNonNullablePropertiesUnsetAreNotSet_Works() If = "if", Loop = "loop", Ref = "ref", - Channel = "email", Raw = new Dictionary() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, }; + Assert.Null(model.Channel); + Assert.False(model.RawData.ContainsKey("channel")); Assert.Null(model.Type); Assert.False(model.RawData.ContainsKey("type")); } @@ -184,7 +191,6 @@ public void OptionalNonNullablePropertiesUnsetValidation_Works() If = "if", Loop = "loop", Ref = "ref", - Channel = "email", Raw = new Dictionary() { { "foo", JsonSerializer.SerializeToElement("bar") }, @@ -203,16 +209,18 @@ public void OptionalNonNullablePropertiesSetToNullAreNotSet_Works() If = "if", Loop = "loop", Ref = "ref", - Channel = "email", Raw = new Dictionary() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, // Null should be interpreted as omitted for these properties + Channel = null, Type = null, }; + Assert.Null(model.Channel); + Assert.False(model.RawData.ContainsKey("channel")); Assert.Null(model.Type); Assert.False(model.RawData.ContainsKey("type")); } @@ -226,13 +234,13 @@ public void OptionalNonNullablePropertiesSetToNullValidation_Works() If = "if", Loop = "loop", Ref = "ref", - Channel = "email", Raw = new Dictionary() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, // Null should be interpreted as omitted for these properties + Channel = null, Type = null, }; @@ -342,9 +350,12 @@ public void SerializationRoundtrip_Works() Type = ElementalChannelNodeWithTypeIntersectionMember1Type.Channel, }; - string json = JsonSerializer.Serialize(model); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); var deserialized = - JsonSerializer.Deserialize(json); + JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -357,9 +368,12 @@ public void FieldRoundtripThroughSerialization_Works() Type = ElementalChannelNodeWithTypeIntersectionMember1Type.Channel, }; - string element = JsonSerializer.Serialize(model); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); var deserialized = - JsonSerializer.Deserialize(element); + JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedType = @@ -438,10 +452,7 @@ public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); Assert.NotNull(value); Assert.Throws(() => value.Validate()); @@ -469,10 +480,7 @@ public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); var deserialized = JsonSerializer.Deserialize< ApiEnum diff --git a/src/Courier.Tests/Models/ElementalContentSugarTest.cs b/src/Courier.Tests/Models/ElementalContentSugarTest.cs index 64a9eda1..66f0b0bd 100644 --- a/src/Courier.Tests/Models/ElementalContentSugarTest.cs +++ b/src/Courier.Tests/Models/ElementalContentSugarTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -22,8 +23,11 @@ public void SerializationRoundtrip_Works() { var model = new ElementalContentSugar { Body = "body", Title = "title" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -33,8 +37,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new ElementalContentSugar { Body = "body", Title = "title" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedBody = "body"; diff --git a/src/Courier.Tests/Models/ElementalContentTest.cs b/src/Courier.Tests/Models/ElementalContentTest.cs index 35eb1ee2..8661a510 100644 --- a/src/Courier.Tests/Models/ElementalContentTest.cs +++ b/src/Courier.Tests/Models/ElementalContentTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -69,8 +70,11 @@ public void SerializationRoundtrip_Works() Brand = "brand", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -95,8 +99,11 @@ public void FieldRoundtripThroughSerialization_Works() Brand = "brand", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedElements = diff --git a/src/Courier.Tests/Models/ElementalDividerNodeWithTypeTest.cs b/src/Courier.Tests/Models/ElementalDividerNodeWithTypeTest.cs index 2a81d6ea..82327470 100644 --- a/src/Courier.Tests/Models/ElementalDividerNodeWithTypeTest.cs +++ b/src/Courier.Tests/Models/ElementalDividerNodeWithTypeTest.cs @@ -51,8 +51,11 @@ public void SerializationRoundtrip_Works() Type = ElementalDividerNodeWithTypeIntersectionMember1Type.Divider, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -69,8 +72,11 @@ public void FieldRoundtripThroughSerialization_Works() Type = ElementalDividerNodeWithTypeIntersectionMember1Type.Divider, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedChannels = ["string"]; @@ -264,9 +270,12 @@ public void SerializationRoundtrip_Works() Type = ElementalDividerNodeWithTypeIntersectionMember1Type.Divider, }; - string json = JsonSerializer.Serialize(model); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); var deserialized = - JsonSerializer.Deserialize(json); + JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -279,9 +288,12 @@ public void FieldRoundtripThroughSerialization_Works() Type = ElementalDividerNodeWithTypeIntersectionMember1Type.Divider, }; - string element = JsonSerializer.Serialize(model); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); var deserialized = - JsonSerializer.Deserialize(element); + JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedType = @@ -360,10 +372,7 @@ public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); Assert.NotNull(value); Assert.Throws(() => value.Validate()); @@ -391,10 +400,7 @@ public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); var deserialized = JsonSerializer.Deserialize< ApiEnum diff --git a/src/Courier.Tests/Models/ElementalImageNodeWithTypeTest.cs b/src/Courier.Tests/Models/ElementalImageNodeWithTypeTest.cs index b991e2ec..2d4aab82 100644 --- a/src/Courier.Tests/Models/ElementalImageNodeWithTypeTest.cs +++ b/src/Courier.Tests/Models/ElementalImageNodeWithTypeTest.cs @@ -51,8 +51,11 @@ public void SerializationRoundtrip_Works() Type = ElementalImageNodeWithTypeIntersectionMember1Type.Image, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -69,8 +72,11 @@ public void FieldRoundtripThroughSerialization_Works() Type = ElementalImageNodeWithTypeIntersectionMember1Type.Image, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedChannels = ["string"]; @@ -264,9 +270,12 @@ public void SerializationRoundtrip_Works() Type = ElementalImageNodeWithTypeIntersectionMember1Type.Image, }; - string json = JsonSerializer.Serialize(model); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); var deserialized = - JsonSerializer.Deserialize(json); + JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -279,9 +288,12 @@ public void FieldRoundtripThroughSerialization_Works() Type = ElementalImageNodeWithTypeIntersectionMember1Type.Image, }; - string element = JsonSerializer.Serialize(model); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); var deserialized = - JsonSerializer.Deserialize(element); + JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedType = @@ -360,10 +372,7 @@ public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); Assert.NotNull(value); Assert.Throws(() => value.Validate()); @@ -391,10 +400,7 @@ public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); var deserialized = JsonSerializer.Deserialize< ApiEnum diff --git a/src/Courier.Tests/Models/ElementalMetaNodeWithTypeTest.cs b/src/Courier.Tests/Models/ElementalMetaNodeWithTypeTest.cs index 1f42908e..d9a9c752 100644 --- a/src/Courier.Tests/Models/ElementalMetaNodeWithTypeTest.cs +++ b/src/Courier.Tests/Models/ElementalMetaNodeWithTypeTest.cs @@ -51,8 +51,11 @@ public void SerializationRoundtrip_Works() Type = ElementalMetaNodeWithTypeIntersectionMember1Type.Meta, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -69,8 +72,11 @@ public void FieldRoundtripThroughSerialization_Works() Type = ElementalMetaNodeWithTypeIntersectionMember1Type.Meta, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedChannels = ["string"]; @@ -264,9 +270,10 @@ public void SerializationRoundtrip_Works() Type = ElementalMetaNodeWithTypeIntersectionMember1Type.Meta, }; - string json = JsonSerializer.Serialize(model); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); var deserialized = JsonSerializer.Deserialize( - json + json, + ModelBase.SerializerOptions ); Assert.Equal(model, deserialized); @@ -280,9 +287,10 @@ public void FieldRoundtripThroughSerialization_Works() Type = ElementalMetaNodeWithTypeIntersectionMember1Type.Meta, }; - string element = JsonSerializer.Serialize(model); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); var deserialized = JsonSerializer.Deserialize( - element + element, + ModelBase.SerializerOptions ); Assert.NotNull(deserialized); @@ -362,10 +370,7 @@ public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); Assert.NotNull(value); Assert.Throws(() => value.Validate()); @@ -393,10 +398,7 @@ public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); var deserialized = JsonSerializer.Deserialize< ApiEnum diff --git a/src/Courier.Tests/Models/ElementalNodeTest.cs b/src/Courier.Tests/Models/ElementalNodeTest.cs index bf2ec75d..ce9e891f 100644 --- a/src/Courier.Tests/Models/ElementalNodeTest.cs +++ b/src/Courier.Tests/Models/ElementalNodeTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -8,126 +9,113 @@ public class ElementalNodeTest : TestBase [Fact] public void TextNodeWithTypeValidationWorks() { - ElementalNode value = new( - new ElementalTextNodeWithType() - { - Channels = ["string"], - If = "if", - Loop = "loop", - Ref = "ref", - Type = ElementalTextNodeWithTypeIntersectionMember1Type.Text, - } - ); + ElementalNode value = new ElementalTextNodeWithType() + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Type = ElementalTextNodeWithTypeIntersectionMember1Type.Text, + }; value.Validate(); } [Fact] public void MetaNodeWithTypeValidationWorks() { - ElementalNode value = new( - new ElementalMetaNodeWithType() - { - Channels = ["string"], - If = "if", - Loop = "loop", - Ref = "ref", - Type = ElementalMetaNodeWithTypeIntersectionMember1Type.Meta, - } - ); + ElementalNode value = new ElementalMetaNodeWithType() + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Type = ElementalMetaNodeWithTypeIntersectionMember1Type.Meta, + }; value.Validate(); } [Fact] public void ChannelNodeWithTypeValidationWorks() { - ElementalNode value = new( - new ElementalChannelNodeWithType() - { - Type = ElementalChannelNodeWithTypeIntersectionMember1Type.Channel, - } - ); + ElementalNode value = new ElementalChannelNodeWithType() + { + Type = ElementalChannelNodeWithTypeIntersectionMember1Type.Channel, + }; value.Validate(); } [Fact] public void ImageNodeWithTypeValidationWorks() { - ElementalNode value = new( - new ElementalImageNodeWithType() - { - Channels = ["string"], - If = "if", - Loop = "loop", - Ref = "ref", - Type = ElementalImageNodeWithTypeIntersectionMember1Type.Image, - } - ); + ElementalNode value = new ElementalImageNodeWithType() + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Type = ElementalImageNodeWithTypeIntersectionMember1Type.Image, + }; value.Validate(); } [Fact] public void ActionNodeWithTypeValidationWorks() { - ElementalNode value = new( - new ElementalActionNodeWithType() - { - Channels = ["string"], - If = "if", - Loop = "loop", - Ref = "ref", - Type = Type.Action, - } - ); + ElementalNode value = new ElementalActionNodeWithType() + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Type = Type.Action, + }; value.Validate(); } [Fact] public void DividerNodeWithTypeValidationWorks() { - ElementalNode value = new( - new ElementalDividerNodeWithType() - { - Channels = ["string"], - If = "if", - Loop = "loop", - Ref = "ref", - Type = ElementalDividerNodeWithTypeIntersectionMember1Type.Divider, - } - ); + ElementalNode value = new ElementalDividerNodeWithType() + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Type = ElementalDividerNodeWithTypeIntersectionMember1Type.Divider, + }; value.Validate(); } [Fact] public void QuoteNodeWithTypeValidationWorks() { - ElementalNode value = new( - new ElementalQuoteNodeWithType() - { - Channels = ["string"], - If = "if", - Loop = "loop", - Ref = "ref", - Type = ElementalQuoteNodeWithTypeIntersectionMember1Type.Quote, - } - ); + ElementalNode value = new ElementalQuoteNodeWithType() + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Type = ElementalQuoteNodeWithTypeIntersectionMember1Type.Quote, + }; value.Validate(); } [Fact] public void TextNodeWithTypeSerializationRoundtripWorks() { - ElementalNode value = new( - new ElementalTextNodeWithType() - { - Channels = ["string"], - If = "if", - Loop = "loop", - Ref = "ref", - Type = ElementalTextNodeWithTypeIntersectionMember1Type.Text, - } + ElementalNode value = new ElementalTextNodeWithType() + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Type = ElementalTextNodeWithTypeIntersectionMember1Type.Text, + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -135,18 +123,19 @@ public void TextNodeWithTypeSerializationRoundtripWorks() [Fact] public void MetaNodeWithTypeSerializationRoundtripWorks() { - ElementalNode value = new( - new ElementalMetaNodeWithType() - { - Channels = ["string"], - If = "if", - Loop = "loop", - Ref = "ref", - Type = ElementalMetaNodeWithTypeIntersectionMember1Type.Meta, - } + ElementalNode value = new ElementalMetaNodeWithType() + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Type = ElementalMetaNodeWithTypeIntersectionMember1Type.Meta, + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -154,14 +143,15 @@ public void MetaNodeWithTypeSerializationRoundtripWorks() [Fact] public void ChannelNodeWithTypeSerializationRoundtripWorks() { - ElementalNode value = new( - new ElementalChannelNodeWithType() - { - Type = ElementalChannelNodeWithTypeIntersectionMember1Type.Channel, - } + ElementalNode value = new ElementalChannelNodeWithType() + { + Type = ElementalChannelNodeWithTypeIntersectionMember1Type.Channel, + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -169,18 +159,19 @@ public void ChannelNodeWithTypeSerializationRoundtripWorks() [Fact] public void ImageNodeWithTypeSerializationRoundtripWorks() { - ElementalNode value = new( - new ElementalImageNodeWithType() - { - Channels = ["string"], - If = "if", - Loop = "loop", - Ref = "ref", - Type = ElementalImageNodeWithTypeIntersectionMember1Type.Image, - } + ElementalNode value = new ElementalImageNodeWithType() + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Type = ElementalImageNodeWithTypeIntersectionMember1Type.Image, + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -188,18 +179,19 @@ public void ImageNodeWithTypeSerializationRoundtripWorks() [Fact] public void ActionNodeWithTypeSerializationRoundtripWorks() { - ElementalNode value = new( - new ElementalActionNodeWithType() - { - Channels = ["string"], - If = "if", - Loop = "loop", - Ref = "ref", - Type = Type.Action, - } + ElementalNode value = new ElementalActionNodeWithType() + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Type = Type.Action, + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -207,18 +199,19 @@ public void ActionNodeWithTypeSerializationRoundtripWorks() [Fact] public void DividerNodeWithTypeSerializationRoundtripWorks() { - ElementalNode value = new( - new ElementalDividerNodeWithType() - { - Channels = ["string"], - If = "if", - Loop = "loop", - Ref = "ref", - Type = ElementalDividerNodeWithTypeIntersectionMember1Type.Divider, - } + ElementalNode value = new ElementalDividerNodeWithType() + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Type = ElementalDividerNodeWithTypeIntersectionMember1Type.Divider, + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -226,18 +219,19 @@ public void DividerNodeWithTypeSerializationRoundtripWorks() [Fact] public void QuoteNodeWithTypeSerializationRoundtripWorks() { - ElementalNode value = new( - new ElementalQuoteNodeWithType() - { - Channels = ["string"], - If = "if", - Loop = "loop", - Ref = "ref", - Type = ElementalQuoteNodeWithTypeIntersectionMember1Type.Quote, - } + ElementalNode value = new ElementalQuoteNodeWithType() + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Type = ElementalQuoteNodeWithTypeIntersectionMember1Type.Quote, + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } diff --git a/src/Courier.Tests/Models/ElementalQuoteNodeWithTypeTest.cs b/src/Courier.Tests/Models/ElementalQuoteNodeWithTypeTest.cs index 26adc17f..9c95e56e 100644 --- a/src/Courier.Tests/Models/ElementalQuoteNodeWithTypeTest.cs +++ b/src/Courier.Tests/Models/ElementalQuoteNodeWithTypeTest.cs @@ -51,8 +51,11 @@ public void SerializationRoundtrip_Works() Type = ElementalQuoteNodeWithTypeIntersectionMember1Type.Quote, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -69,8 +72,11 @@ public void FieldRoundtripThroughSerialization_Works() Type = ElementalQuoteNodeWithTypeIntersectionMember1Type.Quote, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedChannels = ["string"]; @@ -264,9 +270,12 @@ public void SerializationRoundtrip_Works() Type = ElementalQuoteNodeWithTypeIntersectionMember1Type.Quote, }; - string json = JsonSerializer.Serialize(model); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); var deserialized = - JsonSerializer.Deserialize(json); + JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -279,9 +288,12 @@ public void FieldRoundtripThroughSerialization_Works() Type = ElementalQuoteNodeWithTypeIntersectionMember1Type.Quote, }; - string element = JsonSerializer.Serialize(model); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); var deserialized = - JsonSerializer.Deserialize(element); + JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedType = @@ -360,10 +372,7 @@ public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); Assert.NotNull(value); Assert.Throws(() => value.Validate()); @@ -391,10 +400,7 @@ public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); var deserialized = JsonSerializer.Deserialize< ApiEnum diff --git a/src/Courier.Tests/Models/ElementalTextNodeWithTypeTest.cs b/src/Courier.Tests/Models/ElementalTextNodeWithTypeTest.cs index 650002a2..d7a6e703 100644 --- a/src/Courier.Tests/Models/ElementalTextNodeWithTypeTest.cs +++ b/src/Courier.Tests/Models/ElementalTextNodeWithTypeTest.cs @@ -51,8 +51,11 @@ public void SerializationRoundtrip_Works() Type = ElementalTextNodeWithTypeIntersectionMember1Type.Text, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -69,8 +72,11 @@ public void FieldRoundtripThroughSerialization_Works() Type = ElementalTextNodeWithTypeIntersectionMember1Type.Text, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedChannels = ["string"]; @@ -264,9 +270,10 @@ public void SerializationRoundtrip_Works() Type = ElementalTextNodeWithTypeIntersectionMember1Type.Text, }; - string json = JsonSerializer.Serialize(model); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); var deserialized = JsonSerializer.Deserialize( - json + json, + ModelBase.SerializerOptions ); Assert.Equal(model, deserialized); @@ -280,9 +287,10 @@ public void FieldRoundtripThroughSerialization_Works() Type = ElementalTextNodeWithTypeIntersectionMember1Type.Text, }; - string element = JsonSerializer.Serialize(model); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); var deserialized = JsonSerializer.Deserialize( - element + element, + ModelBase.SerializerOptions ); Assert.NotNull(deserialized); @@ -362,10 +370,7 @@ public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); Assert.NotNull(value); Assert.Throws(() => value.Validate()); @@ -393,10 +398,7 @@ public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize< ApiEnum - >( - JsonSerializer.Deserialize("\"invalid value\""), - ModelBase.SerializerOptions - ); + >(JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); var deserialized = JsonSerializer.Deserialize< ApiEnum diff --git a/src/Courier.Tests/Models/ExpoTest.cs b/src/Courier.Tests/Models/ExpoTest.cs index a8e18d9f..68d09180 100644 --- a/src/Courier.Tests/Models/ExpoTest.cs +++ b/src/Courier.Tests/Models/ExpoTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -8,23 +9,23 @@ public class ExpoTest : TestBase [Fact] public void TokenValidationWorks() { - Expo value = new(new Token("token")); + Expo value = new Token("token"); value.Validate(); } [Fact] public void MultipleTokensValidationWorks() { - Expo value = new(new MultipleTokens([new("token")])); + Expo value = new MultipleTokens([new("token")]); value.Validate(); } [Fact] public void TokenSerializationRoundtripWorks() { - Expo value = new(new Token("token")); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + Expo value = new Token("token"); + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.Equal(value, deserialized); } @@ -32,9 +33,9 @@ public void TokenSerializationRoundtripWorks() [Fact] public void MultipleTokensSerializationRoundtripWorks() { - Expo value = new(new MultipleTokens([new("token")])); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + Expo value = new MultipleTokens([new("token")]); + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.Equal(value, deserialized); } diff --git a/src/Courier.Tests/Models/FilterConfigTest.cs b/src/Courier.Tests/Models/FilterConfigTest.cs new file mode 100644 index 00000000..3154aa26 --- /dev/null +++ b/src/Courier.Tests/Models/FilterConfigTest.cs @@ -0,0 +1,216 @@ +using System.Collections.Generic; +using System.Text.Json; +using Courier.Core; +using Courier.Models; + +namespace Courier.Tests.Models; + +public class FilterConfigTest : TestBase +{ + [Fact] + public void FieldRoundtrip_Works() + { + var model = new FilterConfig + { + Operator = "operator", + Filters = + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ], + Path = "path", + Value = "value", + }; + + string expectedOperator = "operator"; + List expectedFilters = + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ]; + string expectedPath = "path"; + string expectedValue = "value"; + + Assert.Equal(expectedOperator, model.Operator); + Assert.NotNull(model.Filters); + Assert.Equal(expectedFilters.Count, model.Filters.Count); + for (int i = 0; i < expectedFilters.Count; i++) + { + Assert.Equal(expectedFilters[i], model.Filters[i]); + } + Assert.Equal(expectedPath, model.Path); + Assert.Equal(expectedValue, model.Value); + } + + [Fact] + public void SerializationRoundtrip_Works() + { + var model = new FilterConfig + { + Operator = "operator", + Filters = + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ], + Path = "path", + Value = "value", + }; + + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); + + Assert.Equal(model, deserialized); + } + + [Fact] + public void FieldRoundtripThroughSerialization_Works() + { + var model = new FilterConfig + { + Operator = "operator", + Filters = + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ], + Path = "path", + Value = "value", + }; + + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); + Assert.NotNull(deserialized); + + string expectedOperator = "operator"; + List expectedFilters = + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ]; + string expectedPath = "path"; + string expectedValue = "value"; + + Assert.Equal(expectedOperator, deserialized.Operator); + Assert.NotNull(deserialized.Filters); + Assert.Equal(expectedFilters.Count, deserialized.Filters.Count); + for (int i = 0; i < expectedFilters.Count; i++) + { + Assert.Equal(expectedFilters[i], deserialized.Filters[i]); + } + Assert.Equal(expectedPath, deserialized.Path); + Assert.Equal(expectedValue, deserialized.Value); + } + + [Fact] + public void Validation_Works() + { + var model = new FilterConfig + { + Operator = "operator", + Filters = + [ + new() + { + Operator = "operator", + Filters = [], + Path = "path", + Value = "value", + }, + ], + Path = "path", + Value = "value", + }; + + model.Validate(); + } + + [Fact] + public void OptionalNonNullablePropertiesUnsetAreNotSet_Works() + { + var model = new FilterConfig { Operator = "operator" }; + + Assert.Null(model.Filters); + Assert.False(model.RawData.ContainsKey("filters")); + Assert.Null(model.Path); + Assert.False(model.RawData.ContainsKey("path")); + Assert.Null(model.Value); + Assert.False(model.RawData.ContainsKey("value")); + } + + [Fact] + public void OptionalNonNullablePropertiesUnsetValidation_Works() + { + var model = new FilterConfig { Operator = "operator" }; + + model.Validate(); + } + + [Fact] + public void OptionalNonNullablePropertiesSetToNullAreNotSet_Works() + { + var model = new FilterConfig + { + Operator = "operator", + + // Null should be interpreted as omitted for these properties + Filters = null, + Path = null, + Value = null, + }; + + Assert.Null(model.Filters); + Assert.False(model.RawData.ContainsKey("filters")); + Assert.Null(model.Path); + Assert.False(model.RawData.ContainsKey("path")); + Assert.Null(model.Value); + Assert.False(model.RawData.ContainsKey("value")); + } + + [Fact] + public void OptionalNonNullablePropertiesSetToNullValidation_Works() + { + var model = new FilterConfig + { + Operator = "operator", + + // Null should be interpreted as omitted for these properties + Filters = null, + Path = null, + Value = null, + }; + + model.Validate(); + } +} diff --git a/src/Courier.Tests/Models/Inbound/InboundTrackEventParamsTest.cs b/src/Courier.Tests/Models/Inbound/InboundTrackEventParamsTest.cs index 5941a3f0..ffe5b962 100644 --- a/src/Courier.Tests/Models/Inbound/InboundTrackEventParamsTest.cs +++ b/src/Courier.Tests/Models/Inbound/InboundTrackEventParamsTest.cs @@ -129,7 +129,7 @@ public void Validation_Works(Inbound::Type rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -157,7 +157,7 @@ public void SerializationRoundtrip_Works(Inbound::Type rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Inbound/InboundTrackEventResponseTest.cs b/src/Courier.Tests/Models/Inbound/InboundTrackEventResponseTest.cs index 70a08db2..0ba6505d 100644 --- a/src/Courier.Tests/Models/Inbound/InboundTrackEventResponseTest.cs +++ b/src/Courier.Tests/Models/Inbound/InboundTrackEventResponseTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Inbound; namespace Courier.Tests.Models.Inbound; @@ -26,8 +27,11 @@ public void SerializationRoundtrip_Works() MessageID = "1-65f240a0-47a6a120c8374de9bcf9f22c", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -40,8 +44,11 @@ public void FieldRoundtripThroughSerialization_Works() MessageID = "1-65f240a0-47a6a120c8374de9bcf9f22c", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedMessageID = "1-65f240a0-47a6a120c8374de9bcf9f22c"; diff --git a/src/Courier.Tests/Models/IntercomRecipientTest.cs b/src/Courier.Tests/Models/IntercomRecipientTest.cs index 2afdfb26..30a20749 100644 --- a/src/Courier.Tests/Models/IntercomRecipientTest.cs +++ b/src/Courier.Tests/Models/IntercomRecipientTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -20,8 +21,11 @@ public void SerializationRoundtrip_Works() { var model = new IntercomRecipient { ID = "id" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -31,8 +35,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new IntercomRecipient { ID = "id" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedID = "id"; diff --git a/src/Courier.Tests/Models/IntercomTest.cs b/src/Courier.Tests/Models/IntercomTest.cs index 6c973a53..4ef1018d 100644 --- a/src/Courier.Tests/Models/IntercomTest.cs +++ b/src/Courier.Tests/Models/IntercomTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -22,8 +23,8 @@ public void SerializationRoundtrip_Works() { var model = new Intercom { From = "from", To = new("id") }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -33,8 +34,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new Intercom { From = "from", To = new("id") }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedFrom = "from"; diff --git a/src/Courier.Tests/Models/ListFilterTest.cs b/src/Courier.Tests/Models/ListFilterTest.cs index b1b4ac08..bf527ef5 100644 --- a/src/Courier.Tests/Models/ListFilterTest.cs +++ b/src/Courier.Tests/Models/ListFilterTest.cs @@ -36,8 +36,11 @@ public void SerializationRoundtrip_Works() Value = "value", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -52,8 +55,11 @@ public void FieldRoundtripThroughSerialization_Works() Value = "value", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedOperator = ListFilterOperator.MemberOf; @@ -94,7 +100,7 @@ public void Validation_Works(ListFilterOperator rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -122,7 +128,7 @@ public void SerializationRoundtrip_Works(ListFilterOperator rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -150,7 +156,7 @@ public void Validation_Works(ListFilterPath rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -178,7 +184,7 @@ public void SerializationRoundtrip_Works(ListFilterPath rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/ListPatternRecipientTest.cs b/src/Courier.Tests/Models/ListPatternRecipientTest.cs index 18c02167..7337cfdd 100644 --- a/src/Courier.Tests/Models/ListPatternRecipientTest.cs +++ b/src/Courier.Tests/Models/ListPatternRecipientTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -47,8 +48,11 @@ public void SerializationRoundtrip_Works() ListPattern = "list_pattern", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -65,8 +69,11 @@ public void FieldRoundtripThroughSerialization_Works() ListPattern = "list_pattern", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Dictionary expectedData = new() diff --git a/src/Courier.Tests/Models/ListRecipientTest.cs b/src/Courier.Tests/Models/ListRecipientTest.cs index 6a7867e1..c8a73bdd 100644 --- a/src/Courier.Tests/Models/ListRecipientTest.cs +++ b/src/Courier.Tests/Models/ListRecipientTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -80,8 +81,11 @@ public void SerializationRoundtrip_Works() ListID = "list_id", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -107,8 +111,11 @@ public void FieldRoundtripThroughSerialization_Works() ListID = "list_id", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Dictionary expectedData = new() diff --git a/src/Courier.Tests/Models/Lists/ListListResponseTest.cs b/src/Courier.Tests/Models/Lists/ListListResponseTest.cs index 6f6aeddd..d4e839b4 100644 --- a/src/Courier.Tests/Models/Lists/ListListResponseTest.cs +++ b/src/Courier.Tests/Models/Lists/ListListResponseTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.Lists; @@ -63,8 +64,11 @@ public void SerializationRoundtrip_Works() Paging = new() { More = true, Cursor = "cursor" }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -87,8 +91,11 @@ public void FieldRoundtripThroughSerialization_Works() Paging = new() { More = true, Cursor = "cursor" }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedItems = diff --git a/src/Courier.Tests/Models/Lists/PutSubscriptionsRecipientTest.cs b/src/Courier.Tests/Models/Lists/PutSubscriptionsRecipientTest.cs index 27d6bbf5..86d7670c 100644 --- a/src/Courier.Tests/Models/Lists/PutSubscriptionsRecipientTest.cs +++ b/src/Courier.Tests/Models/Lists/PutSubscriptionsRecipientTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.Lists; @@ -110,8 +111,11 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -151,8 +155,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedRecipientID = "recipientId"; diff --git a/src/Courier.Tests/Models/Lists/SubscriptionListTest.cs b/src/Courier.Tests/Models/Lists/SubscriptionListTest.cs index ccbc89aa..c9c5beff 100644 --- a/src/Courier.Tests/Models/Lists/SubscriptionListTest.cs +++ b/src/Courier.Tests/Models/Lists/SubscriptionListTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Lists; namespace Courier.Tests.Models.Lists; @@ -38,8 +39,11 @@ public void SerializationRoundtrip_Works() Updated = "updated", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -55,8 +59,11 @@ public void FieldRoundtripThroughSerialization_Works() Updated = "updated", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedID = "id"; diff --git a/src/Courier.Tests/Models/Lists/Subscriptions/SubscriptionListResponseTest.cs b/src/Courier.Tests/Models/Lists/Subscriptions/SubscriptionListResponseTest.cs index 11e846c0..f05def60 100644 --- a/src/Courier.Tests/Models/Lists/Subscriptions/SubscriptionListResponseTest.cs +++ b/src/Courier.Tests/Models/Lists/Subscriptions/SubscriptionListResponseTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.Lists.Subscriptions; @@ -138,8 +139,11 @@ public void SerializationRoundtrip_Works() Paging = new() { More = true, Cursor = "cursor" }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -187,8 +191,11 @@ public void FieldRoundtripThroughSerialization_Works() Paging = new() { More = true, Cursor = "cursor" }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedItems = @@ -392,8 +399,8 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -434,8 +441,8 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedRecipientID = "recipientId"; diff --git a/src/Courier.Tests/Models/MessageContextTest.cs b/src/Courier.Tests/Models/MessageContextTest.cs index 2e9dc4a6..d10d0ab8 100644 --- a/src/Courier.Tests/Models/MessageContextTest.cs +++ b/src/Courier.Tests/Models/MessageContextTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -20,8 +21,11 @@ public void SerializationRoundtrip_Works() { var model = new MessageContext { TenantID = "tenant_id" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -31,8 +35,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new MessageContext { TenantID = "tenant_id" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedTenantID = "tenant_id"; diff --git a/src/Courier.Tests/Models/MessageRoutingChannelTest.cs b/src/Courier.Tests/Models/MessageRoutingChannelTest.cs index bf5872db..feb8868b 100644 --- a/src/Courier.Tests/Models/MessageRoutingChannelTest.cs +++ b/src/Courier.Tests/Models/MessageRoutingChannelTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -8,25 +9,30 @@ public class MessageRoutingChannelTest : TestBase [Fact] public void StringValidationWorks() { - MessageRoutingChannel value = new("string"); + MessageRoutingChannel value = "string"; value.Validate(); } [Fact] public void MessageRoutingValidationWorks() { - MessageRoutingChannel value = new( - new MessageRouting() { Channels = ["string"], Method = Method.All } - ); + MessageRoutingChannel value = new MessageRouting() + { + Channels = ["string"], + Method = Method.All, + }; value.Validate(); } [Fact] public void StringSerializationRoundtripWorks() { - MessageRoutingChannel value = new("string"); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + MessageRoutingChannel value = "string"; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.Equal(value, deserialized); } @@ -34,11 +40,16 @@ public void StringSerializationRoundtripWorks() [Fact] public void MessageRoutingSerializationRoundtripWorks() { - MessageRoutingChannel value = new( - new MessageRouting() { Channels = ["string"], Method = Method.All } + MessageRoutingChannel value = new MessageRouting() + { + Channels = ["string"], + Method = Method.All, + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } diff --git a/src/Courier.Tests/Models/MessageRoutingTest.cs b/src/Courier.Tests/Models/MessageRoutingTest.cs index bfc24247..fd5c145d 100644 --- a/src/Courier.Tests/Models/MessageRoutingTest.cs +++ b/src/Courier.Tests/Models/MessageRoutingTest.cs @@ -29,8 +29,11 @@ public void SerializationRoundtrip_Works() { var model = new MessageRouting { Channels = ["string"], Method = Method.All }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -40,8 +43,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new MessageRouting { Channels = ["string"], Method = Method.All }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedChannels = ["string"]; @@ -80,7 +86,7 @@ public void Validation_Works(Method rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -109,7 +115,7 @@ public void SerializationRoundtrip_Works(Method rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Messages/MessageContentResponseTest.cs b/src/Courier.Tests/Models/Messages/MessageContentResponseTest.cs index 38a22e45..da5c8a3d 100644 --- a/src/Courier.Tests/Models/Messages/MessageContentResponseTest.cs +++ b/src/Courier.Tests/Models/Messages/MessageContentResponseTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models.Messages; namespace Courier.Tests.Models.Messages; @@ -79,8 +80,11 @@ public void SerializationRoundtrip_Works() ], }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -109,8 +113,11 @@ public void FieldRoundtripThroughSerialization_Works() ], }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedResults = @@ -221,8 +228,8 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -245,8 +252,8 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedChannel = "channel"; @@ -335,8 +342,8 @@ public void SerializationRoundtrip_Works() Title = "title", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -354,8 +361,11 @@ public void FieldRoundtripThroughSerialization_Works() Title = "title", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedBlocks = [new() { Text = "text", Type = "type" }]; @@ -413,8 +423,8 @@ public void SerializationRoundtrip_Works() { var model = new Block { Text = "text", Type = "type" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -424,8 +434,8 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new Block { Text = "text", Type = "type" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedText = "text"; diff --git a/src/Courier.Tests/Models/Messages/MessageDetailsTest.cs b/src/Courier.Tests/Models/Messages/MessageDetailsTest.cs index 6ded4059..a66740dc 100644 --- a/src/Courier.Tests/Models/Messages/MessageDetailsTest.cs +++ b/src/Courier.Tests/Models/Messages/MessageDetailsTest.cs @@ -72,8 +72,11 @@ public void SerializationRoundtrip_Works() Reason = Reason.Bounced, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -97,8 +100,11 @@ public void FieldRoundtripThroughSerialization_Works() Reason = Reason.Bounced, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedID = "id"; @@ -272,7 +278,7 @@ public void Validation_Works(Status rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -314,7 +320,7 @@ public void SerializationRoundtrip_Works(Status rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -350,7 +356,7 @@ public void Validation_Works(Reason rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -386,7 +392,7 @@ public void SerializationRoundtrip_Works(Reason rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Messages/MessageHistoryResponseTest.cs b/src/Courier.Tests/Models/Messages/MessageHistoryResponseTest.cs index b6e4070a..0568cbf6 100644 --- a/src/Courier.Tests/Models/Messages/MessageHistoryResponseTest.cs +++ b/src/Courier.Tests/Models/Messages/MessageHistoryResponseTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models.Messages; namespace Courier.Tests.Models.Messages; @@ -55,8 +56,11 @@ public void SerializationRoundtrip_Works() ], }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -75,8 +79,11 @@ public void FieldRoundtripThroughSerialization_Works() ], }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List> expectedResults = diff --git a/src/Courier.Tests/Models/Messages/MessageListResponseTest.cs b/src/Courier.Tests/Models/Messages/MessageListResponseTest.cs index 1cabea8b..637d15ef 100644 --- a/src/Courier.Tests/Models/Messages/MessageListResponseTest.cs +++ b/src/Courier.Tests/Models/Messages/MessageListResponseTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.Messages; @@ -87,8 +88,11 @@ public void SerializationRoundtrip_Works() ], }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -119,8 +123,11 @@ public void FieldRoundtripThroughSerialization_Works() ], }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Paging expectedPaging = new() { More = true, Cursor = "cursor" }; diff --git a/src/Courier.Tests/Models/Messages/MessageRetrieveResponseTest.cs b/src/Courier.Tests/Models/Messages/MessageRetrieveResponseTest.cs index 39f7b09d..a0d06ef9 100644 --- a/src/Courier.Tests/Models/Messages/MessageRetrieveResponseTest.cs +++ b/src/Courier.Tests/Models/Messages/MessageRetrieveResponseTest.cs @@ -105,8 +105,11 @@ public void SerializationRoundtrip_Works() ], }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -137,8 +140,11 @@ public void FieldRoundtripThroughSerialization_Works() ], }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedID = "id"; @@ -367,8 +373,11 @@ public void SerializationRoundtrip_Works() ], }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -387,8 +396,11 @@ public void FieldRoundtripThroughSerialization_Works() ], }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List> expectedProviders = diff --git a/src/Courier.Tests/Models/MsTeamsBasePropertiesTest.cs b/src/Courier.Tests/Models/MsTeamsBasePropertiesTest.cs index bd8067db..34b4e8d3 100644 --- a/src/Courier.Tests/Models/MsTeamsBasePropertiesTest.cs +++ b/src/Courier.Tests/Models/MsTeamsBasePropertiesTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -30,8 +31,11 @@ public void SerializationRoundtrip_Works() TenantID = "tenant_id", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -45,8 +49,11 @@ public void FieldRoundtripThroughSerialization_Works() TenantID = "tenant_id", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedServiceUrl = "service_url"; diff --git a/src/Courier.Tests/Models/MsTeamsRecipientTest.cs b/src/Courier.Tests/Models/MsTeamsRecipientTest.cs index 4ac8fa5f..ff568a1e 100644 --- a/src/Courier.Tests/Models/MsTeamsRecipientTest.cs +++ b/src/Courier.Tests/Models/MsTeamsRecipientTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -41,8 +42,11 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -60,8 +64,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); MsTeams expectedMsTeams = new SendToMsTeamsUserID() diff --git a/src/Courier.Tests/Models/MsTeamsTest.cs b/src/Courier.Tests/Models/MsTeamsTest.cs index 0c0551a4..86de4d14 100644 --- a/src/Courier.Tests/Models/MsTeamsTest.cs +++ b/src/Courier.Tests/Models/MsTeamsTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -8,87 +9,78 @@ public class MsTeamsTest : TestBase [Fact] public void SendToMsTeamsUserIDValidationWorks() { - MsTeams value = new( - new SendToMsTeamsUserID() - { - ServiceUrl = "service_url", - TenantID = "tenant_id", - UserID = "user_id", - } - ); + MsTeams value = new SendToMsTeamsUserID() + { + ServiceUrl = "service_url", + TenantID = "tenant_id", + UserID = "user_id", + }; value.Validate(); } [Fact] public void SendToMsTeamsEmailValidationWorks() { - MsTeams value = new( - new SendToMsTeamsEmail() - { - Email = "email", - ServiceUrl = "service_url", - TenantID = "tenant_id", - } - ); + MsTeams value = new SendToMsTeamsEmail() + { + Email = "email", + ServiceUrl = "service_url", + TenantID = "tenant_id", + }; value.Validate(); } [Fact] public void SendToMsTeamsChannelIDValidationWorks() { - MsTeams value = new( - new SendToMsTeamsChannelID() - { - ChannelID = "channel_id", - ServiceUrl = "service_url", - TenantID = "tenant_id", - } - ); + MsTeams value = new SendToMsTeamsChannelID() + { + ChannelID = "channel_id", + ServiceUrl = "service_url", + TenantID = "tenant_id", + }; value.Validate(); } [Fact] public void SendToMsTeamsConversationIDValidationWorks() { - MsTeams value = new( - new SendToMsTeamsConversationID() - { - ConversationID = "conversation_id", - ServiceUrl = "service_url", - TenantID = "tenant_id", - } - ); + MsTeams value = new SendToMsTeamsConversationID() + { + ConversationID = "conversation_id", + ServiceUrl = "service_url", + TenantID = "tenant_id", + }; value.Validate(); } [Fact] public void SendToMsTeamsChannelNameValidationWorks() { - MsTeams value = new( - new SendToMsTeamsChannelName() - { - ChannelName = "channel_name", - ServiceUrl = "service_url", - TeamID = "team_id", - TenantID = "tenant_id", - } - ); + MsTeams value = new SendToMsTeamsChannelName() + { + ChannelName = "channel_name", + ServiceUrl = "service_url", + TeamID = "team_id", + TenantID = "tenant_id", + }; value.Validate(); } [Fact] public void SendToMsTeamsUserIDSerializationRoundtripWorks() { - MsTeams value = new( - new SendToMsTeamsUserID() - { - ServiceUrl = "service_url", - TenantID = "tenant_id", - UserID = "user_id", - } + MsTeams value = new SendToMsTeamsUserID() + { + ServiceUrl = "service_url", + TenantID = "tenant_id", + UserID = "user_id", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -96,16 +88,17 @@ public void SendToMsTeamsUserIDSerializationRoundtripWorks() [Fact] public void SendToMsTeamsEmailSerializationRoundtripWorks() { - MsTeams value = new( - new SendToMsTeamsEmail() - { - Email = "email", - ServiceUrl = "service_url", - TenantID = "tenant_id", - } + MsTeams value = new SendToMsTeamsEmail() + { + Email = "email", + ServiceUrl = "service_url", + TenantID = "tenant_id", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -113,16 +106,17 @@ public void SendToMsTeamsEmailSerializationRoundtripWorks() [Fact] public void SendToMsTeamsChannelIDSerializationRoundtripWorks() { - MsTeams value = new( - new SendToMsTeamsChannelID() - { - ChannelID = "channel_id", - ServiceUrl = "service_url", - TenantID = "tenant_id", - } + MsTeams value = new SendToMsTeamsChannelID() + { + ChannelID = "channel_id", + ServiceUrl = "service_url", + TenantID = "tenant_id", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -130,16 +124,17 @@ public void SendToMsTeamsChannelIDSerializationRoundtripWorks() [Fact] public void SendToMsTeamsConversationIDSerializationRoundtripWorks() { - MsTeams value = new( - new SendToMsTeamsConversationID() - { - ConversationID = "conversation_id", - ServiceUrl = "service_url", - TenantID = "tenant_id", - } + MsTeams value = new SendToMsTeamsConversationID() + { + ConversationID = "conversation_id", + ServiceUrl = "service_url", + TenantID = "tenant_id", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -147,17 +142,18 @@ public void SendToMsTeamsConversationIDSerializationRoundtripWorks() [Fact] public void SendToMsTeamsChannelNameSerializationRoundtripWorks() { - MsTeams value = new( - new SendToMsTeamsChannelName() - { - ChannelName = "channel_name", - ServiceUrl = "service_url", - TeamID = "team_id", - TenantID = "tenant_id", - } + MsTeams value = new SendToMsTeamsChannelName() + { + ChannelName = "channel_name", + ServiceUrl = "service_url", + TeamID = "team_id", + TenantID = "tenant_id", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } diff --git a/src/Courier.Tests/Models/MultipleTokensTest.cs b/src/Courier.Tests/Models/MultipleTokensTest.cs index 2a97fe11..0cd01719 100644 --- a/src/Courier.Tests/Models/MultipleTokensTest.cs +++ b/src/Courier.Tests/Models/MultipleTokensTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -25,8 +26,11 @@ public void SerializationRoundtrip_Works() { var model = new MultipleTokens { Tokens = [new("token")] }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -36,8 +40,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new MultipleTokens { Tokens = [new("token")] }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedTokens = [new("token")]; diff --git a/src/Courier.Tests/Models/NotificationPreferenceDetailsTest.cs b/src/Courier.Tests/Models/NotificationPreferenceDetailsTest.cs index f5c89d01..edcc78f0 100644 --- a/src/Courier.Tests/Models/NotificationPreferenceDetailsTest.cs +++ b/src/Courier.Tests/Models/NotificationPreferenceDetailsTest.cs @@ -49,8 +49,11 @@ public void SerializationRoundtrip_Works() Rules = [new() { Until = "until", Start = "start" }], }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -65,8 +68,11 @@ public void FieldRoundtripThroughSerialization_Works() Rules = [new() { Until = "until", Start = "start" }], }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedStatus = PreferenceStatus.OptedIn; diff --git a/src/Courier.Tests/Models/Notifications/BaseCheckTest.cs b/src/Courier.Tests/Models/Notifications/BaseCheckTest.cs index e68a3df8..7085ca42 100644 --- a/src/Courier.Tests/Models/Notifications/BaseCheckTest.cs +++ b/src/Courier.Tests/Models/Notifications/BaseCheckTest.cs @@ -36,8 +36,8 @@ public void SerializationRoundtrip_Works() Type = Type.Custom, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -52,8 +52,11 @@ public void FieldRoundtripThroughSerialization_Works() Type = Type.Custom, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedID = "id"; @@ -96,7 +99,7 @@ public void Validation_Works(Status rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -126,7 +129,7 @@ public void SerializationRoundtrip_Works(Status rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -154,7 +157,7 @@ public void Validation_Works(Type rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -182,7 +185,7 @@ public void SerializationRoundtrip_Works(Type rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Notifications/CheckTest.cs b/src/Courier.Tests/Models/Notifications/CheckTest.cs index ebdedae9..b454d150 100644 --- a/src/Courier.Tests/Models/Notifications/CheckTest.cs +++ b/src/Courier.Tests/Models/Notifications/CheckTest.cs @@ -39,8 +39,8 @@ public void SerializationRoundtrip_Works() Updated = 0, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -56,8 +56,8 @@ public void FieldRoundtripThroughSerialization_Works() Updated = 0, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedID = "id"; @@ -103,8 +103,11 @@ public void SerializationRoundtrip_Works() { var model = new IntersectionMember1 { Updated = 0 }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -114,8 +117,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new IntersectionMember1 { Updated = 0 }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); long expectedUpdated = 0; diff --git a/src/Courier.Tests/Models/Notifications/Checks/CheckListResponseTest.cs b/src/Courier.Tests/Models/Notifications/Checks/CheckListResponseTest.cs index d589ee3b..28e28b33 100644 --- a/src/Courier.Tests/Models/Notifications/Checks/CheckListResponseTest.cs +++ b/src/Courier.Tests/Models/Notifications/Checks/CheckListResponseTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models.Notifications; using Courier.Models.Notifications.Checks; @@ -59,8 +60,11 @@ public void SerializationRoundtrip_Works() ], }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -82,8 +86,11 @@ public void FieldRoundtripThroughSerialization_Works() ], }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedChecks = diff --git a/src/Courier.Tests/Models/Notifications/Checks/CheckUpdateResponseTest.cs b/src/Courier.Tests/Models/Notifications/Checks/CheckUpdateResponseTest.cs index e827568c..0e3a571f 100644 --- a/src/Courier.Tests/Models/Notifications/Checks/CheckUpdateResponseTest.cs +++ b/src/Courier.Tests/Models/Notifications/Checks/CheckUpdateResponseTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models.Notifications; using Courier.Models.Notifications.Checks; @@ -59,8 +60,11 @@ public void SerializationRoundtrip_Works() ], }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -82,8 +86,11 @@ public void FieldRoundtripThroughSerialization_Works() ], }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedChecks = diff --git a/src/Courier.Tests/Models/Notifications/NotificationGetContentTest.cs b/src/Courier.Tests/Models/Notifications/NotificationGetContentTest.cs index accc6b61..87812f26 100644 --- a/src/Courier.Tests/Models/Notifications/NotificationGetContentTest.cs +++ b/src/Courier.Tests/Models/Notifications/NotificationGetContentTest.cs @@ -131,8 +131,11 @@ public void SerializationRoundtrip_Works() Checksum = "checksum", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -175,8 +178,11 @@ public void FieldRoundtripThroughSerialization_Works() Checksum = "checksum", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedBlocks = @@ -374,8 +380,8 @@ public void SerializationRoundtrip_Works() Locales = new Dictionary() { { "foo", "string" } }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -394,8 +400,8 @@ public void FieldRoundtripThroughSerialization_Works() Locales = new Dictionary() { { "foo", "string" } }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedID = "id"; @@ -533,7 +539,7 @@ public void Validation_Works(BlockType rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -569,7 +575,7 @@ public void SerializationRoundtrip_Works(BlockType rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -587,25 +593,30 @@ public class ContentTest : TestBase [Fact] public void StringValidationWorks() { - Content value = new("string"); + Content value = "string"; value.Validate(); } [Fact] public void NotificationContentHierarchyValidationWorks() { - Content value = new( - new NotificationContentHierarchy() { Children = "children", Parent = "parent" } - ); + Content value = new NotificationContentHierarchy() + { + Children = "children", + Parent = "parent", + }; value.Validate(); } [Fact] public void StringSerializationRoundtripWorks() { - Content value = new("string"); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + Content value = "string"; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.Equal(value, deserialized); } @@ -613,11 +624,16 @@ public void StringSerializationRoundtripWorks() [Fact] public void NotificationContentHierarchySerializationRoundtripWorks() { - Content value = new( - new NotificationContentHierarchy() { Children = "children", Parent = "parent" } + Content value = new NotificationContentHierarchy() + { + Children = "children", + Parent = "parent", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -642,8 +658,11 @@ public void SerializationRoundtrip_Works() { var model = new NotificationContentHierarchy { Children = "children", Parent = "parent" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -653,8 +672,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new NotificationContentHierarchy { Children = "children", Parent = "parent" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedChildren = "children"; @@ -716,25 +738,27 @@ public class LocaleTest : TestBase [Fact] public void StringValidationWorks() { - Locale value = new("string"); + Locale value = "string"; value.Validate(); } [Fact] public void NotificationContentHierarchyValidationWorks() { - Locale value = new( - new LocaleNotificationContentHierarchy() { Children = "children", Parent = "parent" } - ); + Locale value = new LocaleNotificationContentHierarchy() + { + Children = "children", + Parent = "parent", + }; value.Validate(); } [Fact] public void StringSerializationRoundtripWorks() { - Locale value = new("string"); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + Locale value = "string"; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.Equal(value, deserialized); } @@ -742,11 +766,13 @@ public void StringSerializationRoundtripWorks() [Fact] public void NotificationContentHierarchySerializationRoundtripWorks() { - Locale value = new( - new LocaleNotificationContentHierarchy() { Children = "children", Parent = "parent" } - ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + Locale value = new LocaleNotificationContentHierarchy() + { + Children = "children", + Parent = "parent", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.Equal(value, deserialized); } @@ -779,8 +805,11 @@ public void SerializationRoundtrip_Works() Parent = "parent", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -794,8 +823,11 @@ public void FieldRoundtripThroughSerialization_Works() Parent = "parent", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedChildren = "children"; @@ -920,8 +952,8 @@ public void SerializationRoundtrip_Works() Type = "type", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -944,8 +976,11 @@ public void FieldRoundtripThroughSerialization_Works() Type = "type", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedID = "id"; @@ -1077,8 +1112,11 @@ public void SerializationRoundtrip_Works() { var model = new ChannelContent { Subject = "subject", Title = "title" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -1088,8 +1126,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new ChannelContent { Subject = "subject", Title = "title" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedSubject = "subject"; @@ -1165,8 +1206,11 @@ public void SerializationRoundtrip_Works() { var model = new LocalesItem { Subject = "subject", Title = "title" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -1176,8 +1220,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new LocalesItem { Subject = "subject", Title = "title" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedSubject = "subject"; diff --git a/src/Courier.Tests/Models/Notifications/NotificationListResponseTest.cs b/src/Courier.Tests/Models/Notifications/NotificationListResponseTest.cs index a676bbad..c1944a55 100644 --- a/src/Courier.Tests/Models/Notifications/NotificationListResponseTest.cs +++ b/src/Courier.Tests/Models/Notifications/NotificationListResponseTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.Notifications; @@ -78,8 +79,11 @@ public void SerializationRoundtrip_Works() ], }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -107,8 +111,11 @@ public void FieldRoundtripThroughSerialization_Works() ], }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Paging expectedPaging = new() { More = true, Cursor = "cursor" }; @@ -222,8 +229,8 @@ public void SerializationRoundtrip_Works() Title = "title", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -244,8 +251,8 @@ public void FieldRoundtripThroughSerialization_Works() Title = "title", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedID = "id"; @@ -394,8 +401,8 @@ public void SerializationRoundtrip_Works() { var model = new Tags { Data = [new() { ID = "id", Name = "name" }] }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -405,8 +412,8 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new Tags { Data = [new() { ID = "id", Name = "name" }] }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); List expectedData = [new() { ID = "id", Name = "name" }]; @@ -446,8 +453,8 @@ public void SerializationRoundtrip_Works() { var model = new Data { ID = "id", Name = "name" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -457,8 +464,8 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new Data { ID = "id", Name = "name" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedID = "id"; diff --git a/src/Courier.Tests/Models/PagerdutyRecipientTest.cs b/src/Courier.Tests/Models/PagerdutyRecipientTest.cs index 4872a129..6431c6df 100644 --- a/src/Courier.Tests/Models/PagerdutyRecipientTest.cs +++ b/src/Courier.Tests/Models/PagerdutyRecipientTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -44,8 +45,11 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -64,8 +68,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Pagerduty expectedPagerduty = new() diff --git a/src/Courier.Tests/Models/PagerdutyTest.cs b/src/Courier.Tests/Models/PagerdutyTest.cs index 63de6484..fbed5ba7 100644 --- a/src/Courier.Tests/Models/PagerdutyTest.cs +++ b/src/Courier.Tests/Models/PagerdutyTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -38,8 +39,8 @@ public void SerializationRoundtrip_Works() Source = "source", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -55,8 +56,11 @@ public void FieldRoundtripThroughSerialization_Works() Source = "source", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedEventAction = "event_action"; diff --git a/src/Courier.Tests/Models/PagingTest.cs b/src/Courier.Tests/Models/PagingTest.cs index d4763555..640826bb 100644 --- a/src/Courier.Tests/Models/PagingTest.cs +++ b/src/Courier.Tests/Models/PagingTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -22,8 +23,8 @@ public void SerializationRoundtrip_Works() { var model = new Paging { More = true, Cursor = "cursor" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -33,8 +34,8 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new Paging { More = true, Cursor = "cursor" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); bool expectedMore = true; diff --git a/src/Courier.Tests/Models/PreferenceStatusTest.cs b/src/Courier.Tests/Models/PreferenceStatusTest.cs index 8995bd4c..05c3cabb 100644 --- a/src/Courier.Tests/Models/PreferenceStatusTest.cs +++ b/src/Courier.Tests/Models/PreferenceStatusTest.cs @@ -22,7 +22,7 @@ public void Validation_Works(PreferenceStatus rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -52,7 +52,7 @@ public void SerializationRoundtrip_Works(PreferenceStatus rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/PreferenceTest.cs b/src/Courier.Tests/Models/PreferenceTest.cs index 12914cf5..54c18533 100644 --- a/src/Courier.Tests/Models/PreferenceTest.cs +++ b/src/Courier.Tests/Models/PreferenceTest.cs @@ -54,8 +54,11 @@ public void SerializationRoundtrip_Works() Source = Source.Subscription, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -71,8 +74,11 @@ public void FieldRoundtripThroughSerialization_Works() Source = Source.Subscription, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedStatus = PreferenceStatus.OptedIn; @@ -187,7 +193,7 @@ public void Validation_Works(Source rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -217,7 +223,7 @@ public void SerializationRoundtrip_Works(Source rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Profiles/Lists/ListDeleteResponseTest.cs b/src/Courier.Tests/Models/Profiles/Lists/ListDeleteResponseTest.cs index 97b323aa..1e601d5c 100644 --- a/src/Courier.Tests/Models/Profiles/Lists/ListDeleteResponseTest.cs +++ b/src/Courier.Tests/Models/Profiles/Lists/ListDeleteResponseTest.cs @@ -22,8 +22,11 @@ public void SerializationRoundtrip_Works() { var model = new ListDeleteResponse { Status = Status.Success }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -33,8 +36,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new ListDeleteResponse { Status = Status.Success }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedStatus = Status.Success; @@ -66,7 +72,7 @@ public void Validation_Works(Status rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -94,7 +100,7 @@ public void SerializationRoundtrip_Works(Status rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Profiles/Lists/ListRetrieveResponseTest.cs b/src/Courier.Tests/Models/Profiles/Lists/ListRetrieveResponseTest.cs index 50e389b2..41b3cdf8 100644 --- a/src/Courier.Tests/Models/Profiles/Lists/ListRetrieveResponseTest.cs +++ b/src/Courier.Tests/Models/Profiles/Lists/ListRetrieveResponseTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.Profiles.Lists; @@ -144,8 +145,11 @@ public void SerializationRoundtrip_Works() ], }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -195,8 +199,11 @@ public void FieldRoundtripThroughSerialization_Works() ], }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Paging expectedPaging = new() { More = true, Cursor = "cursor" }; @@ -412,8 +419,8 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -456,8 +463,8 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedID = "id"; diff --git a/src/Courier.Tests/Models/Profiles/Lists/ListSubscribeResponseTest.cs b/src/Courier.Tests/Models/Profiles/Lists/ListSubscribeResponseTest.cs index 93af7927..063c8c5a 100644 --- a/src/Courier.Tests/Models/Profiles/Lists/ListSubscribeResponseTest.cs +++ b/src/Courier.Tests/Models/Profiles/Lists/ListSubscribeResponseTest.cs @@ -23,8 +23,11 @@ public void SerializationRoundtrip_Works() { var model = new ListSubscribeResponse { Status = ListSubscribeResponseStatus.Success }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -34,8 +37,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new ListSubscribeResponse { Status = ListSubscribeResponseStatus.Success }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedStatus = @@ -68,7 +74,7 @@ public void Validation_Works(ListSubscribeResponseStatus rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -96,7 +102,7 @@ public void SerializationRoundtrip_Works(ListSubscribeResponseStatus rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Profiles/ProfileCreateResponseTest.cs b/src/Courier.Tests/Models/Profiles/ProfileCreateResponseTest.cs index 0a05905f..9df9f754 100644 --- a/src/Courier.Tests/Models/Profiles/ProfileCreateResponseTest.cs +++ b/src/Courier.Tests/Models/Profiles/ProfileCreateResponseTest.cs @@ -22,8 +22,11 @@ public void SerializationRoundtrip_Works() { var model = new ProfileCreateResponse { Status = Status.Success }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -33,8 +36,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new ProfileCreateResponse { Status = Status.Success }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedStatus = Status.Success; @@ -66,7 +72,7 @@ public void Validation_Works(Status rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -94,7 +100,7 @@ public void SerializationRoundtrip_Works(Status rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Profiles/ProfileReplaceResponseTest.cs b/src/Courier.Tests/Models/Profiles/ProfileReplaceResponseTest.cs index e281066a..ae48237e 100644 --- a/src/Courier.Tests/Models/Profiles/ProfileReplaceResponseTest.cs +++ b/src/Courier.Tests/Models/Profiles/ProfileReplaceResponseTest.cs @@ -23,8 +23,11 @@ public void SerializationRoundtrip_Works() { var model = new ProfileReplaceResponse { Status = ProfileReplaceResponseStatus.Success }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -34,8 +37,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new ProfileReplaceResponse { Status = ProfileReplaceResponseStatus.Success }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedStatus = @@ -68,7 +74,7 @@ public void Validation_Works(ProfileReplaceResponseStatus rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -95,7 +101,7 @@ public void SerializationRoundtrip_Works(ProfileReplaceResponseStatus rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Profiles/ProfileRetrieveResponseTest.cs b/src/Courier.Tests/Models/Profiles/ProfileRetrieveResponseTest.cs index 2f58d817..be7b8b68 100644 --- a/src/Courier.Tests/Models/Profiles/ProfileRetrieveResponseTest.cs +++ b/src/Courier.Tests/Models/Profiles/ProfileRetrieveResponseTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.Profiles; @@ -125,8 +126,11 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -169,8 +173,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Dictionary expectedProfile = new() diff --git a/src/Courier.Tests/Models/Profiles/ProfileUpdateParamsTest.cs b/src/Courier.Tests/Models/Profiles/ProfileUpdateParamsTest.cs index d080300a..56c0b5ed 100644 --- a/src/Courier.Tests/Models/Profiles/ProfileUpdateParamsTest.cs +++ b/src/Courier.Tests/Models/Profiles/ProfileUpdateParamsTest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models.Profiles; namespace Courier.Tests.Models.Profiles; @@ -97,8 +98,8 @@ public void SerializationRoundtrip_Works() Value = "value", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -113,8 +114,8 @@ public void FieldRoundtripThroughSerialization_Works() Value = "value", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedOp = "op"; diff --git a/src/Courier.Tests/Models/Profiles/SubscribeToListsRequestItemTest.cs b/src/Courier.Tests/Models/Profiles/SubscribeToListsRequestItemTest.cs index c2c19521..32846d4a 100644 --- a/src/Courier.Tests/Models/Profiles/SubscribeToListsRequestItemTest.cs +++ b/src/Courier.Tests/Models/Profiles/SubscribeToListsRequestItemTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.Profiles; @@ -110,8 +111,11 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -151,8 +155,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedListID = "listId"; diff --git a/src/Courier.Tests/Models/RecipientPreferencesTest.cs b/src/Courier.Tests/Models/RecipientPreferencesTest.cs index c127e61f..63ea8730 100644 --- a/src/Courier.Tests/Models/RecipientPreferencesTest.cs +++ b/src/Courier.Tests/Models/RecipientPreferencesTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -111,8 +112,11 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -148,8 +152,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Dictionary expectedCategories = new() diff --git a/src/Courier.Tests/Models/RuleTest.cs b/src/Courier.Tests/Models/RuleTest.cs index ee1e2bf5..997fd162 100644 --- a/src/Courier.Tests/Models/RuleTest.cs +++ b/src/Courier.Tests/Models/RuleTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -22,8 +23,8 @@ public void SerializationRoundtrip_Works() { var model = new Rule { Until = "until", Start = "start" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -33,8 +34,8 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new Rule { Until = "until", Start = "start" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedUntil = "until"; diff --git a/src/Courier.Tests/Models/Send/SendMessageParamsTest.cs b/src/Courier.Tests/Models/Send/SendMessageParamsTest.cs index 9d4ad7cb..cad30cd9 100644 --- a/src/Courier.Tests/Models/Send/SendMessageParamsTest.cs +++ b/src/Courier.Tests/Models/Send/SendMessageParamsTest.cs @@ -965,8 +965,8 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -1123,8 +1123,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedBrandID = "brand_id"; @@ -2308,8 +2311,11 @@ public void SerializationRoundtrip_Works() Timeouts = new() { Channel = 0, Provider = 0 }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -2341,8 +2347,11 @@ public void FieldRoundtripThroughSerialization_Works() Timeouts = new() { Channel = 0, Provider = 0 }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedBrandID = "brand_id"; @@ -2538,8 +2547,8 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -2559,8 +2568,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Models::Utm expectedUtm = new() @@ -2644,7 +2656,7 @@ public void Validation_Works(RoutingMethod rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -2673,7 +2685,7 @@ public void SerializationRoundtrip_Works(RoutingMethod rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -2705,8 +2717,8 @@ public void SerializationRoundtrip_Works() { var model = new Timeouts { Channel = 0, Provider = 0 }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -2716,8 +2728,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new Timeouts { Channel = 0, Provider = 0 }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); long expectedChannel = 0; @@ -2779,40 +2794,41 @@ public class ContentTest : TestBase [Fact] public void ElementalContentSugarValidationWorks() { - Content value = new(new Models::ElementalContentSugar() { Body = "body", Title = "title" }); + Content value = new Models::ElementalContentSugar() { Body = "body", Title = "title" }; value.Validate(); } [Fact] public void ElementalValidationWorks() { - Content value = new( - new Models::ElementalContent() - { - Elements = - [ - new Models::ElementalTextNodeWithType() - { - Channels = ["string"], - If = "if", - Loop = "loop", - Ref = "ref", - Type = Models::ElementalTextNodeWithTypeIntersectionMember1Type.Text, - }, - ], - Version = "version", - Brand = "brand", - } - ); + Content value = new Models::ElementalContent() + { + Elements = + [ + new Models::ElementalTextNodeWithType() + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Type = Models::ElementalTextNodeWithTypeIntersectionMember1Type.Text, + }, + ], + Version = "version", + Brand = "brand", + }; value.Validate(); } [Fact] public void ElementalContentSugarSerializationRoundtripWorks() { - Content value = new(new Models::ElementalContentSugar() { Body = "body", Title = "title" }); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + Content value = new Models::ElementalContentSugar() { Body = "body", Title = "title" }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.Equal(value, deserialized); } @@ -2820,26 +2836,27 @@ public void ElementalContentSugarSerializationRoundtripWorks() [Fact] public void ElementalSerializationRoundtripWorks() { - Content value = new( - new Models::ElementalContent() - { - Elements = - [ - new Models::ElementalTextNodeWithType() - { - Channels = ["string"], - If = "if", - Loop = "loop", - Ref = "ref", - Type = Models::ElementalTextNodeWithTypeIntersectionMember1Type.Text, - }, - ], - Version = "version", - Brand = "brand", - } + Content value = new Models::ElementalContent() + { + Elements = + [ + new Models::ElementalTextNodeWithType() + { + Channels = ["string"], + If = "if", + Loop = "loop", + Ref = "ref", + Type = Models::ElementalTextNodeWithTypeIntersectionMember1Type.Text, + }, + ], + Version = "version", + Brand = "brand", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); Assert.Equal(value, deserialized); } @@ -2876,8 +2893,8 @@ public void SerializationRoundtrip_Works() Until = "until", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -2892,8 +2909,8 @@ public void FieldRoundtripThroughSerialization_Works() Until = "until", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); long expectedDuration = 0; @@ -2990,8 +3007,8 @@ public void SerializationRoundtrip_Works() { var model = new Expiry { ExpiresIn = "string", ExpiresAt = "expires_at" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -3001,8 +3018,8 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new Expiry { ExpiresIn = "string", ExpiresAt = "expires_at" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); ExpiresIn expectedExpiresIn = "string"; @@ -3070,23 +3087,26 @@ public class ExpiresInTest : TestBase [Fact] public void StringValidationWorks() { - ExpiresIn value = new("string"); + ExpiresIn value = "string"; value.Validate(); } [Fact] public void LongValidationWorks() { - ExpiresIn value = new(0); + ExpiresIn value = 0; value.Validate(); } [Fact] public void StringSerializationRoundtripWorks() { - ExpiresIn value = new("string"); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + ExpiresIn value = "string"; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.Equal(value, deserialized); } @@ -3094,9 +3114,12 @@ public void StringSerializationRoundtripWorks() [Fact] public void LongSerializationRoundtripWorks() { - ExpiresIn value = new(0); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + ExpiresIn value = 0; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.Equal(value, deserialized); } @@ -3163,8 +3186,11 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -3187,8 +3213,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedEvent = "event"; @@ -3311,8 +3340,11 @@ public void SerializationRoundtrip_Works() { var model = new Preferences { SubscriptionTopicID = "subscription_topic_id" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -3322,8 +3354,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new Preferences { SubscriptionTopicID = "subscription_topic_id" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedSubscriptionTopicID = "subscription_topic_id"; @@ -3421,8 +3456,11 @@ public void SerializationRoundtrip_Works() Timeouts = 0, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -3451,8 +3489,11 @@ public void FieldRoundtripThroughSerialization_Works() Timeouts = 0, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedIf = "if"; @@ -3616,8 +3657,11 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -3637,8 +3681,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Models::Utm expectedUtm = new() @@ -3729,8 +3776,8 @@ public void SerializationRoundtrip_Works() { var model = new Routing { Channels = ["string"], Method = Method.All }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -3740,8 +3787,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new Routing { Channels = ["string"], Method = Method.All }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedChannels = ["string"]; @@ -3780,7 +3830,7 @@ public void Validation_Works(Method rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -3809,7 +3859,7 @@ public void SerializationRoundtrip_Works(Method rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -3875,8 +3925,8 @@ public void SerializationRoundtrip_Works() Provider = new Dictionary() { { "foo", 0 } }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -3893,8 +3943,11 @@ public void FieldRoundtripThroughSerialization_Works() Provider = new Dictionary() { { "foo", 0 } }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Dictionary expectedChannel = new() { { "foo", 0 } }; @@ -4022,7 +4075,7 @@ public void Validation_Works(Criteria rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -4053,7 +4106,7 @@ public void SerializationRoundtrip_Works(Criteria rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -4071,140 +4124,124 @@ public class ToTest : TestBase [Fact] public void UserRecipientValidationWorks() { - To value = new( - new Models::UserRecipient() + To value = new Models::UserRecipient() + { + AccountID = "account_id", + Context = new() { TenantID = "tenant_id" }, + Data = new Dictionary() { - AccountID = "account_id", - Context = new() { TenantID = "tenant_id" }, - Data = new Dictionary() - { - { "foo", JsonSerializer.SerializeToElement("bar") }, - }, - Email = "email", - ListID = "list_id", - Locale = "locale", - PhoneNumber = "phone_number", - Preferences = new() + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + Email = "email", + ListID = "list_id", + Locale = "locale", + PhoneNumber = "phone_number", + Preferences = new() + { + Notifications = new Dictionary() { - Notifications = new Dictionary() { + "foo", + new() { - "foo", - new() - { - Status = Models::PreferenceStatus.OptedIn, - ChannelPreferences = - [ - new(Models::ChannelClassification.DirectMessage), - ], - Rules = [new() { Until = "until", Start = "start" }], - Source = Models::Source.Subscription, - } - }, + Status = Models::PreferenceStatus.OptedIn, + ChannelPreferences = [new(Models::ChannelClassification.DirectMessage)], + Rules = [new() { Until = "until", Start = "start" }], + Source = Models::Source.Subscription, + } }, - Categories = new Dictionary() + }, + Categories = new Dictionary() + { { + "foo", + new() { - "foo", - new() - { - Status = Models::PreferenceStatus.OptedIn, - ChannelPreferences = - [ - new(Models::ChannelClassification.DirectMessage), - ], - Rules = [new() { Until = "until", Start = "start" }], - Source = Models::Source.Subscription, - } - }, + Status = Models::PreferenceStatus.OptedIn, + ChannelPreferences = [new(Models::ChannelClassification.DirectMessage)], + Rules = [new() { Until = "until", Start = "start" }], + Source = Models::Source.Subscription, + } }, - TemplateID = "templateId", }, - TenantID = "tenant_id", - UserID = "user_id", - } - ); + TemplateID = "templateId", + }, + TenantID = "tenant_id", + UserID = "user_id", + }; value.Validate(); } [Fact] public void AudienceRecipientValidationWorks() { - To value = new( - new Models::AudienceRecipient() + To value = new Models::AudienceRecipient() + { + AudienceID = "audience_id", + Data = new Dictionary() { - AudienceID = "audience_id", - Data = new Dictionary() + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + Filters = + [ + new() { - { "foo", JsonSerializer.SerializeToElement("bar") }, + Operator = Models::Operator.MemberOf, + Path = Models::Path.AccountID, + Value = "value", }, - Filters = - [ - new() - { - Operator = Models::Operator.MemberOf, - Path = Models::Path.AccountID, - Value = "value", - }, - ], - } - ); + ], + }; value.Validate(); } [Fact] public void ListRecipientValidationWorks() { - To value = new( - new Models::ListRecipient() + To value = new Models::ListRecipient() + { + Data = new Dictionary() { - Data = new Dictionary() + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + Filters = + [ + new() { - { "foo", JsonSerializer.SerializeToElement("bar") }, + Operator = Models::ListFilterOperator.MemberOf, + Path = Models::ListFilterPath.AccountID, + Value = "value", }, - Filters = - [ - new() - { - Operator = Models::ListFilterOperator.MemberOf, - Path = Models::ListFilterPath.AccountID, - Value = "value", - }, - ], - ListID = "list_id", - } - ); + ], + ListID = "list_id", + }; value.Validate(); } [Fact] public void ListPatternRecipientValidationWorks() { - To value = new( - new Models::ListPatternRecipient() + To value = new Models::ListPatternRecipient() + { + Data = new Dictionary() { - Data = new Dictionary() - { - { "foo", JsonSerializer.SerializeToElement("bar") }, - }, - ListPattern = "list_pattern", - } - ); + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + ListPattern = "list_pattern", + }; value.Validate(); } [Fact] public void SlackRecipientValidationWorks() { - To value = new( - new Models::SlackRecipient( - new Models::Slack( - new Models::SendToSlackChannel() - { - AccessToken = "access_token", - Channel = "channel", - } - ) + To value = new Models::SlackRecipient( + new Models::Slack( + new Models::SendToSlackChannel() + { + AccessToken = "access_token", + Channel = "channel", + } ) ); value.Validate(); @@ -4213,16 +4250,14 @@ public void SlackRecipientValidationWorks() [Fact] public void MsTeamsRecipientValidationWorks() { - To value = new( - new Models::MsTeamsRecipient( - new Models::MsTeams( - new Models::SendToMsTeamsUserID() - { - ServiceUrl = "service_url", - TenantID = "tenant_id", - UserID = "user_id", - } - ) + To value = new Models::MsTeamsRecipient( + new Models::MsTeams( + new Models::SendToMsTeamsUserID() + { + ServiceUrl = "service_url", + TenantID = "tenant_id", + UserID = "user_id", + } ) ); value.Validate(); @@ -4231,16 +4266,14 @@ public void MsTeamsRecipientValidationWorks() [Fact] public void PagerdutyRecipientValidationWorks() { - To value = new( - new Models::PagerdutyRecipient( - new Models::Pagerduty() - { - EventAction = "event_action", - RoutingKey = "routing_key", - Severity = "severity", - Source = "source", - } - ) + To value = new Models::PagerdutyRecipient( + new Models::Pagerduty() + { + EventAction = "event_action", + RoutingKey = "routing_key", + Severity = "severity", + Source = "source", + } ); value.Validate(); } @@ -4248,23 +4281,21 @@ public void PagerdutyRecipientValidationWorks() [Fact] public void WebhookRecipientValidationWorks() { - To value = new( - new Models::WebhookRecipient( - new Models::WebhookProfile() + To value = new Models::WebhookRecipient( + new Models::WebhookProfile() + { + Url = "url", + Authentication = new() { - Url = "url", - Authentication = new() - { - Mode = Models::WebhookAuthMode.None, - Token = "token", - Password = "password", - Username = "username", - }, - Headers = new Dictionary() { { "foo", "string" } }, - Method = Models::WebhookMethod.Post, - Profile = Models::WebhookProfileType.Limited, - } - ) + Mode = Models::WebhookAuthMode.None, + Token = "token", + Password = "password", + Username = "username", + }, + Headers = new Dictionary() { { "foo", "string" } }, + Method = Models::WebhookMethod.Post, + Profile = Models::WebhookProfileType.Limited, + } ); value.Validate(); } @@ -4272,61 +4303,53 @@ public void WebhookRecipientValidationWorks() [Fact] public void UserRecipientSerializationRoundtripWorks() { - To value = new( - new Models::UserRecipient() + To value = new Models::UserRecipient() + { + AccountID = "account_id", + Context = new() { TenantID = "tenant_id" }, + Data = new Dictionary() { - AccountID = "account_id", - Context = new() { TenantID = "tenant_id" }, - Data = new Dictionary() - { - { "foo", JsonSerializer.SerializeToElement("bar") }, - }, - Email = "email", - ListID = "list_id", - Locale = "locale", - PhoneNumber = "phone_number", - Preferences = new() + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + Email = "email", + ListID = "list_id", + Locale = "locale", + PhoneNumber = "phone_number", + Preferences = new() + { + Notifications = new Dictionary() { - Notifications = new Dictionary() { + "foo", + new() { - "foo", - new() - { - Status = Models::PreferenceStatus.OptedIn, - ChannelPreferences = - [ - new(Models::ChannelClassification.DirectMessage), - ], - Rules = [new() { Until = "until", Start = "start" }], - Source = Models::Source.Subscription, - } - }, + Status = Models::PreferenceStatus.OptedIn, + ChannelPreferences = [new(Models::ChannelClassification.DirectMessage)], + Rules = [new() { Until = "until", Start = "start" }], + Source = Models::Source.Subscription, + } }, - Categories = new Dictionary() + }, + Categories = new Dictionary() + { { + "foo", + new() { - "foo", - new() - { - Status = Models::PreferenceStatus.OptedIn, - ChannelPreferences = - [ - new(Models::ChannelClassification.DirectMessage), - ], - Rules = [new() { Until = "until", Start = "start" }], - Source = Models::Source.Subscription, - } - }, + Status = Models::PreferenceStatus.OptedIn, + ChannelPreferences = [new(Models::ChannelClassification.DirectMessage)], + Rules = [new() { Until = "until", Start = "start" }], + Source = Models::Source.Subscription, + } }, - TemplateID = "templateId", }, - TenantID = "tenant_id", - UserID = "user_id", - } - ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + TemplateID = "templateId", + }, + TenantID = "tenant_id", + UserID = "user_id", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.Equal(value, deserialized); } @@ -4334,27 +4357,25 @@ public void UserRecipientSerializationRoundtripWorks() [Fact] public void AudienceRecipientSerializationRoundtripWorks() { - To value = new( - new Models::AudienceRecipient() + To value = new Models::AudienceRecipient() + { + AudienceID = "audience_id", + Data = new Dictionary() { - AudienceID = "audience_id", - Data = new Dictionary() + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + Filters = + [ + new() { - { "foo", JsonSerializer.SerializeToElement("bar") }, + Operator = Models::Operator.MemberOf, + Path = Models::Path.AccountID, + Value = "value", }, - Filters = - [ - new() - { - Operator = Models::Operator.MemberOf, - Path = Models::Path.AccountID, - Value = "value", - }, - ], - } - ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + ], + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.Equal(value, deserialized); } @@ -4362,27 +4383,25 @@ public void AudienceRecipientSerializationRoundtripWorks() [Fact] public void ListRecipientSerializationRoundtripWorks() { - To value = new( - new Models::ListRecipient() + To value = new Models::ListRecipient() + { + Data = new Dictionary() { - Data = new Dictionary() + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + Filters = + [ + new() { - { "foo", JsonSerializer.SerializeToElement("bar") }, + Operator = Models::ListFilterOperator.MemberOf, + Path = Models::ListFilterPath.AccountID, + Value = "value", }, - Filters = - [ - new() - { - Operator = Models::ListFilterOperator.MemberOf, - Path = Models::ListFilterPath.AccountID, - Value = "value", - }, - ], - ListID = "list_id", - } - ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + ], + ListID = "list_id", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.Equal(value, deserialized); } @@ -4390,18 +4409,16 @@ public void ListRecipientSerializationRoundtripWorks() [Fact] public void ListPatternRecipientSerializationRoundtripWorks() { - To value = new( - new Models::ListPatternRecipient() + To value = new Models::ListPatternRecipient() + { + Data = new Dictionary() { - Data = new Dictionary() - { - { "foo", JsonSerializer.SerializeToElement("bar") }, - }, - ListPattern = "list_pattern", - } - ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + { "foo", JsonSerializer.SerializeToElement("bar") }, + }, + ListPattern = "list_pattern", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.Equal(value, deserialized); } @@ -4409,19 +4426,17 @@ public void ListPatternRecipientSerializationRoundtripWorks() [Fact] public void SlackRecipientSerializationRoundtripWorks() { - To value = new( - new Models::SlackRecipient( - new Models::Slack( - new Models::SendToSlackChannel() - { - AccessToken = "access_token", - Channel = "channel", - } - ) + To value = new Models::SlackRecipient( + new Models::Slack( + new Models::SendToSlackChannel() + { + AccessToken = "access_token", + Channel = "channel", + } ) ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.Equal(value, deserialized); } @@ -4429,20 +4444,18 @@ public void SlackRecipientSerializationRoundtripWorks() [Fact] public void MsTeamsRecipientSerializationRoundtripWorks() { - To value = new( - new Models::MsTeamsRecipient( - new Models::MsTeams( - new Models::SendToMsTeamsUserID() - { - ServiceUrl = "service_url", - TenantID = "tenant_id", - UserID = "user_id", - } - ) + To value = new Models::MsTeamsRecipient( + new Models::MsTeams( + new Models::SendToMsTeamsUserID() + { + ServiceUrl = "service_url", + TenantID = "tenant_id", + UserID = "user_id", + } ) ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.Equal(value, deserialized); } @@ -4450,19 +4463,17 @@ public void MsTeamsRecipientSerializationRoundtripWorks() [Fact] public void PagerdutyRecipientSerializationRoundtripWorks() { - To value = new( - new Models::PagerdutyRecipient( - new Models::Pagerduty() - { - EventAction = "event_action", - RoutingKey = "routing_key", - Severity = "severity", - Source = "source", - } - ) + To value = new Models::PagerdutyRecipient( + new Models::Pagerduty() + { + EventAction = "event_action", + RoutingKey = "routing_key", + Severity = "severity", + Source = "source", + } ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.Equal(value, deserialized); } @@ -4470,26 +4481,24 @@ public void PagerdutyRecipientSerializationRoundtripWorks() [Fact] public void WebhookRecipientSerializationRoundtripWorks() { - To value = new( - new Models::WebhookRecipient( - new Models::WebhookProfile() + To value = new Models::WebhookRecipient( + new Models::WebhookProfile() + { + Url = "url", + Authentication = new() { - Url = "url", - Authentication = new() - { - Mode = Models::WebhookAuthMode.None, - Token = "token", - Password = "password", - Username = "username", - }, - Headers = new Dictionary() { { "foo", "string" } }, - Method = Models::WebhookMethod.Post, - Profile = Models::WebhookProfileType.Limited, - } - ) + Mode = Models::WebhookAuthMode.None, + Token = "token", + Password = "password", + Username = "username", + }, + Headers = new Dictionary() { { "foo", "string" } }, + Method = Models::WebhookMethod.Post, + Profile = Models::WebhookProfileType.Limited, + } ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.Equal(value, deserialized); } diff --git a/src/Courier.Tests/Models/Send/SendMessageResponseTest.cs b/src/Courier.Tests/Models/Send/SendMessageResponseTest.cs index 84149bbe..2f965d65 100644 --- a/src/Courier.Tests/Models/Send/SendMessageResponseTest.cs +++ b/src/Courier.Tests/Models/Send/SendMessageResponseTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Send; namespace Courier.Tests.Models.Send; @@ -20,8 +21,11 @@ public void SerializationRoundtrip_Works() { var model = new SendMessageResponse { RequestID = "1-65f240a0-47a6a120c8374de9bcf9f22c" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -31,8 +35,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new SendMessageResponse { RequestID = "1-65f240a0-47a6a120c8374de9bcf9f22c" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedRequestID = "1-65f240a0-47a6a120c8374de9bcf9f22c"; diff --git a/src/Courier.Tests/Models/SendDirectMessageTest.cs b/src/Courier.Tests/Models/SendDirectMessageTest.cs index b783cbcf..db4bceb6 100644 --- a/src/Courier.Tests/Models/SendDirectMessageTest.cs +++ b/src/Courier.Tests/Models/SendDirectMessageTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -20,8 +21,11 @@ public void SerializationRoundtrip_Works() { var model = new SendDirectMessage { UserID = "user_id" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -31,8 +35,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new SendDirectMessage { UserID = "user_id" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedUserID = "user_id"; diff --git a/src/Courier.Tests/Models/SendToChannelTest.cs b/src/Courier.Tests/Models/SendToChannelTest.cs index c872f7fb..4e203af1 100644 --- a/src/Courier.Tests/Models/SendToChannelTest.cs +++ b/src/Courier.Tests/Models/SendToChannelTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -20,8 +21,11 @@ public void SerializationRoundtrip_Works() { var model = new SendToChannel { ChannelID = "channel_id" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -31,8 +35,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new SendToChannel { ChannelID = "channel_id" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedChannelID = "channel_id"; diff --git a/src/Courier.Tests/Models/SendToMsTeamsChannelIDTest.cs b/src/Courier.Tests/Models/SendToMsTeamsChannelIDTest.cs index 2da112cd..6978c0af 100644 --- a/src/Courier.Tests/Models/SendToMsTeamsChannelIDTest.cs +++ b/src/Courier.Tests/Models/SendToMsTeamsChannelIDTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -34,8 +35,11 @@ public void SerializationRoundtrip_Works() TenantID = "tenant_id", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -50,8 +54,11 @@ public void FieldRoundtripThroughSerialization_Works() TenantID = "tenant_id", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedChannelID = "channel_id"; diff --git a/src/Courier.Tests/Models/SendToMsTeamsChannelNameTest.cs b/src/Courier.Tests/Models/SendToMsTeamsChannelNameTest.cs index e68e477d..adbea577 100644 --- a/src/Courier.Tests/Models/SendToMsTeamsChannelNameTest.cs +++ b/src/Courier.Tests/Models/SendToMsTeamsChannelNameTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -38,8 +39,11 @@ public void SerializationRoundtrip_Works() TenantID = "tenant_id", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -55,8 +59,11 @@ public void FieldRoundtripThroughSerialization_Works() TenantID = "tenant_id", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedChannelName = "channel_name"; diff --git a/src/Courier.Tests/Models/SendToMsTeamsConversationIDTest.cs b/src/Courier.Tests/Models/SendToMsTeamsConversationIDTest.cs index b110f475..3e88369d 100644 --- a/src/Courier.Tests/Models/SendToMsTeamsConversationIDTest.cs +++ b/src/Courier.Tests/Models/SendToMsTeamsConversationIDTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -34,8 +35,11 @@ public void SerializationRoundtrip_Works() TenantID = "tenant_id", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -50,8 +54,11 @@ public void FieldRoundtripThroughSerialization_Works() TenantID = "tenant_id", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedConversationID = "conversation_id"; diff --git a/src/Courier.Tests/Models/SendToMsTeamsEmailTest.cs b/src/Courier.Tests/Models/SendToMsTeamsEmailTest.cs index 552d90af..4b261495 100644 --- a/src/Courier.Tests/Models/SendToMsTeamsEmailTest.cs +++ b/src/Courier.Tests/Models/SendToMsTeamsEmailTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -34,8 +35,11 @@ public void SerializationRoundtrip_Works() TenantID = "tenant_id", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -50,8 +54,11 @@ public void FieldRoundtripThroughSerialization_Works() TenantID = "tenant_id", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedEmail = "email"; diff --git a/src/Courier.Tests/Models/SendToMsTeamsUserIDTest.cs b/src/Courier.Tests/Models/SendToMsTeamsUserIDTest.cs index 885acefd..ad452225 100644 --- a/src/Courier.Tests/Models/SendToMsTeamsUserIDTest.cs +++ b/src/Courier.Tests/Models/SendToMsTeamsUserIDTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -34,8 +35,11 @@ public void SerializationRoundtrip_Works() UserID = "user_id", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -50,8 +54,11 @@ public void FieldRoundtripThroughSerialization_Works() UserID = "user_id", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedServiceUrl = "service_url"; diff --git a/src/Courier.Tests/Models/SendToSlackChannelTest.cs b/src/Courier.Tests/Models/SendToSlackChannelTest.cs index 7e92ad02..55bf3517 100644 --- a/src/Courier.Tests/Models/SendToSlackChannelTest.cs +++ b/src/Courier.Tests/Models/SendToSlackChannelTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -22,8 +23,11 @@ public void SerializationRoundtrip_Works() { var model = new SendToSlackChannel { AccessToken = "access_token", Channel = "channel" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -33,8 +37,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new SendToSlackChannel { AccessToken = "access_token", Channel = "channel" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedAccessToken = "access_token"; diff --git a/src/Courier.Tests/Models/SendToSlackEmailTest.cs b/src/Courier.Tests/Models/SendToSlackEmailTest.cs index 7a327cee..4fbeeaf5 100644 --- a/src/Courier.Tests/Models/SendToSlackEmailTest.cs +++ b/src/Courier.Tests/Models/SendToSlackEmailTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -22,8 +23,11 @@ public void SerializationRoundtrip_Works() { var model = new SendToSlackEmail { AccessToken = "access_token", Email = "email" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -33,8 +37,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new SendToSlackEmail { AccessToken = "access_token", Email = "email" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedAccessToken = "access_token"; diff --git a/src/Courier.Tests/Models/SendToSlackUserIDTest.cs b/src/Courier.Tests/Models/SendToSlackUserIDTest.cs index 0ed25bec..981647c6 100644 --- a/src/Courier.Tests/Models/SendToSlackUserIDTest.cs +++ b/src/Courier.Tests/Models/SendToSlackUserIDTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -22,8 +23,11 @@ public void SerializationRoundtrip_Works() { var model = new SendToSlackUserID { AccessToken = "access_token", UserID = "user_id" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -33,8 +37,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new SendToSlackUserID { AccessToken = "access_token", UserID = "user_id" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedAccessToken = "access_token"; diff --git a/src/Courier.Tests/Models/SlackBasePropertiesTest.cs b/src/Courier.Tests/Models/SlackBasePropertiesTest.cs index 38917953..0bfdba9f 100644 --- a/src/Courier.Tests/Models/SlackBasePropertiesTest.cs +++ b/src/Courier.Tests/Models/SlackBasePropertiesTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -20,8 +21,11 @@ public void SerializationRoundtrip_Works() { var model = new SlackBaseProperties { AccessToken = "access_token" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -31,8 +35,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new SlackBaseProperties { AccessToken = "access_token" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedAccessToken = "access_token"; diff --git a/src/Courier.Tests/Models/SlackRecipientTest.cs b/src/Courier.Tests/Models/SlackRecipientTest.cs index c4655afe..8b57a3ea 100644 --- a/src/Courier.Tests/Models/SlackRecipientTest.cs +++ b/src/Courier.Tests/Models/SlackRecipientTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -30,8 +31,11 @@ public void SerializationRoundtrip_Works() Slack = new SendToSlackChannel() { AccessToken = "access_token", Channel = "channel" }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -44,8 +48,11 @@ public void FieldRoundtripThroughSerialization_Works() Slack = new SendToSlackChannel() { AccessToken = "access_token", Channel = "channel" }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Slack expectedSlack = new SendToSlackChannel() diff --git a/src/Courier.Tests/Models/SlackTest.cs b/src/Courier.Tests/Models/SlackTest.cs index 525c6a77..4cbdd397 100644 --- a/src/Courier.Tests/Models/SlackTest.cs +++ b/src/Courier.Tests/Models/SlackTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -8,36 +9,38 @@ public class SlackTest : TestBase [Fact] public void SendToSlackChannelValidationWorks() { - Slack value = new( - new SendToSlackChannel() { AccessToken = "access_token", Channel = "channel" } - ); + Slack value = new SendToSlackChannel() + { + AccessToken = "access_token", + Channel = "channel", + }; value.Validate(); } [Fact] public void SendToSlackEmailValidationWorks() { - Slack value = new(new SendToSlackEmail() { AccessToken = "access_token", Email = "email" }); + Slack value = new SendToSlackEmail() { AccessToken = "access_token", Email = "email" }; value.Validate(); } [Fact] public void SendToSlackUserIDValidationWorks() { - Slack value = new( - new SendToSlackUserID() { AccessToken = "access_token", UserID = "user_id" } - ); + Slack value = new SendToSlackUserID() { AccessToken = "access_token", UserID = "user_id" }; value.Validate(); } [Fact] public void SendToSlackChannelSerializationRoundtripWorks() { - Slack value = new( - new SendToSlackChannel() { AccessToken = "access_token", Channel = "channel" } - ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + Slack value = new SendToSlackChannel() + { + AccessToken = "access_token", + Channel = "channel", + }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.Equal(value, deserialized); } @@ -45,9 +48,9 @@ public void SendToSlackChannelSerializationRoundtripWorks() [Fact] public void SendToSlackEmailSerializationRoundtripWorks() { - Slack value = new(new SendToSlackEmail() { AccessToken = "access_token", Email = "email" }); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + Slack value = new SendToSlackEmail() { AccessToken = "access_token", Email = "email" }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.Equal(value, deserialized); } @@ -55,11 +58,9 @@ public void SendToSlackEmailSerializationRoundtripWorks() [Fact] public void SendToSlackUserIDSerializationRoundtripWorks() { - Slack value = new( - new SendToSlackUserID() { AccessToken = "access_token", UserID = "user_id" } - ); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + Slack value = new SendToSlackUserID() { AccessToken = "access_token", UserID = "user_id" }; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.Equal(value, deserialized); } diff --git a/src/Courier.Tests/Models/Tenants/BaseTemplateTenantAssociationTest.cs b/src/Courier.Tests/Models/Tenants/BaseTemplateTenantAssociationTest.cs index 2498b52b..ce8096fa 100644 --- a/src/Courier.Tests/Models/Tenants/BaseTemplateTenantAssociationTest.cs +++ b/src/Courier.Tests/Models/Tenants/BaseTemplateTenantAssociationTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Tenants; namespace Courier.Tests.Models.Tenants; @@ -42,8 +43,11 @@ public void SerializationRoundtrip_Works() Version = "version", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -60,8 +64,11 @@ public void FieldRoundtripThroughSerialization_Works() Version = "version", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedID = "id"; diff --git a/src/Courier.Tests/Models/Tenants/DefaultPreferencesTest.cs b/src/Courier.Tests/Models/Tenants/DefaultPreferencesTest.cs index 8490d179..cee5adef 100644 --- a/src/Courier.Tests/Models/Tenants/DefaultPreferencesTest.cs +++ b/src/Courier.Tests/Models/Tenants/DefaultPreferencesTest.cs @@ -61,8 +61,11 @@ public void SerializationRoundtrip_Works() ], }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -84,8 +87,11 @@ public void FieldRoundtripThroughSerialization_Works() ], }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedItems = @@ -205,8 +211,8 @@ public void SerializationRoundtrip_Works() ID = "id", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -222,8 +228,8 @@ public void FieldRoundtripThroughSerialization_Works() ID = "id", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); ApiEnum expectedStatus = Status.OptedOut; @@ -329,8 +335,11 @@ public void SerializationRoundtrip_Works() { var model = new IntersectionMember1 { ID = "id" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -340,8 +349,11 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new IntersectionMember1 { ID = "id" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedID = "id"; diff --git a/src/Courier.Tests/Models/Tenants/Preferences/Items/ItemUpdateParamsTest.cs b/src/Courier.Tests/Models/Tenants/Preferences/Items/ItemUpdateParamsTest.cs index 2b68c6f9..5d6069f5 100644 --- a/src/Courier.Tests/Models/Tenants/Preferences/Items/ItemUpdateParamsTest.cs +++ b/src/Courier.Tests/Models/Tenants/Preferences/Items/ItemUpdateParamsTest.cs @@ -114,7 +114,7 @@ public void Validation_Works(Status rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -144,7 +144,7 @@ public void SerializationRoundtrip_Works(Status rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Tenants/SubscriptionTopicNewTest.cs b/src/Courier.Tests/Models/Tenants/SubscriptionTopicNewTest.cs index b82fb4a3..ac33462a 100644 --- a/src/Courier.Tests/Models/Tenants/SubscriptionTopicNewTest.cs +++ b/src/Courier.Tests/Models/Tenants/SubscriptionTopicNewTest.cs @@ -46,8 +46,11 @@ public void SerializationRoundtrip_Works() HasCustomRouting = true, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -62,8 +65,11 @@ public void FieldRoundtripThroughSerialization_Works() HasCustomRouting = true, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedStatus = Status.OptedOut; @@ -164,7 +170,7 @@ public void Validation_Works(Status rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -194,7 +200,7 @@ public void SerializationRoundtrip_Works(Status rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Tenants/Templates/TemplateListResponseTest.cs b/src/Courier.Tests/Models/Tenants/Templates/TemplateListResponseTest.cs index 811eee7c..a03399b0 100644 --- a/src/Courier.Tests/Models/Tenants/Templates/TemplateListResponseTest.cs +++ b/src/Courier.Tests/Models/Tenants/Templates/TemplateListResponseTest.cs @@ -106,8 +106,11 @@ public void SerializationRoundtrip_Works() NextUrl = "next_url", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -142,8 +145,11 @@ public void FieldRoundtripThroughSerialization_Works() NextUrl = "next_url", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); bool expectedHasMore = true; @@ -302,7 +308,7 @@ public void Validation_Works(Type rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -330,7 +336,7 @@ public void SerializationRoundtrip_Works(Type rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -392,8 +398,8 @@ public void SerializationRoundtrip_Works() ), }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -413,8 +419,8 @@ public void FieldRoundtripThroughSerialization_Works() ), }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedID = "id"; @@ -482,8 +488,11 @@ public void SerializationRoundtrip_Works() ), }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -498,8 +507,11 @@ public void FieldRoundtripThroughSerialization_Works() ), }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Data expectedData = new( @@ -550,8 +562,8 @@ public void SerializationRoundtrip_Works() Routing = new() { Channels = ["string"], Method = Models::Method.All }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -564,8 +576,8 @@ public void FieldRoundtripThroughSerialization_Works() Routing = new() { Channels = ["string"], Method = Models::Method.All }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); Models::MessageRouting expectedRouting = new() diff --git a/src/Courier.Tests/Models/Tenants/TenantAssociationTest.cs b/src/Courier.Tests/Models/Tenants/TenantAssociationTest.cs index bf494799..0b314b09 100644 --- a/src/Courier.Tests/Models/Tenants/TenantAssociationTest.cs +++ b/src/Courier.Tests/Models/Tenants/TenantAssociationTest.cs @@ -57,8 +57,11 @@ public void SerializationRoundtrip_Works() UserID = "user_id", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -77,8 +80,11 @@ public void FieldRoundtripThroughSerialization_Works() UserID = "user_id", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedTenantID = "tenant_id"; @@ -191,7 +197,7 @@ public void Validation_Works(Type rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -219,7 +225,7 @@ public void SerializationRoundtrip_Works(Type rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Tenants/TenantListResponseTest.cs b/src/Courier.Tests/Models/Tenants/TenantListResponseTest.cs index ea8f4d5f..2faa6ed0 100644 --- a/src/Courier.Tests/Models/Tenants/TenantListResponseTest.cs +++ b/src/Courier.Tests/Models/Tenants/TenantListResponseTest.cs @@ -144,8 +144,11 @@ public void SerializationRoundtrip_Works() NextUrl = "next_url", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -193,8 +196,11 @@ public void FieldRoundtripThroughSerialization_Works() NextUrl = "next_url", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); bool expectedHasMore = true; @@ -496,7 +502,7 @@ public void Validation_Works(TenantListResponseType rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -524,7 +530,7 @@ public void SerializationRoundtrip_Works(TenantListResponseType rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Tenants/TenantListUsersResponseTest.cs b/src/Courier.Tests/Models/Tenants/TenantListUsersResponseTest.cs index 9eee41cc..b949099d 100644 --- a/src/Courier.Tests/Models/Tenants/TenantListUsersResponseTest.cs +++ b/src/Courier.Tests/Models/Tenants/TenantListUsersResponseTest.cs @@ -91,8 +91,11 @@ public void SerializationRoundtrip_Works() NextUrl = "next_url", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -122,8 +125,11 @@ public void FieldRoundtripThroughSerialization_Works() NextUrl = "next_url", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); bool expectedHasMore = true; @@ -273,7 +279,7 @@ public void Validation_Works(TenantListUsersResponseType rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -301,7 +307,7 @@ public void SerializationRoundtrip_Works(TenantListUsersResponseType rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Tenants/TenantTest.cs b/src/Courier.Tests/Models/Tenants/TenantTest.cs index 17b59750..908bddd2 100644 --- a/src/Courier.Tests/Models/Tenants/TenantTest.cs +++ b/src/Courier.Tests/Models/Tenants/TenantTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.Tenants; @@ -120,8 +121,8 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -158,8 +159,8 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedID = "id"; diff --git a/src/Courier.Tests/Models/TextStyleTest.cs b/src/Courier.Tests/Models/TextStyleTest.cs index 2aa8021b..73e48447 100644 --- a/src/Courier.Tests/Models/TextStyleTest.cs +++ b/src/Courier.Tests/Models/TextStyleTest.cs @@ -23,7 +23,7 @@ public void Validation_Works(TextStyle rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -54,7 +54,7 @@ public void SerializationRoundtrip_Works(TextStyle rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/TokenTest.cs b/src/Courier.Tests/Models/TokenTest.cs index 6f3717c8..1086f9f0 100644 --- a/src/Courier.Tests/Models/TokenTest.cs +++ b/src/Courier.Tests/Models/TokenTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -20,8 +21,8 @@ public void SerializationRoundtrip_Works() { var model = new Token { TokenValue = "token" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -31,8 +32,8 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new Token { TokenValue = "token" }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedTokenValue = "token"; diff --git a/src/Courier.Tests/Models/UserProfileFirebaseTokenTest.cs b/src/Courier.Tests/Models/UserProfileFirebaseTokenTest.cs index 0823be30..63a5b4f9 100644 --- a/src/Courier.Tests/Models/UserProfileFirebaseTokenTest.cs +++ b/src/Courier.Tests/Models/UserProfileFirebaseTokenTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -8,7 +9,7 @@ public class UserProfileFirebaseTokenTest : TestBase [Fact] public void StringValidationWorks() { - UserProfileFirebaseToken value = new("string"); + UserProfileFirebaseToken value = "string"; value.Validate(); } @@ -22,9 +23,12 @@ public void StringsValidationWorks() [Fact] public void StringSerializationRoundtripWorks() { - UserProfileFirebaseToken value = new("string"); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + UserProfileFirebaseToken value = "string"; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.Equal(value, deserialized); } @@ -33,8 +37,11 @@ public void StringSerializationRoundtripWorks() public void StringsSerializationRoundtripWorks() { UserProfileFirebaseToken value = new(["string"]); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.Equal(value, deserialized); } diff --git a/src/Courier.Tests/Models/UserProfileTest.cs b/src/Courier.Tests/Models/UserProfileTest.cs index e56259d6..002010fe 100644 --- a/src/Courier.Tests/Models/UserProfileTest.cs +++ b/src/Courier.Tests/Models/UserProfileTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -210,8 +211,11 @@ public void SerializationRoundtrip_Works() Zoneinfo = "zoneinfo", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -270,8 +274,11 @@ public void FieldRoundtripThroughSerialization_Works() Zoneinfo = "zoneinfo", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Address expectedAddress = new() @@ -691,8 +698,8 @@ public void SerializationRoundtrip_Works() StreetAddress = "street_address", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize
(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize
(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -710,8 +717,11 @@ public void FieldRoundtripThroughSerialization_Works() StreetAddress = "street_address", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize
(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize
( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedCountry = "country"; diff --git a/src/Courier.Tests/Models/UserRecipientTest.cs b/src/Courier.Tests/Models/UserRecipientTest.cs index 05ec8f51..696101dd 100644 --- a/src/Courier.Tests/Models/UserRecipientTest.cs +++ b/src/Courier.Tests/Models/UserRecipientTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -166,8 +167,11 @@ public void SerializationRoundtrip_Works() UserID = "user_id", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -221,8 +225,11 @@ public void FieldRoundtripThroughSerialization_Works() UserID = "user_id", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedAccountID = "account_id"; @@ -550,8 +557,11 @@ public void SerializationRoundtrip_Works() TemplateID = "templateId", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -590,8 +600,11 @@ public void FieldRoundtripThroughSerialization_Works() TemplateID = "templateId", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); Dictionary expectedNotifications = new() diff --git a/src/Courier.Tests/Models/Users/Preferences/PreferenceRetrieveResponseTest.cs b/src/Courier.Tests/Models/Users/Preferences/PreferenceRetrieveResponseTest.cs index 7565c486..3e5f41ef 100644 --- a/src/Courier.Tests/Models/Users/Preferences/PreferenceRetrieveResponseTest.cs +++ b/src/Courier.Tests/Models/Users/Preferences/PreferenceRetrieveResponseTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.Users.Preferences; @@ -69,8 +70,11 @@ public void SerializationRoundtrip_Works() Paging = new() { More = true, Cursor = "cursor" }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -95,8 +99,11 @@ public void FieldRoundtripThroughSerialization_Works() Paging = new() { More = true, Cursor = "cursor" }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedItems = diff --git a/src/Courier.Tests/Models/Users/Preferences/PreferenceRetrieveTopicResponseTest.cs b/src/Courier.Tests/Models/Users/Preferences/PreferenceRetrieveTopicResponseTest.cs index e39bf001..25d47c5d 100644 --- a/src/Courier.Tests/Models/Users/Preferences/PreferenceRetrieveTopicResponseTest.cs +++ b/src/Courier.Tests/Models/Users/Preferences/PreferenceRetrieveTopicResponseTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; using Courier.Models.Users.Preferences; @@ -51,8 +52,11 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -73,8 +77,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); TopicPreference expectedTopic = new() diff --git a/src/Courier.Tests/Models/Users/Preferences/PreferenceUpdateOrCreateTopicParamsTest.cs b/src/Courier.Tests/Models/Users/Preferences/PreferenceUpdateOrCreateTopicParamsTest.cs index c6b2b1c2..70a76125 100644 --- a/src/Courier.Tests/Models/Users/Preferences/PreferenceUpdateOrCreateTopicParamsTest.cs +++ b/src/Courier.Tests/Models/Users/Preferences/PreferenceUpdateOrCreateTopicParamsTest.cs @@ -147,8 +147,8 @@ public void SerializationRoundtrip_Works() HasCustomRouting = true, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -163,8 +163,8 @@ public void FieldRoundtripThroughSerialization_Works() HasCustomRouting = true, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); ApiEnum expectedStatus = PreferenceStatus.OptedIn; diff --git a/src/Courier.Tests/Models/Users/Preferences/PreferenceUpdateOrCreateTopicResponseTest.cs b/src/Courier.Tests/Models/Users/Preferences/PreferenceUpdateOrCreateTopicResponseTest.cs index 9473f0ff..d015eb0c 100644 --- a/src/Courier.Tests/Models/Users/Preferences/PreferenceUpdateOrCreateTopicResponseTest.cs +++ b/src/Courier.Tests/Models/Users/Preferences/PreferenceUpdateOrCreateTopicResponseTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models.Users.Preferences; namespace Courier.Tests.Models.Users.Preferences; @@ -20,8 +21,11 @@ public void SerializationRoundtrip_Works() { var model = new PreferenceUpdateOrCreateTopicResponse { Message = "success" }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -31,9 +35,10 @@ public void FieldRoundtripThroughSerialization_Works() { var model = new PreferenceUpdateOrCreateTopicResponse { Message = "success" }; - string element = JsonSerializer.Serialize(model); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); var deserialized = JsonSerializer.Deserialize( - element + element, + ModelBase.SerializerOptions ); Assert.NotNull(deserialized); diff --git a/src/Courier.Tests/Models/Users/Preferences/TopicPreferenceTest.cs b/src/Courier.Tests/Models/Users/Preferences/TopicPreferenceTest.cs index 547ebd65..a755bda2 100644 --- a/src/Courier.Tests/Models/Users/Preferences/TopicPreferenceTest.cs +++ b/src/Courier.Tests/Models/Users/Preferences/TopicPreferenceTest.cs @@ -57,8 +57,11 @@ public void SerializationRoundtrip_Works() HasCustomRouting = true, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -76,8 +79,11 @@ public void FieldRoundtripThroughSerialization_Works() HasCustomRouting = true, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedDefaultStatus = PreferenceStatus.OptedIn; diff --git a/src/Courier.Tests/Models/Users/Tenants/TenantListResponseTest.cs b/src/Courier.Tests/Models/Users/Tenants/TenantListResponseTest.cs index 76f89a79..322777a4 100644 --- a/src/Courier.Tests/Models/Users/Tenants/TenantListResponseTest.cs +++ b/src/Courier.Tests/Models/Users/Tenants/TenantListResponseTest.cs @@ -91,8 +91,11 @@ public void SerializationRoundtrip_Works() NextUrl = "next_url", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -122,8 +125,11 @@ public void FieldRoundtripThroughSerialization_Works() NextUrl = "next_url", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); bool expectedHasMore = true; @@ -272,7 +278,7 @@ public void Validation_Works(Type rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -300,7 +306,7 @@ public void SerializationRoundtrip_Works(Type rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Users/Tokens/TokenAddSingleParamsTest.cs b/src/Courier.Tests/Models/Users/Tokens/TokenAddSingleParamsTest.cs index 16832424..7b5feec9 100644 --- a/src/Courier.Tests/Models/Users/Tokens/TokenAddSingleParamsTest.cs +++ b/src/Courier.Tests/Models/Users/Tokens/TokenAddSingleParamsTest.cs @@ -217,7 +217,7 @@ public void Validation_Works(ProviderKey rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -248,7 +248,7 @@ public void SerializationRoundtrip_Works(ProviderKey rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -304,8 +304,8 @@ public void SerializationRoundtrip_Works() Platform = "platform", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -323,8 +323,8 @@ public void FieldRoundtripThroughSerialization_Works() Platform = "platform", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedAdID = "ad_id"; @@ -434,23 +434,26 @@ public class ExpiryDateTest : TestBase [Fact] public void StringValidationWorks() { - ExpiryDate value = new("string"); + ExpiryDate value = "string"; value.Validate(); } [Fact] public void BoolValidationWorks() { - ExpiryDate value = new(true); + ExpiryDate value = true; value.Validate(); } [Fact] public void StringSerializationRoundtripWorks() { - ExpiryDate value = new("string"); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + ExpiryDate value = "string"; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.Equal(value, deserialized); } @@ -458,9 +461,12 @@ public void StringSerializationRoundtripWorks() [Fact] public void BoolSerializationRoundtripWorks() { - ExpiryDate value = new(true); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + ExpiryDate value = true; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.Equal(value, deserialized); } @@ -501,8 +507,8 @@ public void SerializationRoundtrip_Works() OsVersion = "os_version", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -518,8 +524,11 @@ public void FieldRoundtripThroughSerialization_Works() OsVersion = "os_version", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedIP = "ip"; diff --git a/src/Courier.Tests/Models/Users/Tokens/TokenListResponseTest.cs b/src/Courier.Tests/Models/Users/Tokens/TokenListResponseTest.cs index 324f7d41..5f435407 100644 --- a/src/Courier.Tests/Models/Users/Tokens/TokenListResponseTest.cs +++ b/src/Courier.Tests/Models/Users/Tokens/TokenListResponseTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models.Users.Tokens; namespace Courier.Tests.Models.Users.Tokens; @@ -106,8 +107,11 @@ public void SerializationRoundtrip_Works() ], }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -145,8 +149,11 @@ public void FieldRoundtripThroughSerialization_Works() ], }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); List expectedTokens = diff --git a/src/Courier.Tests/Models/Users/Tokens/TokenRetrieveResponseTest.cs b/src/Courier.Tests/Models/Users/Tokens/TokenRetrieveResponseTest.cs index 581aae11..feb17dc7 100644 --- a/src/Courier.Tests/Models/Users/Tokens/TokenRetrieveResponseTest.cs +++ b/src/Courier.Tests/Models/Users/Tokens/TokenRetrieveResponseTest.cs @@ -100,8 +100,11 @@ public void SerializationRoundtrip_Works() StatusReason = "status_reason", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -135,8 +138,11 @@ public void FieldRoundtripThroughSerialization_Works() StatusReason = "status_reason", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedToken = "token"; @@ -448,8 +454,11 @@ public void SerializationRoundtrip_Works() StatusReason = "status_reason", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -463,8 +472,11 @@ public void FieldRoundtripThroughSerialization_Works() StatusReason = "status_reason", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedStatus = Status.Active; @@ -543,7 +555,7 @@ public void Validation_Works(Status rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -574,7 +586,7 @@ public void SerializationRoundtrip_Works(Status rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/Users/Tokens/TokenUpdateParamsTest.cs b/src/Courier.Tests/Models/Users/Tokens/TokenUpdateParamsTest.cs index 360666cd..debfa6f6 100644 --- a/src/Courier.Tests/Models/Users/Tokens/TokenUpdateParamsTest.cs +++ b/src/Courier.Tests/Models/Users/Tokens/TokenUpdateParamsTest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models.Users.Tokens; namespace Courier.Tests.Models.Users.Tokens; @@ -101,8 +102,8 @@ public void SerializationRoundtrip_Works() Value = "value", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -117,8 +118,8 @@ public void FieldRoundtripThroughSerialization_Works() Value = "value", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedOp = "op"; diff --git a/src/Courier.Tests/Models/Users/Tokens/UserTokenTest.cs b/src/Courier.Tests/Models/Users/Tokens/UserTokenTest.cs index 59ac55fd..85c58471 100644 --- a/src/Courier.Tests/Models/Users/Tokens/UserTokenTest.cs +++ b/src/Courier.Tests/Models/Users/Tokens/UserTokenTest.cs @@ -92,8 +92,8 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -125,8 +125,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedToken = "token"; @@ -403,7 +406,7 @@ public void Validation_Works(UserTokenProviderKey rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -434,7 +437,7 @@ public void SerializationRoundtrip_Works(UserTokenProviderKey rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); @@ -490,8 +493,11 @@ public void SerializationRoundtrip_Works() Platform = "platform", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -509,8 +515,11 @@ public void FieldRoundtripThroughSerialization_Works() Platform = "platform", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedAdID = "ad_id"; @@ -620,23 +629,26 @@ public class UserTokenExpiryDateTest : TestBase [Fact] public void StringValidationWorks() { - UserTokenExpiryDate value = new("string"); + UserTokenExpiryDate value = "string"; value.Validate(); } [Fact] public void BoolValidationWorks() { - UserTokenExpiryDate value = new(true); + UserTokenExpiryDate value = true; value.Validate(); } [Fact] public void StringSerializationRoundtripWorks() { - UserTokenExpiryDate value = new("string"); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + UserTokenExpiryDate value = "string"; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.Equal(value, deserialized); } @@ -644,9 +656,12 @@ public void StringSerializationRoundtripWorks() [Fact] public void BoolSerializationRoundtripWorks() { - UserTokenExpiryDate value = new(true); - string element = JsonSerializer.Serialize(value); - var deserialized = JsonSerializer.Deserialize(element); + UserTokenExpiryDate value = true; + string element = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.Equal(value, deserialized); } @@ -687,8 +702,11 @@ public void SerializationRoundtrip_Works() OsVersion = "os_version", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -704,8 +722,11 @@ public void FieldRoundtripThroughSerialization_Works() OsVersion = "os_version", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedIP = "ip"; diff --git a/src/Courier.Tests/Models/UtmTest.cs b/src/Courier.Tests/Models/UtmTest.cs index c85fb4f8..8680d39e 100644 --- a/src/Courier.Tests/Models/UtmTest.cs +++ b/src/Courier.Tests/Models/UtmTest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -42,8 +43,8 @@ public void SerializationRoundtrip_Works() Term = "term", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(json, ModelBase.SerializerOptions); Assert.Equal(model, deserialized); } @@ -60,8 +61,8 @@ public void FieldRoundtripThroughSerialization_Works() Term = "term", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); Assert.NotNull(deserialized); string expectedCampaign = "campaign"; diff --git a/src/Courier.Tests/Models/WebhookAuthModeTest.cs b/src/Courier.Tests/Models/WebhookAuthModeTest.cs index 6b8740a0..8f4a84e4 100644 --- a/src/Courier.Tests/Models/WebhookAuthModeTest.cs +++ b/src/Courier.Tests/Models/WebhookAuthModeTest.cs @@ -22,7 +22,7 @@ public void Validation_Works(WebhookAuthMode rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -52,7 +52,7 @@ public void SerializationRoundtrip_Works(WebhookAuthMode rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/WebhookAuthenticationTest.cs b/src/Courier.Tests/Models/WebhookAuthenticationTest.cs index fe6cebca..6229ffa0 100644 --- a/src/Courier.Tests/Models/WebhookAuthenticationTest.cs +++ b/src/Courier.Tests/Models/WebhookAuthenticationTest.cs @@ -39,8 +39,11 @@ public void SerializationRoundtrip_Works() Username = "username", }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -56,8 +59,11 @@ public void FieldRoundtripThroughSerialization_Works() Username = "username", }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); ApiEnum expectedMode = WebhookAuthMode.None; diff --git a/src/Courier.Tests/Models/WebhookMethodTest.cs b/src/Courier.Tests/Models/WebhookMethodTest.cs index 7c4160d4..57e0afd7 100644 --- a/src/Courier.Tests/Models/WebhookMethodTest.cs +++ b/src/Courier.Tests/Models/WebhookMethodTest.cs @@ -21,7 +21,7 @@ public void Validation_Works(WebhookMethod rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -50,7 +50,7 @@ public void SerializationRoundtrip_Works(WebhookMethod rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/WebhookProfileTest.cs b/src/Courier.Tests/Models/WebhookProfileTest.cs index 2b4e01bb..9ebb3695 100644 --- a/src/Courier.Tests/Models/WebhookProfileTest.cs +++ b/src/Courier.Tests/Models/WebhookProfileTest.cs @@ -69,8 +69,11 @@ public void SerializationRoundtrip_Works() Profile = WebhookProfileType.Limited, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -93,8 +96,11 @@ public void FieldRoundtripThroughSerialization_Works() Profile = WebhookProfileType.Limited, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); string expectedUrl = "url"; diff --git a/src/Courier.Tests/Models/WebhookProfileTypeTest.cs b/src/Courier.Tests/Models/WebhookProfileTypeTest.cs index bf2e99e0..7840cc2a 100644 --- a/src/Courier.Tests/Models/WebhookProfileTypeTest.cs +++ b/src/Courier.Tests/Models/WebhookProfileTypeTest.cs @@ -21,7 +21,7 @@ public void Validation_Works(WebhookProfileType rawValue) public void InvalidEnumValidationThrows_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); @@ -50,7 +50,7 @@ public void SerializationRoundtrip_Works(WebhookProfileType rawValue) public void InvalidEnumSerializationRoundtrip_Works() { var value = JsonSerializer.Deserialize>( - JsonSerializer.Deserialize("\"invalid value\""), + JsonSerializer.SerializeToElement("invalid value"), ModelBase.SerializerOptions ); string json = JsonSerializer.Serialize(value, ModelBase.SerializerOptions); diff --git a/src/Courier.Tests/Models/WebhookRecipientTest.cs b/src/Courier.Tests/Models/WebhookRecipientTest.cs index 3626b89e..2e67f591 100644 --- a/src/Courier.Tests/Models/WebhookRecipientTest.cs +++ b/src/Courier.Tests/Models/WebhookRecipientTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using Courier.Core; using Courier.Models; namespace Courier.Tests.Models; @@ -66,8 +67,11 @@ public void SerializationRoundtrip_Works() }, }; - string json = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(json); + string json = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + json, + ModelBase.SerializerOptions + ); Assert.Equal(model, deserialized); } @@ -93,8 +97,11 @@ public void FieldRoundtripThroughSerialization_Works() }, }; - string element = JsonSerializer.Serialize(model); - var deserialized = JsonSerializer.Deserialize(element); + string element = JsonSerializer.Serialize(model, ModelBase.SerializerOptions); + var deserialized = JsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); Assert.NotNull(deserialized); WebhookProfile expectedWebhook = new() diff --git a/src/Courier.Tests/Services/BulkServiceTest.cs b/src/Courier.Tests/Services/BulkServiceTest.cs index 933b2b66..0264aa61 100644 --- a/src/Courier.Tests/Services/BulkServiceTest.cs +++ b/src/Courier.Tests/Services/BulkServiceTest.cs @@ -130,7 +130,7 @@ public async Task CreateJob_Works() { { "foo", JsonSerializer.SerializeToElement("bar") }, }, - Locale = new Dictionary>() + Locale = new Dictionary>() { { "foo", diff --git a/src/Courier/Core/ApiEnum.cs b/src/Courier/Core/ApiEnum.cs index c4429d7a..2f4f844e 100644 --- a/src/Courier/Core/ApiEnum.cs +++ b/src/Courier/Core/ApiEnum.cs @@ -36,11 +36,21 @@ public record class ApiEnum(JsonElement Json) /// to access the raw value. /// /// - public TRaw Raw() => - JsonSerializer.Deserialize(this.Json, ModelBase.SerializerOptions) - ?? throw new CourierInvalidDataException( - string.Format("{0} cannot be null", nameof(this.Json)) - ); + public TRaw Raw() + { + try + { + return JsonSerializer.Deserialize(this.Json, ModelBase.SerializerOptions) + ?? throw new CourierInvalidDataException($"{nameof(this.Json)} cannot be null"); + } + catch (JsonException e) + { + throw new CourierInvalidDataException( + $"{this.Json} must be of type {typeof(TRaw).FullName}", + e + ); + } + } /// /// Returns an enum member corresponding to this instance's value, or (TEnum)(-1) if the @@ -48,8 +58,21 @@ public TRaw Raw() => /// /// Use to access the raw value.. /// - public TEnum Value() => - JsonSerializer.Deserialize(this.Json, ModelBase.SerializerOptions); + public TEnum Value() + { + try + { + return JsonSerializer.Deserialize(this.Json, ModelBase.SerializerOptions) + ?? throw new CourierInvalidDataException($"{nameof(this.Json)} cannot be null"); + } + catch (JsonException e) + { + throw new CourierInvalidDataException( + $"{this.Json} must be of type {typeof(TRaw).FullName}", + e + ); + } + } /// /// Verifies that this instance's raw value is a member of . diff --git a/src/Courier/Core/FreezableDictionary.cs b/src/Courier/Core/FreezableDictionary.cs deleted file mode 100644 index 0cbfee01..00000000 --- a/src/Courier/Core/FreezableDictionary.cs +++ /dev/null @@ -1,166 +0,0 @@ -using System; -using System.Collections.Frozen; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using Collections = System.Collections; - -namespace Courier.Core; - -/// -/// A dictionary that can be mutated and then frozen once no more mutations are expected. -/// -/// This is useful for allowing a dictionary to be modified by a class's init -/// properties, but then preventing it from being modified afterwards. -/// -class FreezableDictionary : IDictionary - where K : notnull -{ - IDictionary _dictionary = new Dictionary(); - - Dictionary _mutableDictionary - { - get - { - if (_dictionary is Dictionary dict) - { - return dict; - } - - throw new InvalidOperationException("Can't mutate after freezing."); - } - } - - public FreezableDictionary() { } - - public FreezableDictionary(IReadOnlyDictionary dictionary) - { - _dictionary = Enumerable.ToDictionary(dictionary, e => e.Key, e => e.Value); - } - - public FreezableDictionary(FrozenDictionary frozen) - { - _dictionary = frozen; - } - - /// - /// Freezes this dictionary and returns a readonly view of it. - /// - /// Future calls to mutating methods on this class will throw - /// . - /// - public IReadOnlyDictionary Freeze() - { - if (_dictionary is FrozenDictionary dict) - { - return dict; - } - - var dictionary = FrozenDictionary.ToFrozenDictionary(_dictionary); - _dictionary = dictionary; - - return dictionary; - } - - /// - public V this[K key] - { - get => _dictionary[key]; - set => _mutableDictionary[key] = value; - } - - /// - public ICollection Keys - { - get { return _dictionary.Keys; } - } - - /// - public ICollection Values - { - get { return _dictionary.Values; } - } - - /// - public int Count - { - get { return _dictionary.Count; } - } - - /// - public bool IsReadOnly - { - get { return _dictionary.IsReadOnly; } - } - - /// - public void Add(K key, V value) - { - _mutableDictionary.Add(key, value); - } - - /// - public void Add(KeyValuePair item) - { - _mutableDictionary.Add(item.Key, item.Value); - } - - /// - public void Clear() - { - _mutableDictionary.Clear(); - } - - /// - public bool Contains(KeyValuePair item) - { - return _dictionary.Contains(item); - } - - /// - public bool ContainsKey(K key) - { - return _dictionary.ContainsKey(key); - } - - /// - public void CopyTo(KeyValuePair[] array, int arrayIndex) - { - _dictionary.CopyTo(array, arrayIndex); - } - - /// - public IEnumerator> GetEnumerator() - { - return _dictionary.GetEnumerator(); - } - - /// - public bool Remove(K key) - { - return _mutableDictionary.Remove(key); - } - - /// - public bool Remove(KeyValuePair item) - { - return _mutableDictionary.Remove(item.Key); - } - - /// - public bool TryGetValue(K key, -#if NET - [MaybeNullWhen(false)] -#endif - - out V value) - { - return _dictionary.TryGetValue(key, out value); - } - - /// - Collections::IEnumerator Collections::IEnumerable.GetEnumerator() - { - return _dictionary.GetEnumerator(); - } -} diff --git a/src/Courier/Core/FrozenDictionaryConverterFactory.cs b/src/Courier/Core/FrozenDictionaryConverterFactory.cs new file mode 100644 index 00000000..a0d8dbee --- /dev/null +++ b/src/Courier/Core/FrozenDictionaryConverterFactory.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Frozen; +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Courier.Core; + +sealed class FrozenDictionaryConverterFactory : JsonConverterFactory +{ + public override bool CanConvert(Type typeToConvert) + { + if (!typeToConvert.IsGenericType) + { + return false; + } + + var genericTypeDefinition = typeToConvert.GetGenericTypeDefinition(); + return genericTypeDefinition == typeof(FrozenDictionary<,>); + } + + public override JsonConverter? CreateConverter( + Type typeToConvert, + JsonSerializerOptions options + ) + { + var keyType = typeToConvert.GetGenericArguments()[0]; + var valueType = typeToConvert.GetGenericArguments()[1]; + + var converterType = typeof(FrozenDictionaryConverter<,>).MakeGenericType( + keyType, + valueType + ); + return (JsonConverter?)Activator.CreateInstance(converterType); + } +} + +sealed class FrozenDictionaryConverter : JsonConverter> + where TKey : notnull +{ + public override FrozenDictionary? Read( + ref Utf8JsonReader reader, + Type typeToConvert, + JsonSerializerOptions options + ) + { + var dictionary = JsonSerializer.Deserialize>(ref reader, options); + if (dictionary == null) + { + return null; + } + + return FrozenDictionary.ToFrozenDictionary(dictionary); + } + + public override void Write( + Utf8JsonWriter writer, + FrozenDictionary value, + JsonSerializerOptions options + ) + { + JsonSerializer.Serialize(writer, value, typeof(IReadOnlyDictionary), options); + } +} diff --git a/src/Courier/Core/HttpResponse.cs b/src/Courier/Core/HttpResponse.cs index b3521e19..8639f657 100644 --- a/src/Courier/Core/HttpResponse.cs +++ b/src/Courier/Core/HttpResponse.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.IO; +using System.Net; using System.Net.Http; using System.Text.Json; using System.Threading.Tasks; @@ -12,10 +13,32 @@ namespace Courier.Core; public class HttpResponse : IDisposable { - public required HttpResponseMessage Message { get; init; } + public required HttpResponseMessage RawMessage { get; init; } + + public IEnumerable>> Headers + { + get { return RawMessage.Headers; } + } + + public bool IsSuccessStatusCode + { + get { return RawMessage.IsSuccessStatusCode; } + } + + public HttpStatusCode StatusCode + { + get { return RawMessage.StatusCode; } + } public Threading::CancellationToken CancellationToken { get; init; } = default; + public IEnumerable GetHeaderValues(string name) => RawMessage.Headers.GetValues(name); + + public bool TryGetHeaderValues( + string name, + [NotNullWhen(true)] out IEnumerable? values + ) => RawMessage.Headers.TryGetValues(name, out values); + public async Task Deserialize(Threading::CancellationToken cancellationToken = default) { using var cts = Threading::CancellationTokenSource.CreateLinkedTokenSource( @@ -45,7 +68,7 @@ public async Task ReadAsStream(Threading::CancellationToken cancellation this.CancellationToken, cancellationToken ); - return await Message.Content.ReadAsStreamAsync( + return await RawMessage.Content.ReadAsStreamAsync( #if NET cts.Token #endif @@ -58,7 +81,7 @@ public async Task ReadAsString(Threading::CancellationToken cancellation this.CancellationToken, cancellationToken ); - return await Message.Content.ReadAsStringAsync( + return await RawMessage.Content.ReadAsStringAsync( #if NET cts.Token #endif @@ -67,7 +90,7 @@ public async Task ReadAsString(Threading::CancellationToken cancellation public void Dispose() { - this.Message.Dispose(); + this.RawMessage.Dispose(); GC.SuppressFinalize(this); } } @@ -88,7 +111,7 @@ internal HttpResponse( ) : this(deserialize) { - this.Message = response.Message; + this.RawMessage = response.RawMessage; this.CancellationToken = response.CancellationToken; } @@ -120,7 +143,7 @@ internal StreamingHttpResponse( ) : this(enumerate) { - this.Message = response.Message; + this.RawMessage = response.RawMessage; this.CancellationToken = response.CancellationToken; } diff --git a/src/Courier/Core/JsonDictionary.cs b/src/Courier/Core/JsonDictionary.cs new file mode 100644 index 00000000..5ed9430e --- /dev/null +++ b/src/Courier/Core/JsonDictionary.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Frozen; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using Courier.Exceptions; + +namespace Courier.Core; + +/// +/// A dictionary that holds JSON data. +/// +/// It can be mutated and then frozen once no more mutations are expected. This +/// is useful for allowing the dictionary to be modified by a class's init +/// properties, but then preventing it from being modified afterwards. +/// +/// It also caches data deserialization for performance. +/// +sealed class JsonDictionary +{ + IDictionary _rawData; + + readonly ConcurrentDictionary _deserializedData; + + Dictionary MutableRawData + { + get + { + if (_rawData is Dictionary dictionary) + { + return dictionary; + } + throw new InvalidOperationException("Can't mutate after freezing."); + } + } + + public JsonDictionary() + { + _rawData = new Dictionary(); + _deserializedData = []; + } + + public JsonDictionary(IReadOnlyDictionary dictionary) + { + _rawData = Enumerable.ToDictionary(dictionary, (e) => e.Key, (e) => e.Value); + _deserializedData = []; + } + + public JsonDictionary(FrozenDictionary dictionary) + { + _rawData = dictionary; + _deserializedData = []; + } + + public JsonDictionary(JsonDictionary dictionary) + { + _rawData = Enumerable.ToDictionary(dictionary._rawData, (e) => e.Key, (e) => e.Value); + _deserializedData = new(dictionary._deserializedData); + } + + /// + /// Freezes this dictionary and returns a readonly view of it. + /// + /// Future calls to mutating methods on this class will throw + /// . + /// + public IReadOnlyDictionary Freeze() + { + if (_rawData is FrozenDictionary dictionary) + { + return dictionary; + } + + var frozenRawData = FrozenDictionary.ToFrozenDictionary(_rawData); + _rawData = frozenRawData; + return frozenRawData; + } + + public void Set(string key, T value) + { + MutableRawData[key] = JsonSerializer.SerializeToElement(value, ModelBase.SerializerOptions); + _deserializedData[key] = value; + } + + public T GetNotNullClass(string key) + where T : class + { + if (_deserializedData.TryGetValue(key, out var cached) && cached is T t) + { + return t; + } + if (!_rawData.TryGetValue(key, out JsonElement element)) + { + throw new CourierInvalidDataException($"'{key}' cannot be absent"); + } + T deserialized; + try + { + deserialized = + JsonSerializer.Deserialize(element, ModelBase.SerializerOptions) + ?? throw new CourierInvalidDataException($"'{key}' cannot be null"); + } + catch (JsonException e) + { + throw new CourierInvalidDataException( + $"'{key}' must be of type {typeof(T).FullName}", + e + ); + } + _deserializedData[key] = deserialized; + return deserialized; + } + + public T GetNotNullStruct(string key) + where T : struct + { + if (_deserializedData.TryGetValue(key, out var cached) && cached is T t) + { + return t; + } + if (!_rawData.TryGetValue(key, out JsonElement element)) + { + throw new CourierInvalidDataException($"'{key}' cannot be absent"); + } + T deserialized; + try + { + deserialized = + JsonSerializer.Deserialize(element, ModelBase.SerializerOptions) + ?? throw new CourierInvalidDataException($"'{key}' cannot be null"); + } + catch (JsonException e) + { + throw new CourierInvalidDataException( + $"'{key}' must be of type {typeof(T).FullName}", + e + ); + } + _deserializedData[key] = deserialized; + return deserialized; + } + + public T? GetNullableClass(string key) + where T : class + { + if (_deserializedData.TryGetValue(key, out var cached) && (cached == null || cached is T)) + { + return (T?)cached; + } + if (!_rawData.TryGetValue(key, out JsonElement element)) + { + _deserializedData[key] = null; + return null; + } + T? deserialized; + try + { + deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); + } + catch (JsonException e) + { + throw new CourierInvalidDataException( + $"'{key}' must be of type {typeof(T).FullName}", + e + ); + } + _deserializedData[key] = deserialized; + return deserialized; + } + + public T? GetNullableStruct(string key) + where T : struct + { + if (_deserializedData.TryGetValue(key, out var cached) && (cached == null || cached is T)) + { + return (T?)cached; + } + if (!_rawData.TryGetValue(key, out JsonElement element)) + { + _deserializedData[key] = null; + return null; + } + T? deserialized; + try + { + deserialized = JsonSerializer.Deserialize(element, ModelBase.SerializerOptions); + } + catch (JsonException e) + { + throw new CourierInvalidDataException( + $"'{key}' must be of type {typeof(T).FullName}", + e + ); + } + _deserializedData[key] = deserialized; + return deserialized; + } + + public override string ToString() => + JsonSerializer.Serialize(this._rawData, ModelBase.ToStringSerializerOptions); + + public override bool Equals(object? obj) + { + if (obj is not JsonDictionary other || _rawData.Count != other._rawData.Count) + { + return false; + } + + foreach (var item in _rawData) + { + if (!other._rawData.TryGetValue(item.Key, out var otherValue)) + { + return false; + } + + if (!JsonElement.DeepEquals(item.Value, otherValue)) + { + return false; + } + } + + return true; + } + + public override int GetHashCode() + { + return 0; + } +} diff --git a/src/Courier/Core/JsonModel.cs b/src/Courier/Core/JsonModel.cs index 42f2c4df..37be9979 100644 --- a/src/Courier/Core/JsonModel.cs +++ b/src/Courier/Core/JsonModel.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Text.Json; -using Courier.Exceptions; namespace Courier.Core; @@ -11,13 +10,7 @@ namespace Courier.Core; /// public abstract record class JsonModel : ModelBase { - private protected FreezableDictionary _rawData = []; - - protected JsonModel(JsonModel jsonModel) - : base(jsonModel) - { - this._rawData = [.. jsonModel._rawData]; - } + private protected JsonDictionary _rawData = new(); /// /// The backing JSON properties of the instance. @@ -27,139 +20,25 @@ public IReadOnlyDictionary RawData get { return this._rawData.Freeze(); } } - internal static void Set(IDictionary dictionary, string key, T value) - { - dictionary[key] = JsonSerializer.SerializeToElement(value, SerializerOptions); - } - - internal static T GetNotNullClass( - IReadOnlyDictionary dictionary, - string key - ) - where T : class - { - if (!dictionary.TryGetValue(key, out var element)) - { - throw new CourierInvalidDataException($"'{key}' cannot be absent"); - } - - try - { - return JsonSerializer.Deserialize(element, SerializerOptions) - ?? throw new CourierInvalidDataException($"'{key}' cannot be null"); - } - catch (JsonException e) - { - throw new CourierInvalidDataException( - $"'{key}' must be of type {typeof(T).FullName}", - e - ); - } - } - - internal static T GetNotNullStruct( - IReadOnlyDictionary dictionary, - string key - ) - where T : struct - { - if (!dictionary.TryGetValue(key, out var element)) - { - throw new CourierInvalidDataException($"'{key}' cannot be absent"); - } - - try - { - return JsonSerializer.Deserialize(element, SerializerOptions) - ?? throw new CourierInvalidDataException($"'{key}' cannot be null"); - } - catch (JsonException e) - { - throw new CourierInvalidDataException( - $"'{key}' must be of type {typeof(T).FullName}", - e - ); - } - } - - internal static T? GetNullableClass( - IReadOnlyDictionary dictionary, - string key - ) - where T : class - { - if (!dictionary.TryGetValue(key, out var element)) - { - return null; - } - - try - { - return JsonSerializer.Deserialize(element, SerializerOptions); - } - catch (JsonException e) - { - throw new CourierInvalidDataException( - $"'{key}' must be of type {typeof(T).FullName}", - e - ); - } - } - - internal static T? GetNullableStruct( - IReadOnlyDictionary dictionary, - string key - ) - where T : struct + protected JsonModel(JsonModel jsonModel) + : base(jsonModel) { - if (!dictionary.TryGetValue(key, out var element)) - { - return null; - } - - try - { - return JsonSerializer.Deserialize(element, SerializerOptions); - } - catch (JsonException e) - { - throw new CourierInvalidDataException( - $"'{key}' must be of type {typeof(T).FullName}", - e - ); - } + this._rawData = new(jsonModel._rawData); } - public sealed override string ToString() => - JsonSerializer.Serialize(this.RawData, ModelBase.ToStringSerializerOptions); + public sealed override string ToString() => this._rawData.ToString(); public virtual bool Equals(JsonModel? other) { - if (other == null || this.RawData.Count != other.RawData.Count) + if (other == null) { return false; } - foreach (var item in this.RawData) - { - if (!other.RawData.TryGetValue(item.Key, out var otherValue)) - { - return false; - } - - if (!JsonElement.DeepEquals(item.Value, otherValue)) - { - return false; - } - } - - return true; + return this._rawData.Equals(other._rawData); } - public override int GetHashCode() - { - return 0; - } + public override int GetHashCode() => this._rawData.GetHashCode(); } /// diff --git a/src/Courier/Core/ModelBase.cs b/src/Courier/Core/ModelBase.cs index 463eec04..c3fec517 100644 --- a/src/Courier/Core/ModelBase.cs +++ b/src/Courier/Core/ModelBase.cs @@ -16,6 +16,7 @@ using Templates = Courier.Models.Tenants.Templates; using Tenants = Courier.Models.Tenants; using Tokens = Courier.Models.Users.Tokens; +using UsersTenants = Courier.Models.Users.Tenants; namespace Courier.Core; @@ -35,6 +36,7 @@ protected ModelBase(ModelBase modelBase) { Converters = { + new FrozenDictionaryConverterFactory(), new ApiEnumConverter(), new ApiEnumConverter(), new ApiEnumConverter(), @@ -58,8 +60,8 @@ protected ModelBase(ModelBase modelBase) new ApiEnumConverter(), new ApiEnumConverter(), new ApiEnumConverter(), + new ApiEnumConverter(), new ApiEnumConverter(), - new ApiEnumConverter(), new ApiEnumConverter(), new ApiEnumConverter(), new ApiEnumConverter(), @@ -91,7 +93,7 @@ protected ModelBase(ModelBase modelBase) new ApiEnumConverter(), new ApiEnumConverter(), new ApiEnumConverter(), - new ApiEnumConverter(), + new ApiEnumConverter(), new ApiEnumConverter(), new ApiEnumConverter(), new ApiEnumConverter(), diff --git a/src/Courier/Core/MultipartJsonDictionary.cs b/src/Courier/Core/MultipartJsonDictionary.cs new file mode 100644 index 00000000..b68e9c34 --- /dev/null +++ b/src/Courier/Core/MultipartJsonDictionary.cs @@ -0,0 +1,208 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Frozen; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using Courier.Exceptions; + +namespace Courier.Core; + +/// +/// A dictionary that holds mixed JSON and binary content. +/// +/// It can be mutated and then frozen once no more mutations are expected. This +/// is useful for allowing the dictionary to be modified by a class's init +/// properties, but then preventing it from being modified afterwards. +/// +/// It also caches data deserialization for performance. +/// +sealed class MultipartJsonDictionary +{ + IDictionary _rawData; + + readonly ConcurrentDictionary _deserializedData; + + Dictionary MutableRawData + { + get + { + if (_rawData is Dictionary dictionary) + { + return dictionary; + } + throw new InvalidOperationException("Can't mutate after freezing."); + } + } + + public MultipartJsonDictionary() + { + _rawData = new Dictionary(); + _deserializedData = []; + } + + public MultipartJsonDictionary(IReadOnlyDictionary dictionary) + { + _rawData = Enumerable.ToDictionary(dictionary, (e) => e.Key, (e) => e.Value); + _deserializedData = []; + } + + public MultipartJsonDictionary(FrozenDictionary dictionary) + { + _rawData = dictionary; + _deserializedData = []; + } + + public MultipartJsonDictionary(MultipartJsonDictionary dictionary) + { + _rawData = Enumerable.ToDictionary(dictionary._rawData, (e) => e.Key, (e) => e.Value); + _deserializedData = new(dictionary._deserializedData); + } + + /// + /// Freezes this dictionary and returns a readonly view of it. + /// + /// Future calls to mutating methods on this class will throw + /// . + /// + public IReadOnlyDictionary Freeze() + { + if (_rawData is FrozenDictionary dictionary) + { + return dictionary; + } + + var frozenRawData = FrozenDictionary.ToFrozenDictionary(_rawData); + _rawData = frozenRawData; + return frozenRawData; + } + + public void Set(string key, T value) + { + MutableRawData[key] = MultipartJsonSerializer.SerializeToElement( + value, + ModelBase.SerializerOptions + ); + _deserializedData[key] = value; + } + + public T GetNotNullClass(string key) + where T : class + { + if (_deserializedData.TryGetValue(key, out var cached) && cached is T t) + { + return t; + } + if (!_rawData.TryGetValue(key, out MultipartJsonElement element)) + { + throw new CourierInvalidDataException($"'{key}' cannot be absent"); + } + T deserialized; + try + { + deserialized = + MultipartJsonSerializer.Deserialize(element, ModelBase.SerializerOptions) + ?? throw new CourierInvalidDataException($"'{key}' cannot be null"); + } + catch (JsonException e) + { + throw new CourierInvalidDataException( + $"'{key}' must be of type {typeof(T).FullName}", + e + ); + } + _deserializedData[key] = deserialized; + return deserialized; + } + + public T GetNotNullStruct(string key) + where T : struct + { + if (_deserializedData.TryGetValue(key, out var cached) && cached is T t) + { + return t; + } + if (!_rawData.TryGetValue(key, out MultipartJsonElement element)) + { + throw new CourierInvalidDataException($"'{key}' cannot be absent"); + } + T deserialized; + try + { + deserialized = + MultipartJsonSerializer.Deserialize(element, ModelBase.SerializerOptions) + ?? throw new CourierInvalidDataException($"'{key}' cannot be null"); + } + catch (JsonException e) + { + throw new CourierInvalidDataException( + $"'{key}' must be of type {typeof(T).FullName}", + e + ); + } + _deserializedData[key] = deserialized; + return deserialized; + } + + public T? GetNullableClass(string key) + where T : class + { + if (_deserializedData.TryGetValue(key, out var cached) && (cached == null || cached is T)) + { + return (T?)cached; + } + if (!_rawData.TryGetValue(key, out MultipartJsonElement element)) + { + _deserializedData[key] = null; + return null; + } + T? deserialized; + try + { + deserialized = MultipartJsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); + } + catch (JsonException e) + { + throw new CourierInvalidDataException( + $"'{key}' must be of type {typeof(T).FullName}", + e + ); + } + _deserializedData[key] = deserialized; + return deserialized; + } + + public T? GetNullableStruct(string key) + where T : struct + { + if (_deserializedData.TryGetValue(key, out var cached) && (cached == null || cached is T)) + { + return (T?)cached; + } + if (!_rawData.TryGetValue(key, out MultipartJsonElement element)) + { + _deserializedData[key] = null; + return null; + } + T? deserialized; + try + { + deserialized = MultipartJsonSerializer.Deserialize( + element, + ModelBase.SerializerOptions + ); + } + catch (JsonException e) + { + throw new CourierInvalidDataException( + $"'{key}' must be of type {typeof(T).FullName}", + e + ); + } + _deserializedData[key] = deserialized; + return deserialized; + } +} diff --git a/src/Courier/Core/MultipartJsonElement.cs b/src/Courier/Core/MultipartJsonElement.cs index 24dc59d4..3f2d2116 100644 --- a/src/Courier/Core/MultipartJsonElement.cs +++ b/src/Courier/Core/MultipartJsonElement.cs @@ -120,8 +120,8 @@ public static MultipartJsonElement SerializeToElement( { CurrentBinaryContents.Value = Enumerable.ToDictionary( element.BinaryContents, - e => e.Key, - e => e.Value + (e) => e.Key, + (e) => e.Value ); return JsonSerializer.Deserialize(element.Json, MultipartSerializerOptions(options)); } diff --git a/src/Courier/Core/MultipartJsonModel.cs b/src/Courier/Core/MultipartJsonModel.cs index feb1f09f..c73d7c7d 100644 --- a/src/Courier/Core/MultipartJsonModel.cs +++ b/src/Courier/Core/MultipartJsonModel.cs @@ -1,6 +1,4 @@ using System.Collections.Generic; -using System.Text.Json; -using Courier.Exceptions; namespace Courier.Core; @@ -12,12 +10,12 @@ namespace Courier.Core; /// public abstract record class MultipartJsonModel : ModelBase { - private protected FreezableDictionary _rawData = []; + private protected MultipartJsonDictionary _rawData = new(); protected MultipartJsonModel(MultipartJsonModel jsonModel) : base(jsonModel) { - this._rawData = [.. jsonModel._rawData]; + this._rawData = new(jsonModel._rawData); } /// @@ -28,116 +26,6 @@ public IReadOnlyDictionary RawData get { return this._rawData.Freeze(); } } - internal static void Set( - IDictionary dictionary, - string key, - T value - ) - { - dictionary[key] = MultipartJsonSerializer.SerializeToElement( - value, - ModelBase.SerializerOptions - ); - } - - internal static T GetNotNullClass( - IReadOnlyDictionary dictionary, - string key - ) - where T : class - { - if (!dictionary.TryGetValue(key, out var element)) - { - throw new CourierInvalidDataException($"'{key}' cannot be absent"); - } - - try - { - return MultipartJsonSerializer.Deserialize(element) - ?? throw new CourierInvalidDataException($"'{key}' cannot be null"); - } - catch (JsonException e) - { - throw new CourierInvalidDataException( - $"'{key}' must be of type {typeof(T).FullName}", - e - ); - } - } - - internal static T GetNotNullStruct( - IReadOnlyDictionary dictionary, - string key - ) - where T : struct - { - if (!dictionary.TryGetValue(key, out var element)) - { - throw new CourierInvalidDataException($"'{key}' cannot be absent"); - } - - try - { - return MultipartJsonSerializer.Deserialize(element) - ?? throw new CourierInvalidDataException($"'{key}' cannot be null"); - } - catch (JsonException e) - { - throw new CourierInvalidDataException( - $"'{key}' must be of type {typeof(T).FullName}", - e - ); - } - } - - internal static T? GetNullableClass( - IReadOnlyDictionary dictionary, - string key - ) - where T : class - { - if (!dictionary.TryGetValue(key, out var element)) - { - return null; - } - - try - { - return MultipartJsonSerializer.Deserialize(element); - } - catch (JsonException e) - { - throw new CourierInvalidDataException( - $"'{key}' must be of type {typeof(T).FullName}", - e - ); - } - } - - internal static T? GetNullableStruct( - IReadOnlyDictionary dictionary, - string key - ) - where T : struct - { - if (!dictionary.TryGetValue(key, out var element)) - { - return null; - } - - try - { - return MultipartJsonSerializer.Deserialize(element); - } - catch (JsonException e) - { - throw new CourierInvalidDataException( - $"'{key}' must be of type {typeof(T).FullName}", - e - ); - } - } - public override int GetHashCode() { return 0; diff --git a/src/Courier/Core/ParamsBase.cs b/src/Courier/Core/ParamsBase.cs index 17f84a2f..eda0968a 100644 --- a/src/Courier/Core/ParamsBase.cs +++ b/src/Courier/Core/ParamsBase.cs @@ -30,14 +30,14 @@ static ParamsBase() }; } - private protected FreezableDictionary _rawQueryData = []; + private protected JsonDictionary _rawQueryData = new(); - private protected FreezableDictionary _rawHeaderData = []; + private protected JsonDictionary _rawHeaderData = new(); protected ParamsBase(ParamsBase paramsBase) { - this._rawHeaderData = [.. paramsBase._rawHeaderData]; - this._rawQueryData = [.. paramsBase._rawQueryData]; + this._rawHeaderData = new(paramsBase._rawHeaderData); + this._rawQueryData = new(paramsBase._rawQueryData); } public IReadOnlyDictionary RawQueryData diff --git a/src/Courier/Courier.csproj b/src/Courier/Courier.csproj index d1dde813..7cae330a 100644 --- a/src/Courier/Courier.csproj +++ b/src/Courier/Courier.csproj @@ -3,9 +3,7 @@ Courier C# Courier - 5.1.0 - Courier - Courier + 5.2.0 The official .NET library for the Courier API. Library README.md diff --git a/src/Courier/CourierClient.cs b/src/Courier/CourierClient.cs index e81e0cc9..3ba067b9 100644 --- a/src/Courier/CourierClient.cs +++ b/src/Courier/CourierClient.cs @@ -389,7 +389,7 @@ public async Task Execute( if (response != null && (++retries > maxRetries || !ShouldRetry(response))) { - if (response.Message.IsSuccessStatusCode) + if (response.IsSuccessStatusCode) { return response; } @@ -397,7 +397,7 @@ public async Task Execute( try { throw CourierExceptionFactory.CreateApiException( - response.Message.StatusCode, + response.StatusCode, await response.ReadAsString(cancellationToken).ConfigureAwait(false) ); } @@ -458,7 +458,7 @@ async Task ExecuteOnce( { throw new CourierIOException("I/O exception", e); } - return new() { Message = responseMessage, CancellationToken = cts.Token }; + return new() { RawMessage = responseMessage, CancellationToken = cts.Token }; } static TimeSpan ComputeRetryBackoff(int retries, HttpResponse? response) @@ -480,7 +480,7 @@ static TimeSpan ComputeRetryBackoff(int retries, HttpResponse? response) static TimeSpan? ParseRetryAfterMsHeader(HttpResponse? response) { IEnumerable? headerValues = null; - response?.Message.Headers.TryGetValues("Retry-After-Ms", out headerValues); + response?.TryGetHeaderValues("Retry-After-Ms", out headerValues); var headerValue = headerValues == null ? null : Enumerable.FirstOrDefault(headerValues); if (headerValue == null) { @@ -498,7 +498,7 @@ static TimeSpan ComputeRetryBackoff(int retries, HttpResponse? response) static TimeSpan? ParseRetryAfterHeader(HttpResponse? response) { IEnumerable? headerValues = null; - response?.Message.Headers.TryGetValues("Retry-After", out headerValues); + response?.TryGetHeaderValues("Retry-After", out headerValues); var headerValue = headerValues == null ? null : Enumerable.FirstOrDefault(headerValues); if (headerValue == null) { @@ -520,7 +520,7 @@ static TimeSpan ComputeRetryBackoff(int retries, HttpResponse? response) static bool ShouldRetry(HttpResponse response) { if ( - response.Message.Headers.TryGetValues("X-Should-Retry", out var headerValues) + response.TryGetHeaderValues("X-Should-Retry", out var headerValues) && bool.TryParse(Enumerable.FirstOrDefault(headerValues), out var shouldRetry) ) { @@ -528,7 +528,7 @@ static bool ShouldRetry(HttpResponse response) return shouldRetry; } - return (int)response.Message.StatusCode switch + return (int)response.StatusCode switch { // Retry on request timeouts 408 diff --git a/src/Courier/Models/AirshipProfile.cs b/src/Courier/Models/AirshipProfile.cs index 3b2d29da..fd03d825 100644 --- a/src/Courier/Models/AirshipProfile.cs +++ b/src/Courier/Models/AirshipProfile.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -12,14 +13,28 @@ public sealed record class AirshipProfile : JsonModel { public required AirshipProfileAudience Audience { - get { return JsonModel.GetNotNullClass(this.RawData, "audience"); } - init { JsonModel.Set(this._rawData, "audience", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("audience"); + } + init { this._rawData.Set("audience", value); } } public required IReadOnlyList DeviceTypes { - get { return JsonModel.GetNotNullClass>(this.RawData, "device_types"); } - init { JsonModel.Set(this._rawData, "device_types", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("device_types"); + } + init + { + this._rawData.Set>( + "device_types", + ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -36,14 +51,14 @@ public AirshipProfile(AirshipProfile airshipProfile) public AirshipProfile(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AirshipProfile(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/AirshipProfileAudience.cs b/src/Courier/Models/AirshipProfileAudience.cs index afb24327..5c2001d9 100644 --- a/src/Courier/Models/AirshipProfileAudience.cs +++ b/src/Courier/Models/AirshipProfileAudience.cs @@ -12,8 +12,12 @@ public sealed record class AirshipProfileAudience : JsonModel { public required string NamedUser { - get { return JsonModel.GetNotNullClass(this.RawData, "named_user"); } - init { JsonModel.Set(this._rawData, "named_user", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("named_user"); + } + init { this._rawData.Set("named_user", value); } } /// @@ -29,14 +33,14 @@ public AirshipProfileAudience(AirshipProfileAudience airshipProfileAudience) public AirshipProfileAudience(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AirshipProfileAudience(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/AudienceFilter.cs b/src/Courier/Models/AudienceFilter.cs index 1bd414f6..f7f5174b 100644 --- a/src/Courier/Models/AudienceFilter.cs +++ b/src/Courier/Models/AudienceFilter.cs @@ -19,21 +19,30 @@ public required ApiEnum Operator { get { - return JsonModel.GetNotNullClass>(this.RawData, "operator"); + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("operator"); } - init { JsonModel.Set(this._rawData, "operator", value); } + init { this._rawData.Set("operator", value); } } public required ApiEnum Path { - get { return JsonModel.GetNotNullClass>(this.RawData, "path"); } - init { JsonModel.Set(this._rawData, "path", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("path"); + } + init { this._rawData.Set("path", value); } } public required string Value { - get { return JsonModel.GetNotNullClass(this.RawData, "value"); } - init { JsonModel.Set(this._rawData, "value", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("value"); + } + init { this._rawData.Set("value", value); } } /// @@ -51,14 +60,14 @@ public AudienceFilter(AudienceFilter audienceFilter) public AudienceFilter(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AudienceFilter(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/AudienceFilterConfig.cs b/src/Courier/Models/AudienceFilterConfig.cs new file mode 100644 index 00000000..0bd252eb --- /dev/null +++ b/src/Courier/Models/AudienceFilterConfig.cs @@ -0,0 +1,85 @@ +using System.Collections.Frozen; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; +using System.Text.Json.Serialization; +using Courier.Core; + +namespace Courier.Models; + +/// +/// Filter configuration for audience membership containing an array of filter rules +/// +[JsonConverter(typeof(JsonModelConverter))] +public sealed record class AudienceFilterConfig : JsonModel +{ + /// + /// Array of filter rules (single conditions or nested groups) + /// + public required IReadOnlyList Filters + { + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("filters"); + } + init + { + this._rawData.Set>( + "filters", + ImmutableArray.ToImmutableArray(value) + ); + } + } + + /// + public override void Validate() + { + foreach (var item in this.Filters) + { + item.Validate(); + } + } + + public AudienceFilterConfig() { } + + public AudienceFilterConfig(AudienceFilterConfig audienceFilterConfig) + : base(audienceFilterConfig) { } + + public AudienceFilterConfig(IReadOnlyDictionary rawData) + { + this._rawData = new(rawData); + } + +#pragma warning disable CS8618 + [SetsRequiredMembers] + AudienceFilterConfig(FrozenDictionary rawData) + { + this._rawData = new(rawData); + } +#pragma warning restore CS8618 + + /// + public static AudienceFilterConfig FromRawUnchecked( + IReadOnlyDictionary rawData + ) + { + return new(FrozenDictionary.ToFrozenDictionary(rawData)); + } + + [SetsRequiredMembers] + public AudienceFilterConfig(IReadOnlyList filters) + : this() + { + this.Filters = filters; + } +} + +class AudienceFilterConfigFromRaw : IFromRawJson +{ + /// + public AudienceFilterConfig FromRawUnchecked( + IReadOnlyDictionary rawData + ) => AudienceFilterConfig.FromRawUnchecked(rawData); +} diff --git a/src/Courier/Models/AudienceRecipient.cs b/src/Courier/Models/AudienceRecipient.cs index 13fdf880..bdc3986f 100644 --- a/src/Courier/Models/AudienceRecipient.cs +++ b/src/Courier/Models/AudienceRecipient.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -19,26 +20,44 @@ public sealed record class AudienceRecipient : JsonModel /// public required string AudienceID { - get { return JsonModel.GetNotNullClass(this.RawData, "audience_id"); } - init { JsonModel.Set(this._rawData, "audience_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("audience_id"); + } + init { this._rawData.Set("audience_id", value); } } public IReadOnlyDictionary? Data { get { - return JsonModel.GetNullableClass>( - this.RawData, - "data" + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("data"); + } + init + { + this._rawData.Set?>( + "data", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "data", value); } } public IReadOnlyList? Filters { - get { return JsonModel.GetNullableClass>(this.RawData, "filters"); } - init { JsonModel.Set(this._rawData, "filters", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("filters"); + } + init + { + this._rawData.Set?>( + "filters", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -59,14 +78,14 @@ public AudienceRecipient(AudienceRecipient audienceRecipient) public AudienceRecipient(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AudienceRecipient(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Audiences/Audience.cs b/src/Courier/Models/Audiences/Audience.cs index c4f49a22..510fe193 100644 --- a/src/Courier/Models/Audiences/Audience.cs +++ b/src/Courier/Models/Audiences/Audience.cs @@ -4,6 +4,8 @@ using System.Text.Json; using System.Text.Json.Serialization; using Courier.Core; +using Courier.Exceptions; +using System = System; namespace Courier.Models.Audiences; @@ -15,14 +17,22 @@ public sealed record class Audience : JsonModel /// public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } public required string CreatedAt { - get { return JsonModel.GetNotNullClass(this.RawData, "created_at"); } - init { JsonModel.Set(this._rawData, "created_at", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("created_at"); + } + init { this._rawData.Set("created_at", value); } } /// @@ -30,32 +40,69 @@ public required string CreatedAt /// public required string Description { - get { return JsonModel.GetNotNullClass(this.RawData, "description"); } - init { JsonModel.Set(this._rawData, "description", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("description"); + } + init { this._rawData.Set("description", value); } } /// - /// A single filter to use for filtering + /// The name of the audience /// - public required Filter Filter + public required string Name + { + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("name"); + } + init { this._rawData.Set("name", value); } + } + + public required string UpdatedAt { - get { return JsonModel.GetNotNullClass(this.RawData, "filter"); } - init { JsonModel.Set(this._rawData, "filter", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("updated_at"); + } + init { this._rawData.Set("updated_at", value); } } /// - /// The name of the audience + /// Filter configuration for audience membership containing an array of filter rules /// - public required string Name + public AudienceFilterConfig? Filter { - get { return JsonModel.GetNotNullClass(this.RawData, "name"); } - init { JsonModel.Set(this._rawData, "name", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("filter"); + } + init { this._rawData.Set("filter", value); } } - public required string UpdatedAt + /// + /// The logical operator (AND/OR) for the top-level filter + /// + public ApiEnum? Operator { - get { return JsonModel.GetNotNullClass(this.RawData, "updated_at"); } - init { JsonModel.Set(this._rawData, "updated_at", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("operator"); + } + init + { + if (value == null) + { + return; + } + + this._rawData.Set("operator", value); + } } /// @@ -64,9 +111,10 @@ public override void Validate() _ = this.ID; _ = this.CreatedAt; _ = this.Description; - this.Filter.Validate(); _ = this.Name; _ = this.UpdatedAt; + this.Filter?.Validate(); + this.Operator?.Validate(); } public Audience() { } @@ -76,14 +124,14 @@ public Audience(Audience audience) public Audience(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Audience(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -100,3 +148,50 @@ class AudienceFromRaw : IFromRawJson public Audience FromRawUnchecked(IReadOnlyDictionary rawData) => Audience.FromRawUnchecked(rawData); } + +/// +/// The logical operator (AND/OR) for the top-level filter +/// +[JsonConverter(typeof(AudienceOperatorConverter))] +public enum AudienceOperator +{ + And, + Or, +} + +sealed class AudienceOperatorConverter : JsonConverter +{ + public override AudienceOperator Read( + ref Utf8JsonReader reader, + System::Type typeToConvert, + JsonSerializerOptions options + ) + { + return JsonSerializer.Deserialize(ref reader, options) switch + { + "AND" => AudienceOperator.And, + "OR" => AudienceOperator.Or, + _ => (AudienceOperator)(-1), + }; + } + + public override void Write( + Utf8JsonWriter writer, + AudienceOperator value, + JsonSerializerOptions options + ) + { + JsonSerializer.Serialize( + writer, + value switch + { + AudienceOperator.And => "AND", + AudienceOperator.Or => "OR", + _ => throw new CourierInvalidDataException( + string.Format("Invalid value '{0}' in {1}", value, nameof(value)) + ), + }, + options + ); + } +} diff --git a/src/Courier/Models/Audiences/AudienceDeleteParams.cs b/src/Courier/Models/Audiences/AudienceDeleteParams.cs index d3730aec..96e47975 100644 --- a/src/Courier/Models/Audiences/AudienceDeleteParams.cs +++ b/src/Courier/Models/Audiences/AudienceDeleteParams.cs @@ -28,8 +28,8 @@ public AudienceDeleteParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Audiences/AudienceListMembersParams.cs b/src/Courier/Models/Audiences/AudienceListMembersParams.cs index 6b2b855f..d54936f7 100644 --- a/src/Courier/Models/Audiences/AudienceListMembersParams.cs +++ b/src/Courier/Models/Audiences/AudienceListMembersParams.cs @@ -20,8 +20,12 @@ public sealed record class AudienceListMembersParams : ParamsBase /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawQueryData, "cursor"); } - init { JsonModel.Set(this._rawQueryData, "cursor", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("cursor"); + } + init { this._rawQueryData.Set("cursor", value); } } public AudienceListMembersParams() { } @@ -37,8 +41,8 @@ public AudienceListMembersParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -48,8 +52,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Audiences/AudienceListMembersResponse.cs b/src/Courier/Models/Audiences/AudienceListMembersResponse.cs index d43396e4..f0f8badf 100644 --- a/src/Courier/Models/Audiences/AudienceListMembersResponse.cs +++ b/src/Courier/Models/Audiences/AudienceListMembersResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -14,14 +15,28 @@ public sealed record class AudienceListMembersResponse : JsonModel { public required IReadOnlyList Items { - get { return JsonModel.GetNotNullClass>(this.RawData, "items"); } - init { JsonModel.Set(this._rawData, "items", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("items"); + } + init + { + this._rawData.Set>( + "items", + ImmutableArray.ToImmutableArray(value) + ); + } } public required Paging Paging { - get { return JsonModel.GetNotNullClass(this.RawData, "paging"); } - init { JsonModel.Set(this._rawData, "paging", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("paging"); + } + init { this._rawData.Set("paging", value); } } /// @@ -41,14 +56,14 @@ public AudienceListMembersResponse(AudienceListMembersResponse audienceListMembe public AudienceListMembersResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AudienceListMembersResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -74,32 +89,52 @@ public sealed record class Item : JsonModel { public required string AddedAt { - get { return JsonModel.GetNotNullClass(this.RawData, "added_at"); } - init { JsonModel.Set(this._rawData, "added_at", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("added_at"); + } + init { this._rawData.Set("added_at", value); } } public required string AudienceID { - get { return JsonModel.GetNotNullClass(this.RawData, "audience_id"); } - init { JsonModel.Set(this._rawData, "audience_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("audience_id"); + } + init { this._rawData.Set("audience_id", value); } } public required long AudienceVersion { - get { return JsonModel.GetNotNullStruct(this.RawData, "audience_version"); } - init { JsonModel.Set(this._rawData, "audience_version", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("audience_version"); + } + init { this._rawData.Set("audience_version", value); } } public required string MemberID { - get { return JsonModel.GetNotNullClass(this.RawData, "member_id"); } - init { JsonModel.Set(this._rawData, "member_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("member_id"); + } + init { this._rawData.Set("member_id", value); } } public required string Reason { - get { return JsonModel.GetNotNullClass(this.RawData, "reason"); } - init { JsonModel.Set(this._rawData, "reason", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("reason"); + } + init { this._rawData.Set("reason", value); } } /// @@ -119,14 +154,14 @@ public Item(Item item) public Item(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Item(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Audiences/AudienceListParams.cs b/src/Courier/Models/Audiences/AudienceListParams.cs index f67f521c..b640d494 100644 --- a/src/Courier/Models/Audiences/AudienceListParams.cs +++ b/src/Courier/Models/Audiences/AudienceListParams.cs @@ -18,8 +18,12 @@ public sealed record class AudienceListParams : ParamsBase /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawQueryData, "cursor"); } - init { JsonModel.Set(this._rawQueryData, "cursor", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("cursor"); + } + init { this._rawQueryData.Set("cursor", value); } } public AudienceListParams() { } @@ -32,8 +36,8 @@ public AudienceListParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -43,8 +47,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Audiences/AudienceListResponse.cs b/src/Courier/Models/Audiences/AudienceListResponse.cs index 2d6e8d0d..7691ca79 100644 --- a/src/Courier/Models/Audiences/AudienceListResponse.cs +++ b/src/Courier/Models/Audiences/AudienceListResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -12,14 +13,28 @@ public sealed record class AudienceListResponse : JsonModel { public required IReadOnlyList Items { - get { return JsonModel.GetNotNullClass>(this.RawData, "items"); } - init { JsonModel.Set(this._rawData, "items", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("items"); + } + init + { + this._rawData.Set>( + "items", + ImmutableArray.ToImmutableArray(value) + ); + } } public required Paging Paging { - get { return JsonModel.GetNotNullClass(this.RawData, "paging"); } - init { JsonModel.Set(this._rawData, "paging", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("paging"); + } + init { this._rawData.Set("paging", value); } } /// @@ -39,14 +54,14 @@ public AudienceListResponse(AudienceListResponse audienceListResponse) public AudienceListResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AudienceListResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Audiences/AudienceRetrieveParams.cs b/src/Courier/Models/Audiences/AudienceRetrieveParams.cs index a9863176..6f234913 100644 --- a/src/Courier/Models/Audiences/AudienceRetrieveParams.cs +++ b/src/Courier/Models/Audiences/AudienceRetrieveParams.cs @@ -28,8 +28,8 @@ public AudienceRetrieveParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Audiences/AudienceUpdateParams.cs b/src/Courier/Models/Audiences/AudienceUpdateParams.cs index b91cbfe1..410296f7 100644 --- a/src/Courier/Models/Audiences/AudienceUpdateParams.cs +++ b/src/Courier/Models/Audiences/AudienceUpdateParams.cs @@ -1,11 +1,13 @@ -using System; using System.Collections.Frozen; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Net.Http; using System.Text; using System.Text.Json; +using System.Text.Json.Serialization; using Courier.Core; +using Courier.Exceptions; +using System = System; namespace Courier.Models.Audiences; @@ -14,7 +16,7 @@ namespace Courier.Models.Audiences; /// public sealed record class AudienceUpdateParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -27,17 +29,25 @@ public IReadOnlyDictionary RawBodyData /// public string? Description { - get { return JsonModel.GetNullableClass(this.RawBodyData, "description"); } - init { JsonModel.Set(this._rawBodyData, "description", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("description"); + } + init { this._rawBodyData.Set("description", value); } } /// - /// A single filter to use for filtering + /// Filter configuration for audience membership containing an array of filter rules /// - public Filter? Filter + public AudienceFilterConfig? Filter { - get { return JsonModel.GetNullableClass(this.RawBodyData, "filter"); } - init { JsonModel.Set(this._rawBodyData, "filter", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("filter"); + } + init { this._rawBodyData.Set("filter", value); } } /// @@ -45,8 +55,27 @@ public Filter? Filter /// public string? Name { - get { return JsonModel.GetNullableClass(this.RawBodyData, "name"); } - init { JsonModel.Set(this._rawBodyData, "name", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("name"); + } + init { this._rawBodyData.Set("name", value); } + } + + /// + /// The logical operator (AND/OR) for the top-level filter + /// + public ApiEnum? Operator + { + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass< + ApiEnum + >("operator"); + } + init { this._rawBodyData.Set("operator", value); } } public AudienceUpdateParams() { } @@ -56,7 +85,7 @@ public AudienceUpdateParams(AudienceUpdateParams audienceUpdateParams) { this.AudienceID = audienceUpdateParams.AudienceID; - this._rawBodyData = [.. audienceUpdateParams._rawBodyData]; + this._rawBodyData = new(audienceUpdateParams._rawBodyData); } public AudienceUpdateParams( @@ -65,9 +94,9 @@ public AudienceUpdateParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -78,9 +107,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -98,9 +127,9 @@ IReadOnlyDictionary rawBodyData ); } - public override Uri Url(ClientOptions options) + public override System::Uri Url(ClientOptions options) { - return new UriBuilder( + return new System::UriBuilder( options.BaseUrl.ToString().TrimEnd('/') + string.Format("/audiences/{0}", this.AudienceID) ) @@ -112,7 +141,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); @@ -127,3 +156,50 @@ internal override void AddHeadersToRequest(HttpRequestMessage request, ClientOpt } } } + +/// +/// The logical operator (AND/OR) for the top-level filter +/// +[JsonConverter(typeof(global::Courier.Models.Audiences.OperatorConverter))] +public enum Operator +{ + And, + Or, +} + +sealed class OperatorConverter : JsonConverter +{ + public override global::Courier.Models.Audiences.Operator Read( + ref Utf8JsonReader reader, + System::Type typeToConvert, + JsonSerializerOptions options + ) + { + return JsonSerializer.Deserialize(ref reader, options) switch + { + "AND" => global::Courier.Models.Audiences.Operator.And, + "OR" => global::Courier.Models.Audiences.Operator.Or, + _ => (global::Courier.Models.Audiences.Operator)(-1), + }; + } + + public override void Write( + Utf8JsonWriter writer, + global::Courier.Models.Audiences.Operator value, + JsonSerializerOptions options + ) + { + JsonSerializer.Serialize( + writer, + value switch + { + global::Courier.Models.Audiences.Operator.And => "AND", + global::Courier.Models.Audiences.Operator.Or => "OR", + _ => throw new CourierInvalidDataException( + string.Format("Invalid value '{0}' in {1}", value, nameof(value)) + ), + }, + options + ); + } +} diff --git a/src/Courier/Models/Audiences/AudienceUpdateResponse.cs b/src/Courier/Models/Audiences/AudienceUpdateResponse.cs index 0475a37a..ddf74c15 100644 --- a/src/Courier/Models/Audiences/AudienceUpdateResponse.cs +++ b/src/Courier/Models/Audiences/AudienceUpdateResponse.cs @@ -12,8 +12,12 @@ public sealed record class AudienceUpdateResponse : JsonModel { public required Audience Audience { - get { return JsonModel.GetNotNullClass(this.RawData, "audience"); } - init { JsonModel.Set(this._rawData, "audience", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("audience"); + } + init { this._rawData.Set("audience", value); } } /// @@ -29,14 +33,14 @@ public AudienceUpdateResponse(AudienceUpdateResponse audienceUpdateResponse) public AudienceUpdateResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AudienceUpdateResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Audiences/Filter.cs b/src/Courier/Models/Audiences/Filter.cs deleted file mode 100644 index 723aa11e..00000000 --- a/src/Courier/Models/Audiences/Filter.cs +++ /dev/null @@ -1,240 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using System.Text.Json; -using System.Text.Json.Serialization; -using Courier.Core; -using Courier.Exceptions; -using System = System; - -namespace Courier.Models.Audiences; - -/// -/// A single filter to use for filtering -/// -[JsonConverter(typeof(FilterConverter))] -public record class Filter : ModelBase -{ - public object? Value { get; } = null; - - JsonElement? _element = null; - - public JsonElement Json - { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } - } - - public Filter(SingleFilterConfig value, JsonElement? element = null) - { - this.Value = value; - this._element = element; - } - - public Filter(NestedFilterConfig value, JsonElement? element = null) - { - this.Value = value; - this._element = element; - } - - public Filter(JsonElement element) - { - this._element = element; - } - - /// - /// Returns true and sets the out parameter if the instance was constructed with a variant of - /// type . - /// - /// Consider using or if you need to handle every variant. - /// - /// - /// - /// if (instance.TryPickSingleFilterConfig(out var value)) { - /// // `value` is of type `SingleFilterConfig` - /// Console.WriteLine(value); - /// } - /// - /// - /// - public bool TryPickSingleFilterConfig([NotNullWhen(true)] out SingleFilterConfig? value) - { - value = this.Value as SingleFilterConfig; - return value != null; - } - - /// - /// Returns true and sets the out parameter if the instance was constructed with a variant of - /// type . - /// - /// Consider using or if you need to handle every variant. - /// - /// - /// - /// if (instance.TryPickNestedFilterConfig(out var value)) { - /// // `value` is of type `NestedFilterConfig` - /// Console.WriteLine(value); - /// } - /// - /// - /// - public bool TryPickNestedFilterConfig([NotNullWhen(true)] out NestedFilterConfig? value) - { - value = this.Value as NestedFilterConfig; - return value != null; - } - - /// - /// Calls the function parameter corresponding to the variant the instance was constructed with. - /// - /// Use the TryPick method(s) if you don't need to handle every variant, or - /// if you need your function parameters to return something. - /// - /// - /// Thrown when the instance was constructed with an unknown variant (e.g. deserialized from raw data - /// that doesn't match any variant's expected shape). - /// - /// - /// - /// - /// instance.Switch( - /// (SingleFilterConfig value) => {...}, - /// (NestedFilterConfig value) => {...} - /// ); - /// - /// - /// - public void Switch( - System::Action singleFilterConfig, - System::Action nestedFilterConfig - ) - { - switch (this.Value) - { - case SingleFilterConfig value: - singleFilterConfig(value); - break; - case NestedFilterConfig value: - nestedFilterConfig(value); - break; - default: - throw new CourierInvalidDataException("Data did not match any variant of Filter"); - } - } - - /// - /// Calls the function parameter corresponding to the variant the instance was constructed with and - /// returns its result. - /// - /// Use the TryPick method(s) if you don't need to handle every variant, or - /// if you don't need your function parameters to return a value. - /// - /// - /// Thrown when the instance was constructed with an unknown variant (e.g. deserialized from raw data - /// that doesn't match any variant's expected shape). - /// - /// - /// - /// - /// var result = instance.Match( - /// (SingleFilterConfig value) => {...}, - /// (NestedFilterConfig value) => {...} - /// ); - /// - /// - /// - public T Match( - System::Func singleFilterConfig, - System::Func nestedFilterConfig - ) - { - return this.Value switch - { - SingleFilterConfig value => singleFilterConfig(value), - NestedFilterConfig value => nestedFilterConfig(value), - _ => throw new CourierInvalidDataException("Data did not match any variant of Filter"), - }; - } - - public static implicit operator Filter(SingleFilterConfig value) => new(value); - - public static implicit operator Filter(NestedFilterConfig value) => new(value); - - /// - /// Validates that the instance was constructed with a known variant and that this variant is valid - /// (based on its own Validate method). - /// - /// This is useful for instances constructed from raw JSON data (e.g. deserialized from an API response). - /// - /// - /// Thrown when the instance does not pass validation. - /// - /// - public override void Validate() - { - if (this.Value == null) - { - throw new CourierInvalidDataException("Data did not match any variant of Filter"); - } - this.Switch( - (singleFilterConfig) => singleFilterConfig.Validate(), - (nestedFilterConfig) => nestedFilterConfig.Validate() - ); - } - - public virtual bool Equals(Filter? other) - { - return other != null && JsonElement.DeepEquals(this.Json, other.Json); - } - - public override int GetHashCode() - { - return 0; - } - - public override string ToString() => - JsonSerializer.Serialize(this._element, ModelBase.ToStringSerializerOptions); -} - -sealed class FilterConverter : JsonConverter -{ - public override Filter? Read( - ref Utf8JsonReader reader, - System::Type typeToConvert, - JsonSerializerOptions options - ) - { - var element = JsonSerializer.Deserialize(ref reader, options); - try - { - var deserialized = JsonSerializer.Deserialize(element, options); - if (deserialized != null) - { - deserialized.Validate(); - return new(deserialized, element); - } - } - catch (System::Exception e) when (e is JsonException || e is CourierInvalidDataException) - { - // ignore - } - - try - { - var deserialized = JsonSerializer.Deserialize(element, options); - if (deserialized != null) - { - deserialized.Validate(); - return new(deserialized, element); - } - } - catch (System::Exception e) when (e is JsonException || e is CourierInvalidDataException) - { - // ignore - } - - return new(element); - } - - public override void Write(Utf8JsonWriter writer, Filter value, JsonSerializerOptions options) - { - JsonSerializer.Serialize(writer, value.Json, options); - } -} diff --git a/src/Courier/Models/Audiences/NestedFilterConfig.cs b/src/Courier/Models/Audiences/NestedFilterConfig.cs deleted file mode 100644 index 4660fc84..00000000 --- a/src/Courier/Models/Audiences/NestedFilterConfig.cs +++ /dev/null @@ -1,163 +0,0 @@ -using System.Collections.Frozen; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Text.Json; -using System.Text.Json.Serialization; -using Courier.Core; -using Courier.Exceptions; -using System = System; - -namespace Courier.Models.Audiences; - -[JsonConverter(typeof(JsonModelConverter))] -public sealed record class NestedFilterConfig : JsonModel -{ - /// - /// The operator to use for filtering - /// - public required ApiEnum Operator - { - get - { - return JsonModel.GetNotNullClass< - ApiEnum - >(this.RawData, "operator"); - } - init { JsonModel.Set(this._rawData, "operator", value); } - } - - public required IReadOnlyList Rules - { - get { return JsonModel.GetNotNullClass>(this.RawData, "rules"); } - init { JsonModel.Set(this._rawData, "rules", value); } - } - - /// - public override void Validate() - { - this.Operator.Validate(); - foreach (var item in this.Rules) - { - item.Validate(); - } - } - - public NestedFilterConfig() { } - - public NestedFilterConfig(NestedFilterConfig nestedFilterConfig) - : base(nestedFilterConfig) { } - - public NestedFilterConfig(IReadOnlyDictionary rawData) - { - this._rawData = [.. rawData]; - } - -#pragma warning disable CS8618 - [SetsRequiredMembers] - NestedFilterConfig(FrozenDictionary rawData) - { - this._rawData = [.. rawData]; - } -#pragma warning restore CS8618 - - /// - public static NestedFilterConfig FromRawUnchecked( - IReadOnlyDictionary rawData - ) - { - return new(FrozenDictionary.ToFrozenDictionary(rawData)); - } -} - -class NestedFilterConfigFromRaw : IFromRawJson -{ - /// - public NestedFilterConfig FromRawUnchecked(IReadOnlyDictionary rawData) => - NestedFilterConfig.FromRawUnchecked(rawData); -} - -/// -/// The operator to use for filtering -/// -[JsonConverter(typeof(global::Courier.Models.Audiences.OperatorConverter))] -public enum Operator -{ - EndsWith, - Eq, - Exists, - Gt, - Gte, - Includes, - IsAfter, - IsBefore, - Lt, - Lte, - Neq, - Omit, - StartsWith, - And, - Or, -} - -sealed class OperatorConverter : JsonConverter -{ - public override global::Courier.Models.Audiences.Operator Read( - ref Utf8JsonReader reader, - System::Type typeToConvert, - JsonSerializerOptions options - ) - { - return JsonSerializer.Deserialize(ref reader, options) switch - { - "ENDS_WITH" => global::Courier.Models.Audiences.Operator.EndsWith, - "EQ" => global::Courier.Models.Audiences.Operator.Eq, - "EXISTS" => global::Courier.Models.Audiences.Operator.Exists, - "GT" => global::Courier.Models.Audiences.Operator.Gt, - "GTE" => global::Courier.Models.Audiences.Operator.Gte, - "INCLUDES" => global::Courier.Models.Audiences.Operator.Includes, - "IS_AFTER" => global::Courier.Models.Audiences.Operator.IsAfter, - "IS_BEFORE" => global::Courier.Models.Audiences.Operator.IsBefore, - "LT" => global::Courier.Models.Audiences.Operator.Lt, - "LTE" => global::Courier.Models.Audiences.Operator.Lte, - "NEQ" => global::Courier.Models.Audiences.Operator.Neq, - "OMIT" => global::Courier.Models.Audiences.Operator.Omit, - "STARTS_WITH" => global::Courier.Models.Audiences.Operator.StartsWith, - "AND" => global::Courier.Models.Audiences.Operator.And, - "OR" => global::Courier.Models.Audiences.Operator.Or, - _ => (global::Courier.Models.Audiences.Operator)(-1), - }; - } - - public override void Write( - Utf8JsonWriter writer, - global::Courier.Models.Audiences.Operator value, - JsonSerializerOptions options - ) - { - JsonSerializer.Serialize( - writer, - value switch - { - global::Courier.Models.Audiences.Operator.EndsWith => "ENDS_WITH", - global::Courier.Models.Audiences.Operator.Eq => "EQ", - global::Courier.Models.Audiences.Operator.Exists => "EXISTS", - global::Courier.Models.Audiences.Operator.Gt => "GT", - global::Courier.Models.Audiences.Operator.Gte => "GTE", - global::Courier.Models.Audiences.Operator.Includes => "INCLUDES", - global::Courier.Models.Audiences.Operator.IsAfter => "IS_AFTER", - global::Courier.Models.Audiences.Operator.IsBefore => "IS_BEFORE", - global::Courier.Models.Audiences.Operator.Lt => "LT", - global::Courier.Models.Audiences.Operator.Lte => "LTE", - global::Courier.Models.Audiences.Operator.Neq => "NEQ", - global::Courier.Models.Audiences.Operator.Omit => "OMIT", - global::Courier.Models.Audiences.Operator.StartsWith => "STARTS_WITH", - global::Courier.Models.Audiences.Operator.And => "AND", - global::Courier.Models.Audiences.Operator.Or => "OR", - _ => throw new CourierInvalidDataException( - string.Format("Invalid value '{0}' in {1}", value, nameof(value)) - ), - }, - options - ); - } -} diff --git a/src/Courier/Models/Audiences/SingleFilterConfig.cs b/src/Courier/Models/Audiences/SingleFilterConfig.cs deleted file mode 100644 index 9713d80f..00000000 --- a/src/Courier/Models/Audiences/SingleFilterConfig.cs +++ /dev/null @@ -1,175 +0,0 @@ -using System.Collections.Frozen; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Text.Json; -using System.Text.Json.Serialization; -using Courier.Core; -using Courier.Exceptions; -using System = System; - -namespace Courier.Models.Audiences; - -[JsonConverter(typeof(JsonModelConverter))] -public sealed record class SingleFilterConfig : JsonModel -{ - /// - /// The operator to use for filtering - /// - public required ApiEnum Operator - { - get - { - return JsonModel.GetNotNullClass>( - this.RawData, - "operator" - ); - } - init { JsonModel.Set(this._rawData, "operator", value); } - } - - /// - /// The attribute name from profile whose value will be operated against the - /// filter value - /// - public required string Path - { - get { return JsonModel.GetNotNullClass(this.RawData, "path"); } - init { JsonModel.Set(this._rawData, "path", value); } - } - - /// - /// The value to use for filtering - /// - public required string Value - { - get { return JsonModel.GetNotNullClass(this.RawData, "value"); } - init { JsonModel.Set(this._rawData, "value", value); } - } - - /// - public override void Validate() - { - this.Operator.Validate(); - _ = this.Path; - _ = this.Value; - } - - public SingleFilterConfig() { } - - public SingleFilterConfig(SingleFilterConfig singleFilterConfig) - : base(singleFilterConfig) { } - - public SingleFilterConfig(IReadOnlyDictionary rawData) - { - this._rawData = [.. rawData]; - } - -#pragma warning disable CS8618 - [SetsRequiredMembers] - SingleFilterConfig(FrozenDictionary rawData) - { - this._rawData = [.. rawData]; - } -#pragma warning restore CS8618 - - /// - public static SingleFilterConfig FromRawUnchecked( - IReadOnlyDictionary rawData - ) - { - return new(FrozenDictionary.ToFrozenDictionary(rawData)); - } -} - -class SingleFilterConfigFromRaw : IFromRawJson -{ - /// - public SingleFilterConfig FromRawUnchecked(IReadOnlyDictionary rawData) => - SingleFilterConfig.FromRawUnchecked(rawData); -} - -/// -/// The operator to use for filtering -/// -[JsonConverter(typeof(SingleFilterConfigOperatorConverter))] -public enum SingleFilterConfigOperator -{ - EndsWith, - Eq, - Exists, - Gt, - Gte, - Includes, - IsAfter, - IsBefore, - Lt, - Lte, - Neq, - Omit, - StartsWith, - And, - Or, -} - -sealed class SingleFilterConfigOperatorConverter : JsonConverter -{ - public override SingleFilterConfigOperator Read( - ref Utf8JsonReader reader, - System::Type typeToConvert, - JsonSerializerOptions options - ) - { - return JsonSerializer.Deserialize(ref reader, options) switch - { - "ENDS_WITH" => SingleFilterConfigOperator.EndsWith, - "EQ" => SingleFilterConfigOperator.Eq, - "EXISTS" => SingleFilterConfigOperator.Exists, - "GT" => SingleFilterConfigOperator.Gt, - "GTE" => SingleFilterConfigOperator.Gte, - "INCLUDES" => SingleFilterConfigOperator.Includes, - "IS_AFTER" => SingleFilterConfigOperator.IsAfter, - "IS_BEFORE" => SingleFilterConfigOperator.IsBefore, - "LT" => SingleFilterConfigOperator.Lt, - "LTE" => SingleFilterConfigOperator.Lte, - "NEQ" => SingleFilterConfigOperator.Neq, - "OMIT" => SingleFilterConfigOperator.Omit, - "STARTS_WITH" => SingleFilterConfigOperator.StartsWith, - "AND" => SingleFilterConfigOperator.And, - "OR" => SingleFilterConfigOperator.Or, - _ => (SingleFilterConfigOperator)(-1), - }; - } - - public override void Write( - Utf8JsonWriter writer, - SingleFilterConfigOperator value, - JsonSerializerOptions options - ) - { - JsonSerializer.Serialize( - writer, - value switch - { - SingleFilterConfigOperator.EndsWith => "ENDS_WITH", - SingleFilterConfigOperator.Eq => "EQ", - SingleFilterConfigOperator.Exists => "EXISTS", - SingleFilterConfigOperator.Gt => "GT", - SingleFilterConfigOperator.Gte => "GTE", - SingleFilterConfigOperator.Includes => "INCLUDES", - SingleFilterConfigOperator.IsAfter => "IS_AFTER", - SingleFilterConfigOperator.IsBefore => "IS_BEFORE", - SingleFilterConfigOperator.Lt => "LT", - SingleFilterConfigOperator.Lte => "LTE", - SingleFilterConfigOperator.Neq => "NEQ", - SingleFilterConfigOperator.Omit => "OMIT", - SingleFilterConfigOperator.StartsWith => "STARTS_WITH", - SingleFilterConfigOperator.And => "AND", - SingleFilterConfigOperator.Or => "OR", - _ => throw new CourierInvalidDataException( - string.Format("Invalid value '{0}' in {1}", value, nameof(value)) - ), - }, - options - ); - } -} diff --git a/src/Courier/Models/AuditEvents/AuditEvent.cs b/src/Courier/Models/AuditEvents/AuditEvent.cs index 8d3ff033..c687670c 100644 --- a/src/Courier/Models/AuditEvents/AuditEvent.cs +++ b/src/Courier/Models/AuditEvents/AuditEvent.cs @@ -12,38 +12,62 @@ public sealed record class AuditEvent : JsonModel { public required Actor Actor { - get { return JsonModel.GetNotNullClass(this.RawData, "actor"); } - init { JsonModel.Set(this._rawData, "actor", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("actor"); + } + init { this._rawData.Set("actor", value); } } public required string AuditEventID { - get { return JsonModel.GetNotNullClass(this.RawData, "auditEventId"); } - init { JsonModel.Set(this._rawData, "auditEventId", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("auditEventId"); + } + init { this._rawData.Set("auditEventId", value); } } public required string Source { - get { return JsonModel.GetNotNullClass(this.RawData, "source"); } - init { JsonModel.Set(this._rawData, "source", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("source"); + } + init { this._rawData.Set("source", value); } } public required string Target { - get { return JsonModel.GetNotNullClass(this.RawData, "target"); } - init { JsonModel.Set(this._rawData, "target", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("target"); + } + init { this._rawData.Set("target", value); } } public required string Timestamp { - get { return JsonModel.GetNotNullClass(this.RawData, "timestamp"); } - init { JsonModel.Set(this._rawData, "timestamp", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("timestamp"); + } + init { this._rawData.Set("timestamp", value); } } public required string Type { - get { return JsonModel.GetNotNullClass(this.RawData, "type"); } - init { JsonModel.Set(this._rawData, "type", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("type"); + } + init { this._rawData.Set("type", value); } } /// @@ -64,14 +88,14 @@ public AuditEvent(AuditEvent auditEvent) public AuditEvent(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AuditEvent(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -94,14 +118,22 @@ public sealed record class Actor : JsonModel { public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } public string? Email { - get { return JsonModel.GetNullableClass(this.RawData, "email"); } - init { JsonModel.Set(this._rawData, "email", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("email"); + } + init { this._rawData.Set("email", value); } } /// @@ -118,14 +150,14 @@ public Actor(Actor actor) public Actor(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Actor(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/AuditEvents/AuditEventListParams.cs b/src/Courier/Models/AuditEvents/AuditEventListParams.cs index 0b350c94..c3907e05 100644 --- a/src/Courier/Models/AuditEvents/AuditEventListParams.cs +++ b/src/Courier/Models/AuditEvents/AuditEventListParams.cs @@ -18,8 +18,12 @@ public sealed record class AuditEventListParams : ParamsBase /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawQueryData, "cursor"); } - init { JsonModel.Set(this._rawQueryData, "cursor", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("cursor"); + } + init { this._rawQueryData.Set("cursor", value); } } public AuditEventListParams() { } @@ -32,8 +36,8 @@ public AuditEventListParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -43,8 +47,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/AuditEvents/AuditEventListResponse.cs b/src/Courier/Models/AuditEvents/AuditEventListResponse.cs index 8bfccc0f..c38aed96 100644 --- a/src/Courier/Models/AuditEvents/AuditEventListResponse.cs +++ b/src/Courier/Models/AuditEvents/AuditEventListResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -12,14 +13,28 @@ public sealed record class AuditEventListResponse : JsonModel { public required Paging Paging { - get { return JsonModel.GetNotNullClass(this.RawData, "paging"); } - init { JsonModel.Set(this._rawData, "paging", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("paging"); + } + init { this._rawData.Set("paging", value); } } public required IReadOnlyList Results { - get { return JsonModel.GetNotNullClass>(this.RawData, "results"); } - init { JsonModel.Set(this._rawData, "results", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("results"); + } + init + { + this._rawData.Set>( + "results", + ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -39,14 +54,14 @@ public AuditEventListResponse(AuditEventListResponse auditEventListResponse) public AuditEventListResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AuditEventListResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/AuditEvents/AuditEventRetrieveParams.cs b/src/Courier/Models/AuditEvents/AuditEventRetrieveParams.cs index 855cff3d..c8665a24 100644 --- a/src/Courier/Models/AuditEvents/AuditEventRetrieveParams.cs +++ b/src/Courier/Models/AuditEvents/AuditEventRetrieveParams.cs @@ -28,8 +28,8 @@ public AuditEventRetrieveParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Auth/AuthIssueTokenParams.cs b/src/Courier/Models/Auth/AuthIssueTokenParams.cs index f92faccc..74889dc3 100644 --- a/src/Courier/Models/Auth/AuthIssueTokenParams.cs +++ b/src/Courier/Models/Auth/AuthIssueTokenParams.cs @@ -14,7 +14,7 @@ namespace Courier.Models.Auth; /// public sealed record class AuthIssueTokenParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -27,8 +27,12 @@ public IReadOnlyDictionary RawBodyData /// public required string ExpiresIn { - get { return JsonModel.GetNotNullClass(this.RawBodyData, "expires_in"); } - init { JsonModel.Set(this._rawBodyData, "expires_in", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass("expires_in"); + } + init { this._rawBodyData.Set("expires_in", value); } } /// @@ -47,8 +51,12 @@ public required string ExpiresIn /// public required string Scope { - get { return JsonModel.GetNotNullClass(this.RawBodyData, "scope"); } - init { JsonModel.Set(this._rawBodyData, "scope", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass("scope"); + } + init { this._rawBodyData.Set("scope", value); } } public AuthIssueTokenParams() { } @@ -56,7 +64,7 @@ public AuthIssueTokenParams() { } public AuthIssueTokenParams(AuthIssueTokenParams authIssueTokenParams) : base(authIssueTokenParams) { - this._rawBodyData = [.. authIssueTokenParams._rawBodyData]; + this._rawBodyData = new(authIssueTokenParams._rawBodyData); } public AuthIssueTokenParams( @@ -65,9 +73,9 @@ public AuthIssueTokenParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -78,9 +86,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -109,7 +117,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Auth/AuthIssueTokenResponse.cs b/src/Courier/Models/Auth/AuthIssueTokenResponse.cs index 3e1514f7..d797c450 100644 --- a/src/Courier/Models/Auth/AuthIssueTokenResponse.cs +++ b/src/Courier/Models/Auth/AuthIssueTokenResponse.cs @@ -12,8 +12,12 @@ public sealed record class AuthIssueTokenResponse : JsonModel { public required string Token { - get { return JsonModel.GetNotNullClass(this.RawData, "token"); } - init { JsonModel.Set(this._rawData, "token", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("token"); + } + init { this._rawData.Set("token", value); } } /// @@ -29,14 +33,14 @@ public AuthIssueTokenResponse(AuthIssueTokenResponse authIssueTokenResponse) public AuthIssueTokenResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AuthIssueTokenResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Automations/AutomationInvokeResponse.cs b/src/Courier/Models/Automations/AutomationInvokeResponse.cs index 0402e33b..94c5d065 100644 --- a/src/Courier/Models/Automations/AutomationInvokeResponse.cs +++ b/src/Courier/Models/Automations/AutomationInvokeResponse.cs @@ -14,8 +14,12 @@ public sealed record class AutomationInvokeResponse : JsonModel { public required string RunID { - get { return JsonModel.GetNotNullClass(this.RawData, "runId"); } - init { JsonModel.Set(this._rawData, "runId", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("runId"); + } + init { this._rawData.Set("runId", value); } } /// @@ -31,14 +35,14 @@ public AutomationInvokeResponse(AutomationInvokeResponse automationInvokeRespons public AutomationInvokeResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AutomationInvokeResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Automations/AutomationListParams.cs b/src/Courier/Models/Automations/AutomationListParams.cs index 8aa963a5..d7b8408e 100644 --- a/src/Courier/Models/Automations/AutomationListParams.cs +++ b/src/Courier/Models/Automations/AutomationListParams.cs @@ -21,7 +21,11 @@ public sealed record class AutomationListParams : ParamsBase /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawQueryData, "cursor"); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("cursor"); + } init { if (value == null) @@ -29,7 +33,7 @@ public string? Cursor return; } - JsonModel.Set(this._rawQueryData, "cursor", value); + this._rawQueryData.Set("cursor", value); } } @@ -41,10 +45,8 @@ public ApiEnum? Version { get { - return JsonModel.GetNullableClass>( - this.RawQueryData, - "version" - ); + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass>("version"); } init { @@ -53,7 +55,7 @@ public ApiEnum? Version return; } - JsonModel.Set(this._rawQueryData, "version", value); + this._rawQueryData.Set("version", value); } } @@ -67,8 +69,8 @@ public AutomationListParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -78,8 +80,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Automations/AutomationTemplate.cs b/src/Courier/Models/Automations/AutomationTemplate.cs index 1a1ad3dd..a0070123 100644 --- a/src/Courier/Models/Automations/AutomationTemplate.cs +++ b/src/Courier/Models/Automations/AutomationTemplate.cs @@ -17,8 +17,12 @@ public sealed record class AutomationTemplate : JsonModel /// public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } /// @@ -26,8 +30,12 @@ public required string ID /// public required string Name { - get { return JsonModel.GetNotNullClass(this.RawData, "name"); } - init { JsonModel.Set(this._rawData, "name", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("name"); + } + init { this._rawData.Set("name", value); } } /// @@ -37,12 +45,12 @@ public required ApiEnum Version { get { - return JsonModel.GetNotNullClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>( "version" ); } - init { JsonModel.Set(this._rawData, "version", value); } + init { this._rawData.Set("version", value); } } /// @@ -52,7 +60,8 @@ public required ApiEnum Version { get { - return JsonModel.GetNullableStruct(this.RawData, "createdAt"); + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("createdAt"); } init { @@ -61,7 +70,7 @@ public required ApiEnum Version return; } - JsonModel.Set(this._rawData, "createdAt", value); + this._rawData.Set("createdAt", value); } } @@ -72,7 +81,8 @@ public required ApiEnum Version { get { - return JsonModel.GetNullableStruct(this.RawData, "updatedAt"); + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("updatedAt"); } init { @@ -81,7 +91,7 @@ public required ApiEnum Version return; } - JsonModel.Set(this._rawData, "updatedAt", value); + this._rawData.Set("updatedAt", value); } } @@ -102,14 +112,14 @@ public AutomationTemplate(AutomationTemplate automationTemplate) public AutomationTemplate(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AutomationTemplate(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Automations/AutomationTemplateListResponse.cs b/src/Courier/Models/Automations/AutomationTemplateListResponse.cs index 9effef0d..749ced84 100644 --- a/src/Courier/Models/Automations/AutomationTemplateListResponse.cs +++ b/src/Courier/Models/Automations/AutomationTemplateListResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -20,7 +21,11 @@ public sealed record class AutomationTemplateListResponse : JsonModel /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawData, "cursor"); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("cursor"); + } init { if (value == null) @@ -28,7 +33,7 @@ public string? Cursor return; } - JsonModel.Set(this._rawData, "cursor", value); + this._rawData.Set("cursor", value); } } @@ -36,7 +41,8 @@ public IReadOnlyList? Templates { get { - return JsonModel.GetNullableClass>(this.RawData, "templates"); + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("templates"); } init { @@ -45,7 +51,10 @@ public IReadOnlyList? Templates return; } - JsonModel.Set(this._rawData, "templates", value); + this._rawData.Set?>( + "templates", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); } } @@ -68,14 +77,14 @@ AutomationTemplateListResponse automationTemplateListResponse public AutomationTemplateListResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AutomationTemplateListResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Automations/Invoke/InvokeInvokeAdHocParams.cs b/src/Courier/Models/Automations/Invoke/InvokeInvokeAdHocParams.cs index e6ed2795..bdb0f6c2 100644 --- a/src/Courier/Models/Automations/Invoke/InvokeInvokeAdHocParams.cs +++ b/src/Courier/Models/Automations/Invoke/InvokeInvokeAdHocParams.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Net.Http; using System.Text; @@ -18,7 +19,7 @@ namespace Courier.Models.Automations.Invoke; /// public sealed record class InvokeInvokeAdHocParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -26,50 +27,78 @@ public IReadOnlyDictionary RawBodyData public required Automation Automation { - get { return JsonModel.GetNotNullClass(this.RawBodyData, "automation"); } - init { JsonModel.Set(this._rawBodyData, "automation", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass("automation"); + } + init { this._rawBodyData.Set("automation", value); } } public string? Brand { - get { return JsonModel.GetNullableClass(this.RawBodyData, "brand"); } - init { JsonModel.Set(this._rawBodyData, "brand", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("brand"); + } + init { this._rawBodyData.Set("brand", value); } } public IReadOnlyDictionary? Data { get { - return JsonModel.GetNullableClass>( - this.RawBodyData, + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass>( "data" ); } - init { JsonModel.Set(this._rawBodyData, "data", value); } + init + { + this._rawBodyData.Set?>( + "data", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); + } } public IReadOnlyDictionary? Profile { get { - return JsonModel.GetNullableClass>( - this.RawBodyData, + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass>( "profile" ); } - init { JsonModel.Set(this._rawBodyData, "profile", value); } + init + { + this._rawBodyData.Set?>( + "profile", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); + } } public string? Recipient { - get { return JsonModel.GetNullableClass(this.RawBodyData, "recipient"); } - init { JsonModel.Set(this._rawBodyData, "recipient", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("recipient"); + } + init { this._rawBodyData.Set("recipient", value); } } public string? Template { - get { return JsonModel.GetNullableClass(this.RawBodyData, "template"); } - init { JsonModel.Set(this._rawBodyData, "template", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("template"); + } + init { this._rawBodyData.Set("template", value); } } public InvokeInvokeAdHocParams() { } @@ -77,7 +106,7 @@ public InvokeInvokeAdHocParams() { } public InvokeInvokeAdHocParams(InvokeInvokeAdHocParams invokeInvokeAdHocParams) : base(invokeInvokeAdHocParams) { - this._rawBodyData = [.. invokeInvokeAdHocParams._rawBodyData]; + this._rawBodyData = new(invokeInvokeAdHocParams._rawBodyData); } public InvokeInvokeAdHocParams( @@ -86,9 +115,9 @@ public InvokeInvokeAdHocParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -99,9 +128,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -132,7 +161,7 @@ IReadOnlyDictionary rawBodyData internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); @@ -153,14 +182,28 @@ public sealed record class Automation : JsonModel { public required IReadOnlyList Steps { - get { return JsonModel.GetNotNullClass>(this.RawData, "steps"); } - init { JsonModel.Set(this._rawData, "steps", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("steps"); + } + init + { + this._rawData.Set>( + "steps", + ImmutableArray.ToImmutableArray(value) + ); + } } public string? CancelationToken { - get { return JsonModel.GetNullableClass(this.RawData, "cancelation_token"); } - init { JsonModel.Set(this._rawData, "cancelation_token", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("cancelation_token"); + } + init { this._rawData.Set("cancelation_token", value); } } /// @@ -180,14 +223,14 @@ public Automation(Automation automation) public Automation(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Automation(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -198,7 +241,7 @@ public static Automation FromRawUnchecked(IReadOnlyDictionary steps) + public Automation(IReadOnlyList steps) : this() { this.Steps = steps; @@ -221,7 +264,13 @@ public record class Step : ModelBase public JsonElement Json { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } + get + { + return this._element ??= JsonSerializer.SerializeToElement( + this.Value, + ModelBase.SerializerOptions + ); + } } public string? Brand @@ -746,20 +795,32 @@ public sealed record class AutomationDelayStep : JsonModel { public required ApiEnum Action { - get { return JsonModel.GetNotNullClass>(this.RawData, "action"); } - init { JsonModel.Set(this._rawData, "action", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("action"); + } + init { this._rawData.Set("action", value); } } public string? Duration { - get { return JsonModel.GetNullableClass(this.RawData, "duration"); } - init { JsonModel.Set(this._rawData, "duration", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("duration"); + } + init { this._rawData.Set("duration", value); } } public string? Until { - get { return JsonModel.GetNullableClass(this.RawData, "until"); } - init { JsonModel.Set(this._rawData, "until", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("until"); + } + init { this._rawData.Set("until", value); } } /// @@ -777,14 +838,14 @@ public AutomationDelayStep(AutomationDelayStep automationDelayStep) public AutomationDelayStep(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AutomationDelayStep(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -855,54 +916,74 @@ public required ApiEnum Action { get { - return JsonModel.GetNotNullClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>( "action" ); } - init { JsonModel.Set(this._rawData, "action", value); } + init { this._rawData.Set("action", value); } } public string? Brand { - get { return JsonModel.GetNullableClass(this.RawData, "brand"); } - init { JsonModel.Set(this._rawData, "brand", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("brand"); + } + init { this._rawData.Set("brand", value); } } public IReadOnlyDictionary? Data { get { - return JsonModel.GetNullableClass>( - this.RawData, - "data" + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("data"); + } + init + { + this._rawData.Set?>( + "data", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "data", value); } } public IReadOnlyDictionary? Profile { get { - return JsonModel.GetNullableClass>( - this.RawData, - "profile" + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("profile"); + } + init + { + this._rawData.Set?>( + "profile", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "profile", value); } } public string? Recipient { - get { return JsonModel.GetNullableClass(this.RawData, "recipient"); } - init { JsonModel.Set(this._rawData, "recipient", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("recipient"); + } + init { this._rawData.Set("recipient", value); } } public string? Template { - get { return JsonModel.GetNullableClass(this.RawData, "template"); } - init { JsonModel.Set(this._rawData, "template", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("template"); + } + init { this._rawData.Set("template", value); } } /// @@ -923,14 +1004,14 @@ public AutomationSendStep(AutomationSendStep automationSendStep) public AutomationSendStep(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AutomationSendStep(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -1005,36 +1086,48 @@ public required ApiEnum Action { get { - return JsonModel.GetNotNullClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>( "action" ); } - init { JsonModel.Set(this._rawData, "action", value); } + init { this._rawData.Set("action", value); } } public required string List { - get { return JsonModel.GetNotNullClass(this.RawData, "list"); } - init { JsonModel.Set(this._rawData, "list", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("list"); + } + init { this._rawData.Set("list", value); } } public string? Brand { - get { return JsonModel.GetNullableClass(this.RawData, "brand"); } - init { JsonModel.Set(this._rawData, "brand", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("brand"); + } + init { this._rawData.Set("brand", value); } } public IReadOnlyDictionary? Data { get { - return JsonModel.GetNullableClass>( - this.RawData, - "data" + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("data"); + } + init + { + this._rawData.Set?>( + "data", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "data", value); } } /// @@ -1053,14 +1146,14 @@ public AutomationSendListStep(AutomationSendListStep automationSendListStep) public AutomationSendListStep(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AutomationSendListStep(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -1131,36 +1224,48 @@ public required ApiEnum Action { get { - return JsonModel.GetNotNullClass>( - this.RawData, - "action" - ); + this._rawData.Freeze(); + return this._rawData.GetNotNullClass< + ApiEnum + >("action"); } - init { JsonModel.Set(this._rawData, "action", value); } + init { this._rawData.Set("action", value); } } public required IReadOnlyDictionary Profile { get { - return JsonModel.GetNotNullClass>( - this.RawData, - "profile" + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("profile"); + } + init + { + this._rawData.Set>( + "profile", + FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "profile", value); } } public ApiEnum? Merge { - get { return JsonModel.GetNullableClass>(this.RawData, "merge"); } - init { JsonModel.Set(this._rawData, "merge", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("merge"); + } + init { this._rawData.Set("merge", value); } } public string? RecipientID { - get { return JsonModel.GetNullableClass(this.RawData, "recipient_id"); } - init { JsonModel.Set(this._rawData, "recipient_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("recipient_id"); + } + init { this._rawData.Set("recipient_id", value); } } /// @@ -1179,14 +1284,14 @@ public AutomationUpdateProfileStep(AutomationUpdateProfileStep automationUpdateP public AutomationUpdateProfileStep(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AutomationUpdateProfileStep(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -1302,18 +1407,22 @@ public required ApiEnum Action { get { - return JsonModel.GetNotNullClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>( "action" ); } - init { JsonModel.Set(this._rawData, "action", value); } + init { this._rawData.Set("action", value); } } public required string CancelationToken { - get { return JsonModel.GetNotNullClass(this.RawData, "cancelation_token"); } - init { JsonModel.Set(this._rawData, "cancelation_token", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("cancelation_token"); + } + init { this._rawData.Set("cancelation_token", value); } } /// @@ -1330,14 +1439,14 @@ public AutomationCancelStep(AutomationCancelStep automationCancelStep) public AutomationCancelStep(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AutomationCancelStep(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -1406,30 +1515,32 @@ public required ApiEnum Action { get { - return JsonModel.GetNotNullClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>( "action" ); } - init { JsonModel.Set(this._rawData, "action", value); } + init { this._rawData.Set("action", value); } } public required Webhook Webhook { - get { return JsonModel.GetNotNullClass(this.RawData, "webhook"); } - init { JsonModel.Set(this._rawData, "webhook", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("webhook"); + } + init { this._rawData.Set("webhook", value); } } public ApiEnum? MergeStrategy { get { - return JsonModel.GetNullableClass>( - this.RawData, - "merge_strategy" - ); + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("merge_strategy"); } - init { JsonModel.Set(this._rawData, "merge_strategy", value); } + init { this._rawData.Set("merge_strategy", value); } } /// @@ -1447,14 +1558,14 @@ public AutomationFetchDataStep(AutomationFetchDataStep automationFetchDataStep) public AutomationFetchDataStep(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AutomationFetchDataStep(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -1523,32 +1634,48 @@ public sealed record class Webhook : JsonModel { get { - return JsonModel.GetNotNullClass< + this._rawData.Freeze(); + return this._rawData.GetNotNullClass< ApiEnum - >(this.RawData, "method"); + >("method"); } - init { JsonModel.Set(this._rawData, "method", value); } + init { this._rawData.Set("method", value); } } public required string Url { - get { return JsonModel.GetNotNullClass(this.RawData, "url"); } - init { JsonModel.Set(this._rawData, "url", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("url"); + } + init { this._rawData.Set("url", value); } } public string? Body { - get { return JsonModel.GetNullableClass(this.RawData, "body"); } - init { JsonModel.Set(this._rawData, "body", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("body"); + } + init { this._rawData.Set("body", value); } } public IReadOnlyDictionary? Headers { get { - return JsonModel.GetNullableClass>(this.RawData, "headers"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("headers"); + } + init + { + this._rawData.Set?>( + "headers", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); } - init { JsonModel.Set(this._rawData, "headers", value); } } /// @@ -1567,14 +1694,14 @@ public Webhook(Webhook webhook) public Webhook(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Webhook(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -1699,18 +1826,22 @@ public required ApiEnum Action { get { - return JsonModel.GetNotNullClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>( "action" ); } - init { JsonModel.Set(this._rawData, "action", value); } + init { this._rawData.Set("action", value); } } public required string Template { - get { return JsonModel.GetNotNullClass(this.RawData, "template"); } - init { JsonModel.Set(this._rawData, "template", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("template"); + } + init { this._rawData.Set("template", value); } } /// @@ -1727,14 +1858,14 @@ public AutomationInvokeStep(AutomationInvokeStep automationInvokeStep) public AutomationInvokeStep(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] AutomationInvokeStep(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Automations/Invoke/InvokeInvokeByTemplateParams.cs b/src/Courier/Models/Automations/Invoke/InvokeInvokeByTemplateParams.cs index 17ac3ec1..777597a7 100644 --- a/src/Courier/Models/Automations/Invoke/InvokeInvokeByTemplateParams.cs +++ b/src/Courier/Models/Automations/Invoke/InvokeInvokeByTemplateParams.cs @@ -14,7 +14,7 @@ namespace Courier.Models.Automations.Invoke; /// public sealed record class InvokeInvokeByTemplateParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -24,44 +24,68 @@ public IReadOnlyDictionary RawBodyData public required string? Recipient { - get { return JsonModel.GetNullableClass(this.RawBodyData, "recipient"); } - init { JsonModel.Set(this._rawBodyData, "recipient", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("recipient"); + } + init { this._rawBodyData.Set("recipient", value); } } public string? Brand { - get { return JsonModel.GetNullableClass(this.RawBodyData, "brand"); } - init { JsonModel.Set(this._rawBodyData, "brand", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("brand"); + } + init { this._rawBodyData.Set("brand", value); } } public IReadOnlyDictionary? Data { get { - return JsonModel.GetNullableClass>( - this.RawBodyData, + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass>( "data" ); } - init { JsonModel.Set(this._rawBodyData, "data", value); } + init + { + this._rawBodyData.Set?>( + "data", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); + } } public IReadOnlyDictionary? Profile { get { - return JsonModel.GetNullableClass>( - this.RawBodyData, + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass>( "profile" ); } - init { JsonModel.Set(this._rawBodyData, "profile", value); } + init + { + this._rawBodyData.Set?>( + "profile", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); + } } public string? Template { - get { return JsonModel.GetNullableClass(this.RawBodyData, "template"); } - init { JsonModel.Set(this._rawBodyData, "template", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("template"); + } + init { this._rawBodyData.Set("template", value); } } public InvokeInvokeByTemplateParams() { } @@ -71,7 +95,7 @@ public InvokeInvokeByTemplateParams(InvokeInvokeByTemplateParams invokeInvokeByT { this.TemplateID = invokeInvokeByTemplateParams.TemplateID; - this._rawBodyData = [.. invokeInvokeByTemplateParams._rawBodyData]; + this._rawBodyData = new(invokeInvokeByTemplateParams._rawBodyData); } public InvokeInvokeByTemplateParams( @@ -80,9 +104,9 @@ public InvokeInvokeByTemplateParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -93,9 +117,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -127,7 +151,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Brands/Brand.cs b/src/Courier/Models/Brands/Brand.cs index e685b1b1..65bbad5d 100644 --- a/src/Courier/Models/Brands/Brand.cs +++ b/src/Courier/Models/Brands/Brand.cs @@ -12,50 +12,82 @@ public sealed record class Brand : JsonModel { public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } public required long Created { - get { return JsonModel.GetNotNullStruct(this.RawData, "created"); } - init { JsonModel.Set(this._rawData, "created", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("created"); + } + init { this._rawData.Set("created", value); } } public required string Name { - get { return JsonModel.GetNotNullClass(this.RawData, "name"); } - init { JsonModel.Set(this._rawData, "name", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("name"); + } + init { this._rawData.Set("name", value); } } public required long Updated { - get { return JsonModel.GetNotNullStruct(this.RawData, "updated"); } - init { JsonModel.Set(this._rawData, "updated", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("updated"); + } + init { this._rawData.Set("updated", value); } } public long? Published { - get { return JsonModel.GetNullableStruct(this.RawData, "published"); } - init { JsonModel.Set(this._rawData, "published", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("published"); + } + init { this._rawData.Set("published", value); } } public BrandSettings? Settings { - get { return JsonModel.GetNullableClass(this.RawData, "settings"); } - init { JsonModel.Set(this._rawData, "settings", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("settings"); + } + init { this._rawData.Set("settings", value); } } public BrandSnippets? Snippets { - get { return JsonModel.GetNullableClass(this.RawData, "snippets"); } - init { JsonModel.Set(this._rawData, "snippets", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("snippets"); + } + init { this._rawData.Set("snippets", value); } } public string? Version { - get { return JsonModel.GetNullableClass(this.RawData, "version"); } - init { JsonModel.Set(this._rawData, "version", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("version"); + } + init { this._rawData.Set("version", value); } } /// @@ -78,14 +110,14 @@ public Brand(Brand brand) public Brand(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Brand(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/BrandColors.cs b/src/Courier/Models/Brands/BrandColors.cs index beac9a95..49d35533 100644 --- a/src/Courier/Models/Brands/BrandColors.cs +++ b/src/Courier/Models/Brands/BrandColors.cs @@ -12,7 +12,11 @@ public sealed record class BrandColors : JsonModel { public string? Primary { - get { return JsonModel.GetNullableClass(this.RawData, "primary"); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("primary"); + } init { if (value == null) @@ -20,13 +24,17 @@ public string? Primary return; } - JsonModel.Set(this._rawData, "primary", value); + this._rawData.Set("primary", value); } } public string? Secondary { - get { return JsonModel.GetNullableClass(this.RawData, "secondary"); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("secondary"); + } init { if (value == null) @@ -34,7 +42,7 @@ public string? Secondary return; } - JsonModel.Set(this._rawData, "secondary", value); + this._rawData.Set("secondary", value); } } @@ -52,14 +60,14 @@ public BrandColors(BrandColors brandColors) public BrandColors(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] BrandColors(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/BrandCreateParams.cs b/src/Courier/Models/Brands/BrandCreateParams.cs index e4675a96..846924a1 100644 --- a/src/Courier/Models/Brands/BrandCreateParams.cs +++ b/src/Courier/Models/Brands/BrandCreateParams.cs @@ -14,7 +14,7 @@ namespace Courier.Models.Brands; /// public sealed record class BrandCreateParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -22,26 +22,42 @@ public IReadOnlyDictionary RawBodyData public required string Name { - get { return JsonModel.GetNotNullClass(this.RawBodyData, "name"); } - init { JsonModel.Set(this._rawBodyData, "name", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass("name"); + } + init { this._rawBodyData.Set("name", value); } } public string? ID { - get { return JsonModel.GetNullableClass(this.RawBodyData, "id"); } - init { JsonModel.Set(this._rawBodyData, "id", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("id"); + } + init { this._rawBodyData.Set("id", value); } } public BrandSettings? Settings { - get { return JsonModel.GetNullableClass(this.RawBodyData, "settings"); } - init { JsonModel.Set(this._rawBodyData, "settings", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("settings"); + } + init { this._rawBodyData.Set("settings", value); } } public BrandSnippets? Snippets { - get { return JsonModel.GetNullableClass(this.RawBodyData, "snippets"); } - init { JsonModel.Set(this._rawBodyData, "snippets", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("snippets"); + } + init { this._rawBodyData.Set("snippets", value); } } public BrandCreateParams() { } @@ -49,7 +65,7 @@ public BrandCreateParams() { } public BrandCreateParams(BrandCreateParams brandCreateParams) : base(brandCreateParams) { - this._rawBodyData = [.. brandCreateParams._rawBodyData]; + this._rawBodyData = new(brandCreateParams._rawBodyData); } public BrandCreateParams( @@ -58,9 +74,9 @@ public BrandCreateParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -71,9 +87,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -102,7 +118,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Brands/BrandDeleteParams.cs b/src/Courier/Models/Brands/BrandDeleteParams.cs index 1056a380..fadfae34 100644 --- a/src/Courier/Models/Brands/BrandDeleteParams.cs +++ b/src/Courier/Models/Brands/BrandDeleteParams.cs @@ -28,8 +28,8 @@ public BrandDeleteParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/BrandListParams.cs b/src/Courier/Models/Brands/BrandListParams.cs index 30815b09..cf2292bf 100644 --- a/src/Courier/Models/Brands/BrandListParams.cs +++ b/src/Courier/Models/Brands/BrandListParams.cs @@ -18,8 +18,12 @@ public sealed record class BrandListParams : ParamsBase /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawQueryData, "cursor"); } - init { JsonModel.Set(this._rawQueryData, "cursor", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("cursor"); + } + init { this._rawQueryData.Set("cursor", value); } } public BrandListParams() { } @@ -32,8 +36,8 @@ public BrandListParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -43,8 +47,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/BrandListResponse.cs b/src/Courier/Models/Brands/BrandListResponse.cs index 5a7caf3e..27627a79 100644 --- a/src/Courier/Models/Brands/BrandListResponse.cs +++ b/src/Courier/Models/Brands/BrandListResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -12,14 +13,28 @@ public sealed record class BrandListResponse : JsonModel { public required Paging Paging { - get { return JsonModel.GetNotNullClass(this.RawData, "paging"); } - init { JsonModel.Set(this._rawData, "paging", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("paging"); + } + init { this._rawData.Set("paging", value); } } public required IReadOnlyList Results { - get { return JsonModel.GetNotNullClass>(this.RawData, "results"); } - init { JsonModel.Set(this._rawData, "results", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("results"); + } + init + { + this._rawData.Set>( + "results", + ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -39,14 +54,14 @@ public BrandListResponse(BrandListResponse brandListResponse) public BrandListResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] BrandListResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/BrandRetrieveParams.cs b/src/Courier/Models/Brands/BrandRetrieveParams.cs index c00311da..21dfab22 100644 --- a/src/Courier/Models/Brands/BrandRetrieveParams.cs +++ b/src/Courier/Models/Brands/BrandRetrieveParams.cs @@ -28,8 +28,8 @@ public BrandRetrieveParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/BrandSettings.cs b/src/Courier/Models/Brands/BrandSettings.cs index 805297a2..7f2a3315 100644 --- a/src/Courier/Models/Brands/BrandSettings.cs +++ b/src/Courier/Models/Brands/BrandSettings.cs @@ -12,20 +12,32 @@ public sealed record class BrandSettings : JsonModel { public BrandColors? Colors { - get { return JsonModel.GetNullableClass(this.RawData, "colors"); } - init { JsonModel.Set(this._rawData, "colors", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("colors"); + } + init { this._rawData.Set("colors", value); } } public BrandSettingsEmail? Email { - get { return JsonModel.GetNullableClass(this.RawData, "email"); } - init { JsonModel.Set(this._rawData, "email", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("email"); + } + init { this._rawData.Set("email", value); } } public BrandSettingsInApp? Inapp { - get { return JsonModel.GetNullableClass(this.RawData, "inapp"); } - init { JsonModel.Set(this._rawData, "inapp", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("inapp"); + } + init { this._rawData.Set("inapp", value); } } /// @@ -43,14 +55,14 @@ public BrandSettings(BrandSettings brandSettings) public BrandSettings(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] BrandSettings(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/BrandSettingsEmail.cs b/src/Courier/Models/Brands/BrandSettingsEmail.cs index e70aa1ee..80a2a3be 100644 --- a/src/Courier/Models/Brands/BrandSettingsEmail.cs +++ b/src/Courier/Models/Brands/BrandSettingsEmail.cs @@ -12,29 +12,42 @@ public sealed record class BrandSettingsEmail : JsonModel { public EmailFooter? Footer { - get { return JsonModel.GetNullableClass(this.RawData, "footer"); } - init { JsonModel.Set(this._rawData, "footer", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("footer"); + } + init { this._rawData.Set("footer", value); } } public EmailHead? Head { - get { return JsonModel.GetNullableClass(this.RawData, "head"); } - init { JsonModel.Set(this._rawData, "head", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("head"); + } + init { this._rawData.Set("head", value); } } public EmailHeader? Header { - get { return JsonModel.GetNullableClass(this.RawData, "header"); } - init { JsonModel.Set(this._rawData, "header", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("header"); + } + init { this._rawData.Set("header", value); } } public TemplateOverride? TemplateOverride { get { - return JsonModel.GetNullableClass(this.RawData, "templateOverride"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass("templateOverride"); } - init { JsonModel.Set(this._rawData, "templateOverride", value); } + init { this._rawData.Set("templateOverride", value); } } /// @@ -53,14 +66,14 @@ public BrandSettingsEmail(BrandSettingsEmail brandSettingsEmail) public BrandSettingsEmail(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] BrandSettingsEmail(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -85,62 +98,102 @@ public sealed record class TemplateOverride : JsonModel { public required bool Enabled { - get { return JsonModel.GetNotNullStruct(this.RawData, "enabled"); } - init { JsonModel.Set(this._rawData, "enabled", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("enabled"); + } + init { this._rawData.Set("enabled", value); } } public string? BackgroundColor { - get { return JsonModel.GetNullableClass(this.RawData, "backgroundColor"); } - init { JsonModel.Set(this._rawData, "backgroundColor", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("backgroundColor"); + } + init { this._rawData.Set("backgroundColor", value); } } public string? BlocksBackgroundColor { - get { return JsonModel.GetNullableClass(this.RawData, "blocksBackgroundColor"); } - init { JsonModel.Set(this._rawData, "blocksBackgroundColor", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("blocksBackgroundColor"); + } + init { this._rawData.Set("blocksBackgroundColor", value); } } public string? Footer { - get { return JsonModel.GetNullableClass(this.RawData, "footer"); } - init { JsonModel.Set(this._rawData, "footer", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("footer"); + } + init { this._rawData.Set("footer", value); } } public string? Head { - get { return JsonModel.GetNullableClass(this.RawData, "head"); } - init { JsonModel.Set(this._rawData, "head", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("head"); + } + init { this._rawData.Set("head", value); } } public string? Header { - get { return JsonModel.GetNullableClass(this.RawData, "header"); } - init { JsonModel.Set(this._rawData, "header", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("header"); + } + init { this._rawData.Set("header", value); } } public string? Width { - get { return JsonModel.GetNullableClass(this.RawData, "width"); } - init { JsonModel.Set(this._rawData, "width", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("width"); + } + init { this._rawData.Set("width", value); } } public required BrandTemplate Mjml { - get { return JsonModel.GetNotNullClass(this.RawData, "mjml"); } - init { JsonModel.Set(this._rawData, "mjml", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("mjml"); + } + init { this._rawData.Set("mjml", value); } } public string? FooterBackgroundColor { - get { return JsonModel.GetNullableClass(this.RawData, "footerBackgroundColor"); } - init { JsonModel.Set(this._rawData, "footerBackgroundColor", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("footerBackgroundColor"); + } + init { this._rawData.Set("footerBackgroundColor", value); } } public bool? FooterFullWidth { - get { return JsonModel.GetNullableStruct(this.RawData, "footerFullWidth"); } - init { JsonModel.Set(this._rawData, "footerFullWidth", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("footerFullWidth"); + } + init { this._rawData.Set("footerFullWidth", value); } } public static implicit operator BrandTemplate(TemplateOverride templateOverride) => @@ -177,14 +230,14 @@ public TemplateOverride(TemplateOverride templateOverride) public TemplateOverride(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] TemplateOverride(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -214,20 +267,32 @@ public sealed record class IntersectionMember1 : JsonModel { public required BrandTemplate Mjml { - get { return JsonModel.GetNotNullClass(this.RawData, "mjml"); } - init { JsonModel.Set(this._rawData, "mjml", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("mjml"); + } + init { this._rawData.Set("mjml", value); } } public string? FooterBackgroundColor { - get { return JsonModel.GetNullableClass(this.RawData, "footerBackgroundColor"); } - init { JsonModel.Set(this._rawData, "footerBackgroundColor", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("footerBackgroundColor"); + } + init { this._rawData.Set("footerBackgroundColor", value); } } public bool? FooterFullWidth { - get { return JsonModel.GetNullableStruct(this.RawData, "footerFullWidth"); } - init { JsonModel.Set(this._rawData, "footerFullWidth", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("footerFullWidth"); + } + init { this._rawData.Set("footerFullWidth", value); } } /// @@ -247,14 +312,14 @@ public IntersectionMember1( public IntersectionMember1(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] IntersectionMember1(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/BrandSettingsInApp.cs b/src/Courier/Models/Brands/BrandSettingsInApp.cs index e85ca76a..7c6f5d15 100644 --- a/src/Courier/Models/Brands/BrandSettingsInApp.cs +++ b/src/Courier/Models/Brands/BrandSettingsInApp.cs @@ -14,53 +14,72 @@ public sealed record class BrandSettingsInApp : JsonModel { public required BrandColors Colors { - get { return JsonModel.GetNotNullClass(this.RawData, "colors"); } - init { JsonModel.Set(this._rawData, "colors", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("colors"); + } + init { this._rawData.Set("colors", value); } } public required Icons Icons { - get { return JsonModel.GetNotNullClass(this.RawData, "icons"); } - init { JsonModel.Set(this._rawData, "icons", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("icons"); + } + init { this._rawData.Set("icons", value); } } public required WidgetBackground WidgetBackground { get { - return JsonModel.GetNotNullClass(this.RawData, "widgetBackground"); + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("widgetBackground"); } - init { JsonModel.Set(this._rawData, "widgetBackground", value); } + init { this._rawData.Set("widgetBackground", value); } } public string? BorderRadius { - get { return JsonModel.GetNullableClass(this.RawData, "borderRadius"); } - init { JsonModel.Set(this._rawData, "borderRadius", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("borderRadius"); + } + init { this._rawData.Set("borderRadius", value); } } public bool? DisableMessageIcon { - get { return JsonModel.GetNullableStruct(this.RawData, "disableMessageIcon"); } - init { JsonModel.Set(this._rawData, "disableMessageIcon", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("disableMessageIcon"); + } + init { this._rawData.Set("disableMessageIcon", value); } } public string? FontFamily { - get { return JsonModel.GetNullableClass(this.RawData, "fontFamily"); } - init { JsonModel.Set(this._rawData, "fontFamily", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("fontFamily"); + } + init { this._rawData.Set("fontFamily", value); } } public ApiEnum? Placement { get { - return JsonModel.GetNullableClass>( - this.RawData, - "placement" - ); + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("placement"); } - init { JsonModel.Set(this._rawData, "placement", value); } + init { this._rawData.Set("placement", value); } } /// @@ -82,14 +101,14 @@ public BrandSettingsInApp(BrandSettingsInApp brandSettingsInApp) public BrandSettingsInApp(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] BrandSettingsInApp(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/BrandSnippet.cs b/src/Courier/Models/Brands/BrandSnippet.cs index 68424e52..7ee953ae 100644 --- a/src/Courier/Models/Brands/BrandSnippet.cs +++ b/src/Courier/Models/Brands/BrandSnippet.cs @@ -12,14 +12,22 @@ public sealed record class BrandSnippet : JsonModel { public required string Name { - get { return JsonModel.GetNotNullClass(this.RawData, "name"); } - init { JsonModel.Set(this._rawData, "name", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("name"); + } + init { this._rawData.Set("name", value); } } public required string Value { - get { return JsonModel.GetNotNullClass(this.RawData, "value"); } - init { JsonModel.Set(this._rawData, "value", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("value"); + } + init { this._rawData.Set("value", value); } } /// @@ -36,14 +44,14 @@ public BrandSnippet(BrandSnippet brandSnippet) public BrandSnippet(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] BrandSnippet(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/BrandSnippets.cs b/src/Courier/Models/Brands/BrandSnippets.cs index 2b753ea0..a6c93b80 100644 --- a/src/Courier/Models/Brands/BrandSnippets.cs +++ b/src/Courier/Models/Brands/BrandSnippets.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -12,8 +13,18 @@ public sealed record class BrandSnippets : JsonModel { public IReadOnlyList? Items { - get { return JsonModel.GetNullableClass>(this.RawData, "items"); } - init { JsonModel.Set(this._rawData, "items", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("items"); + } + init + { + this._rawData.Set?>( + "items", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -32,14 +43,14 @@ public BrandSnippets(BrandSnippets brandSnippets) public BrandSnippets(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] BrandSnippets(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/BrandTemplate.cs b/src/Courier/Models/Brands/BrandTemplate.cs index c955de33..e1f4d375 100644 --- a/src/Courier/Models/Brands/BrandTemplate.cs +++ b/src/Courier/Models/Brands/BrandTemplate.cs @@ -12,44 +12,72 @@ public sealed record class BrandTemplate : JsonModel { public required bool Enabled { - get { return JsonModel.GetNotNullStruct(this.RawData, "enabled"); } - init { JsonModel.Set(this._rawData, "enabled", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("enabled"); + } + init { this._rawData.Set("enabled", value); } } public string? BackgroundColor { - get { return JsonModel.GetNullableClass(this.RawData, "backgroundColor"); } - init { JsonModel.Set(this._rawData, "backgroundColor", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("backgroundColor"); + } + init { this._rawData.Set("backgroundColor", value); } } public string? BlocksBackgroundColor { - get { return JsonModel.GetNullableClass(this.RawData, "blocksBackgroundColor"); } - init { JsonModel.Set(this._rawData, "blocksBackgroundColor", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("blocksBackgroundColor"); + } + init { this._rawData.Set("blocksBackgroundColor", value); } } public string? Footer { - get { return JsonModel.GetNullableClass(this.RawData, "footer"); } - init { JsonModel.Set(this._rawData, "footer", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("footer"); + } + init { this._rawData.Set("footer", value); } } public string? Head { - get { return JsonModel.GetNullableClass(this.RawData, "head"); } - init { JsonModel.Set(this._rawData, "head", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("head"); + } + init { this._rawData.Set("head", value); } } public string? Header { - get { return JsonModel.GetNullableClass(this.RawData, "header"); } - init { JsonModel.Set(this._rawData, "header", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("header"); + } + init { this._rawData.Set("header", value); } } public string? Width { - get { return JsonModel.GetNullableClass(this.RawData, "width"); } - init { JsonModel.Set(this._rawData, "width", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("width"); + } + init { this._rawData.Set("width", value); } } /// @@ -71,14 +99,14 @@ public BrandTemplate(BrandTemplate brandTemplate) public BrandTemplate(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] BrandTemplate(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/BrandUpdateParams.cs b/src/Courier/Models/Brands/BrandUpdateParams.cs index 0cf4dda9..b224ab11 100644 --- a/src/Courier/Models/Brands/BrandUpdateParams.cs +++ b/src/Courier/Models/Brands/BrandUpdateParams.cs @@ -14,7 +14,7 @@ namespace Courier.Models.Brands; /// public sealed record class BrandUpdateParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -27,20 +27,32 @@ public IReadOnlyDictionary RawBodyData /// public required string Name { - get { return JsonModel.GetNotNullClass(this.RawBodyData, "name"); } - init { JsonModel.Set(this._rawBodyData, "name", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass("name"); + } + init { this._rawBodyData.Set("name", value); } } public BrandSettings? Settings { - get { return JsonModel.GetNullableClass(this.RawBodyData, "settings"); } - init { JsonModel.Set(this._rawBodyData, "settings", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("settings"); + } + init { this._rawBodyData.Set("settings", value); } } public BrandSnippets? Snippets { - get { return JsonModel.GetNullableClass(this.RawBodyData, "snippets"); } - init { JsonModel.Set(this._rawBodyData, "snippets", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("snippets"); + } + init { this._rawBodyData.Set("snippets", value); } } public BrandUpdateParams() { } @@ -50,7 +62,7 @@ public BrandUpdateParams(BrandUpdateParams brandUpdateParams) { this.BrandID = brandUpdateParams.BrandID; - this._rawBodyData = [.. brandUpdateParams._rawBodyData]; + this._rawBodyData = new(brandUpdateParams._rawBodyData); } public BrandUpdateParams( @@ -59,9 +71,9 @@ public BrandUpdateParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -72,9 +84,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -105,7 +117,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Brands/EmailFooter.cs b/src/Courier/Models/Brands/EmailFooter.cs index d035df34..e0be3ad2 100644 --- a/src/Courier/Models/Brands/EmailFooter.cs +++ b/src/Courier/Models/Brands/EmailFooter.cs @@ -12,14 +12,22 @@ public sealed record class EmailFooter : JsonModel { public string? Content { - get { return JsonModel.GetNullableClass(this.RawData, "content"); } - init { JsonModel.Set(this._rawData, "content", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("content"); + } + init { this._rawData.Set("content", value); } } public bool? InheritDefault { - get { return JsonModel.GetNullableStruct(this.RawData, "inheritDefault"); } - init { JsonModel.Set(this._rawData, "inheritDefault", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("inheritDefault"); + } + init { this._rawData.Set("inheritDefault", value); } } /// @@ -36,14 +44,14 @@ public EmailFooter(EmailFooter emailFooter) public EmailFooter(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] EmailFooter(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/EmailHead.cs b/src/Courier/Models/Brands/EmailHead.cs index a7f1b880..ea4f109f 100644 --- a/src/Courier/Models/Brands/EmailHead.cs +++ b/src/Courier/Models/Brands/EmailHead.cs @@ -12,14 +12,22 @@ public sealed record class EmailHead : JsonModel { public required bool InheritDefault { - get { return JsonModel.GetNotNullStruct(this.RawData, "inheritDefault"); } - init { JsonModel.Set(this._rawData, "inheritDefault", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("inheritDefault"); + } + init { this._rawData.Set("inheritDefault", value); } } public string? Content { - get { return JsonModel.GetNullableClass(this.RawData, "content"); } - init { JsonModel.Set(this._rawData, "content", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("content"); + } + init { this._rawData.Set("content", value); } } /// @@ -36,14 +44,14 @@ public EmailHead(EmailHead emailHead) public EmailHead(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] EmailHead(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/EmailHeader.cs b/src/Courier/Models/Brands/EmailHeader.cs index 3a3625e9..573fbcfc 100644 --- a/src/Courier/Models/Brands/EmailHeader.cs +++ b/src/Courier/Models/Brands/EmailHeader.cs @@ -12,20 +12,32 @@ public sealed record class EmailHeader : JsonModel { public required Logo Logo { - get { return JsonModel.GetNotNullClass(this.RawData, "logo"); } - init { JsonModel.Set(this._rawData, "logo", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("logo"); + } + init { this._rawData.Set("logo", value); } } public string? BarColor { - get { return JsonModel.GetNullableClass(this.RawData, "barColor"); } - init { JsonModel.Set(this._rawData, "barColor", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("barColor"); + } + init { this._rawData.Set("barColor", value); } } public bool? InheritDefault { - get { return JsonModel.GetNullableStruct(this.RawData, "inheritDefault"); } - init { JsonModel.Set(this._rawData, "inheritDefault", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("inheritDefault"); + } + init { this._rawData.Set("inheritDefault", value); } } /// @@ -43,14 +55,14 @@ public EmailHeader(EmailHeader emailHeader) public EmailHeader(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] EmailHeader(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/Icons.cs b/src/Courier/Models/Brands/Icons.cs index f37b870c..f1a31bf6 100644 --- a/src/Courier/Models/Brands/Icons.cs +++ b/src/Courier/Models/Brands/Icons.cs @@ -12,14 +12,22 @@ public sealed record class Icons : JsonModel { public string? Bell { - get { return JsonModel.GetNullableClass(this.RawData, "bell"); } - init { JsonModel.Set(this._rawData, "bell", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("bell"); + } + init { this._rawData.Set("bell", value); } } public string? Message { - get { return JsonModel.GetNullableClass(this.RawData, "message"); } - init { JsonModel.Set(this._rawData, "message", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("message"); + } + init { this._rawData.Set("message", value); } } /// @@ -36,14 +44,14 @@ public Icons(Icons icons) public Icons(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Icons(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/Logo.cs b/src/Courier/Models/Brands/Logo.cs index cc352ac9..ac21f515 100644 --- a/src/Courier/Models/Brands/Logo.cs +++ b/src/Courier/Models/Brands/Logo.cs @@ -12,14 +12,22 @@ public sealed record class Logo : JsonModel { public string? Href { - get { return JsonModel.GetNullableClass(this.RawData, "href"); } - init { JsonModel.Set(this._rawData, "href", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("href"); + } + init { this._rawData.Set("href", value); } } public string? Image { - get { return JsonModel.GetNullableClass(this.RawData, "image"); } - init { JsonModel.Set(this._rawData, "image", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("image"); + } + init { this._rawData.Set("image", value); } } /// @@ -36,14 +44,14 @@ public Logo(Logo logo) public Logo(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Logo(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Brands/WidgetBackground.cs b/src/Courier/Models/Brands/WidgetBackground.cs index 57a87d39..6e8f0aa0 100644 --- a/src/Courier/Models/Brands/WidgetBackground.cs +++ b/src/Courier/Models/Brands/WidgetBackground.cs @@ -12,14 +12,22 @@ public sealed record class WidgetBackground : JsonModel { public string? BottomColor { - get { return JsonModel.GetNullableClass(this.RawData, "bottomColor"); } - init { JsonModel.Set(this._rawData, "bottomColor", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("bottomColor"); + } + init { this._rawData.Set("bottomColor", value); } } public string? TopColor { - get { return JsonModel.GetNullableClass(this.RawData, "topColor"); } - init { JsonModel.Set(this._rawData, "topColor", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("topColor"); + } + init { this._rawData.Set("topColor", value); } } /// @@ -36,14 +44,14 @@ public WidgetBackground(WidgetBackground widgetBackground) public WidgetBackground(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] WidgetBackground(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Bulk/BulkAddUsersParams.cs b/src/Courier/Models/Bulk/BulkAddUsersParams.cs index 2aad9920..11901f18 100644 --- a/src/Courier/Models/Bulk/BulkAddUsersParams.cs +++ b/src/Courier/Models/Bulk/BulkAddUsersParams.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Net.Http; using System.Text; @@ -18,7 +19,7 @@ namespace Courier.Models.Bulk; /// public sealed record class BulkAddUsersParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -30,12 +31,18 @@ public required IReadOnlyList Users { get { - return JsonModel.GetNotNullClass>( - this.RawBodyData, + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullStruct>( "users" ); } - init { JsonModel.Set(this._rawBodyData, "users", value); } + init + { + this._rawBodyData.Set>( + "users", + ImmutableArray.ToImmutableArray(value) + ); + } } public BulkAddUsersParams() { } @@ -45,7 +52,7 @@ public BulkAddUsersParams(BulkAddUsersParams bulkAddUsersParams) { this.JobID = bulkAddUsersParams.JobID; - this._rawBodyData = [.. bulkAddUsersParams._rawBodyData]; + this._rawBodyData = new(bulkAddUsersParams._rawBodyData); } public BulkAddUsersParams( @@ -54,9 +61,9 @@ public BulkAddUsersParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -67,9 +74,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -100,7 +107,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Bulk/BulkCreateJobParams.cs b/src/Courier/Models/Bulk/BulkCreateJobParams.cs index 2c5fbe10..57459ce9 100644 --- a/src/Courier/Models/Bulk/BulkCreateJobParams.cs +++ b/src/Courier/Models/Bulk/BulkCreateJobParams.cs @@ -20,7 +20,7 @@ namespace Courier.Models.Bulk; /// public sealed record class BulkCreateJobParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -33,8 +33,12 @@ public IReadOnlyDictionary RawBodyData /// public required InboundBulkMessage Message { - get { return JsonModel.GetNotNullClass(this.RawBodyData, "message"); } - init { JsonModel.Set(this._rawBodyData, "message", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass("message"); + } + init { this._rawBodyData.Set("message", value); } } public BulkCreateJobParams() { } @@ -42,7 +46,7 @@ public BulkCreateJobParams() { } public BulkCreateJobParams(BulkCreateJobParams bulkCreateJobParams) : base(bulkCreateJobParams) { - this._rawBodyData = [.. bulkCreateJobParams._rawBodyData]; + this._rawBodyData = new(bulkCreateJobParams._rawBodyData); } public BulkCreateJobParams( @@ -51,9 +55,9 @@ public BulkCreateJobParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -64,9 +68,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -95,7 +99,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Bulk/BulkCreateJobResponse.cs b/src/Courier/Models/Bulk/BulkCreateJobResponse.cs index 2b5b92bb..f8674045 100644 --- a/src/Courier/Models/Bulk/BulkCreateJobResponse.cs +++ b/src/Courier/Models/Bulk/BulkCreateJobResponse.cs @@ -12,8 +12,12 @@ public sealed record class BulkCreateJobResponse : JsonModel { public required string JobID { - get { return JsonModel.GetNotNullClass(this.RawData, "jobId"); } - init { JsonModel.Set(this._rawData, "jobId", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("jobId"); + } + init { this._rawData.Set("jobId", value); } } /// @@ -29,14 +33,14 @@ public BulkCreateJobResponse(BulkCreateJobResponse bulkCreateJobResponse) public BulkCreateJobResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] BulkCreateJobResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Bulk/BulkListUsersParams.cs b/src/Courier/Models/Bulk/BulkListUsersParams.cs index daaacb24..45cb4620 100644 --- a/src/Courier/Models/Bulk/BulkListUsersParams.cs +++ b/src/Courier/Models/Bulk/BulkListUsersParams.cs @@ -21,8 +21,12 @@ public sealed record class BulkListUsersParams : ParamsBase /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawQueryData, "cursor"); } - init { JsonModel.Set(this._rawQueryData, "cursor", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("cursor"); + } + init { this._rawQueryData.Set("cursor", value); } } public BulkListUsersParams() { } @@ -38,8 +42,8 @@ public BulkListUsersParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -49,8 +53,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Bulk/BulkListUsersResponse.cs b/src/Courier/Models/Bulk/BulkListUsersResponse.cs index eba218a0..b460063e 100644 --- a/src/Courier/Models/Bulk/BulkListUsersResponse.cs +++ b/src/Courier/Models/Bulk/BulkListUsersResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -14,14 +15,28 @@ public sealed record class BulkListUsersResponse : JsonModel { public required IReadOnlyList Items { - get { return JsonModel.GetNotNullClass>(this.RawData, "items"); } - init { JsonModel.Set(this._rawData, "items", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("items"); + } + init + { + this._rawData.Set>( + "items", + ImmutableArray.ToImmutableArray(value) + ); + } } public required Paging Paging { - get { return JsonModel.GetNotNullClass(this.RawData, "paging"); } - init { JsonModel.Set(this._rawData, "paging", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("paging"); + } + init { this._rawData.Set("paging", value); } } /// @@ -41,14 +56,14 @@ public BulkListUsersResponse(BulkListUsersResponse bulkListUsersResponse) public BulkListUsersResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] BulkListUsersResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -77,7 +92,11 @@ public sealed record class Item : JsonModel /// public JsonElement? Data { - get { return JsonModel.GetNullableStruct(this.RawData, "data"); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("data"); + } init { if (value == null) @@ -85,7 +104,7 @@ public JsonElement? Data return; } - JsonModel.Set(this._rawData, "data", value); + this._rawData.Set("data", value); } } @@ -93,7 +112,8 @@ public RecipientPreferences? Preferences { get { - return JsonModel.GetNullableClass(this.RawData, "preferences"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass("preferences"); } init { @@ -102,7 +122,7 @@ public RecipientPreferences? Preferences return; } - JsonModel.Set(this._rawData, "preferences", value); + this._rawData.Set("preferences", value); } } @@ -115,12 +135,16 @@ public IReadOnlyDictionary? Profile { get { - return JsonModel.GetNullableClass>( - this.RawData, - "profile" + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("profile"); + } + init + { + this._rawData.Set?>( + "profile", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "profile", value); } } /// @@ -128,13 +152,21 @@ public IReadOnlyDictionary? Profile /// public string? Recipient { - get { return JsonModel.GetNullableClass(this.RawData, "recipient"); } - init { JsonModel.Set(this._rawData, "recipient", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("recipient"); + } + init { this._rawData.Set("recipient", value); } } public UserRecipient? To { - get { return JsonModel.GetNullableClass(this.RawData, "to"); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("to"); + } init { if (value == null) @@ -142,20 +174,28 @@ public UserRecipient? To return; } - JsonModel.Set(this._rawData, "to", value); + this._rawData.Set("to", value); } } public required ApiEnum Status { - get { return JsonModel.GetNotNullClass>(this.RawData, "status"); } - init { JsonModel.Set(this._rawData, "status", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("status"); + } + init { this._rawData.Set("status", value); } } public string? MessageID { - get { return JsonModel.GetNullableClass(this.RawData, "messageId"); } - init { JsonModel.Set(this._rawData, "messageId", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("messageId"); + } + init { this._rawData.Set("messageId", value); } } public static implicit operator InboundBulkMessageUser(Item item) => @@ -187,14 +227,14 @@ public Item(Item item) public Item(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Item(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -229,14 +269,22 @@ public sealed record class IntersectionMember1 : JsonModel { public required ApiEnum Status { - get { return JsonModel.GetNotNullClass>(this.RawData, "status"); } - init { JsonModel.Set(this._rawData, "status", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("status"); + } + init { this._rawData.Set("status", value); } } public string? MessageID { - get { return JsonModel.GetNullableClass(this.RawData, "messageId"); } - init { JsonModel.Set(this._rawData, "messageId", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("messageId"); + } + init { this._rawData.Set("messageId", value); } } /// @@ -253,14 +301,14 @@ public IntersectionMember1(global::Courier.Models.Bulk.IntersectionMember1 inter public IntersectionMember1(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] IntersectionMember1(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Bulk/BulkRetrieveJobParams.cs b/src/Courier/Models/Bulk/BulkRetrieveJobParams.cs index f2099a2b..24aacaef 100644 --- a/src/Courier/Models/Bulk/BulkRetrieveJobParams.cs +++ b/src/Courier/Models/Bulk/BulkRetrieveJobParams.cs @@ -28,8 +28,8 @@ public BulkRetrieveJobParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Bulk/BulkRetrieveJobResponse.cs b/src/Courier/Models/Bulk/BulkRetrieveJobResponse.cs index e1be4bdd..37013ada 100644 --- a/src/Courier/Models/Bulk/BulkRetrieveJobResponse.cs +++ b/src/Courier/Models/Bulk/BulkRetrieveJobResponse.cs @@ -14,8 +14,12 @@ public sealed record class BulkRetrieveJobResponse : JsonModel { public required Job Job { - get { return JsonModel.GetNotNullClass(this.RawData, "job"); } - init { JsonModel.Set(this._rawData, "job", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("job"); + } + init { this._rawData.Set("job", value); } } /// @@ -31,14 +35,14 @@ public BulkRetrieveJobResponse(BulkRetrieveJobResponse bulkRetrieveJobResponse) public BulkRetrieveJobResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] BulkRetrieveJobResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -76,35 +80,52 @@ public sealed record class Job : JsonModel /// public required InboundBulkMessage Definition { - get { return JsonModel.GetNotNullClass(this.RawData, "definition"); } - init { JsonModel.Set(this._rawData, "definition", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("definition"); + } + init { this._rawData.Set("definition", value); } } public required long Enqueued { - get { return JsonModel.GetNotNullStruct(this.RawData, "enqueued"); } - init { JsonModel.Set(this._rawData, "enqueued", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("enqueued"); + } + init { this._rawData.Set("enqueued", value); } } public required long Failures { - get { return JsonModel.GetNotNullStruct(this.RawData, "failures"); } - init { JsonModel.Set(this._rawData, "failures", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("failures"); + } + init { this._rawData.Set("failures", value); } } public required long Received { - get { return JsonModel.GetNotNullStruct(this.RawData, "received"); } - init { JsonModel.Set(this._rawData, "received", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("received"); + } + init { this._rawData.Set("received", value); } } public required ApiEnum Status { get { - return JsonModel.GetNotNullClass>(this.RawData, "status"); + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("status"); } - init { JsonModel.Set(this._rawData, "status", value); } + init { this._rawData.Set("status", value); } } /// @@ -124,14 +145,14 @@ public Job(Job job) public Job(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Job(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Bulk/BulkRunJobParams.cs b/src/Courier/Models/Bulk/BulkRunJobParams.cs index 01948708..dacbebe8 100644 --- a/src/Courier/Models/Bulk/BulkRunJobParams.cs +++ b/src/Courier/Models/Bulk/BulkRunJobParams.cs @@ -28,8 +28,8 @@ public BulkRunJobParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Bulk/InboundBulkMessage.cs b/src/Courier/Models/Bulk/InboundBulkMessage.cs index 0c8a7cbf..5d41202e 100644 --- a/src/Courier/Models/Bulk/InboundBulkMessage.cs +++ b/src/Courier/Models/Bulk/InboundBulkMessage.cs @@ -24,14 +24,22 @@ public sealed record class InboundBulkMessage : JsonModel /// public required string Event { - get { return JsonModel.GetNotNullClass(this.RawData, "event"); } - init { JsonModel.Set(this._rawData, "event", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("event"); + } + init { this._rawData.Set("event", value); } } public string? Brand { - get { return JsonModel.GetNullableClass(this.RawData, "brand"); } - init { JsonModel.Set(this._rawData, "brand", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("brand"); + } + init { this._rawData.Set("brand", value); } } /// @@ -40,44 +48,80 @@ public string? Brand /// public Content? Content { - get { return JsonModel.GetNullableClass(this.RawData, "content"); } - init { JsonModel.Set(this._rawData, "content", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("content"); + } + init { this._rawData.Set("content", value); } } public IReadOnlyDictionary? Data { get { - return JsonModel.GetNullableClass>( - this.RawData, - "data" + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("data"); + } + init + { + this._rawData.Set?>( + "data", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "data", value); } } - public IReadOnlyDictionary>? Locale + public IReadOnlyDictionary>? Locale { get { - return JsonModel.GetNullableClass>>( - this.RawData, - "locale" + this._rawData.Freeze(); + var value = this._rawData.GetNullableClass< + FrozenDictionary> + >("locale"); + if (value == null) + { + return null; + } + + return FrozenDictionary.ToFrozenDictionary( + value, + entry => entry.Key, + (entry) => (IReadOnlyDictionary)entry.Value + ); + } + init + { + this._rawData.Set>?>( + "locale", + value == null + ? null + : FrozenDictionary.ToFrozenDictionary( + value, + entry => entry.Key, + (entry) => FrozenDictionary.ToFrozenDictionary(entry.Value) + ) ); } - init { JsonModel.Set(this._rawData, "locale", value); } } public IReadOnlyDictionary? Override { get { - return JsonModel.GetNullableClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNullableClass>( "override" ); } - init { JsonModel.Set(this._rawData, "override", value); } + init + { + this._rawData.Set?>( + "override", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); + } } /// @@ -87,8 +131,12 @@ public IReadOnlyDictionary? Override /// public string? Template { - get { return JsonModel.GetNullableClass(this.RawData, "template"); } - init { JsonModel.Set(this._rawData, "template", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("template"); + } + init { this._rawData.Set("template", value); } } /// @@ -110,14 +158,14 @@ public InboundBulkMessage(InboundBulkMessage inboundBulkMessage) public InboundBulkMessage(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] InboundBulkMessage(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -157,7 +205,13 @@ public record class Content : ModelBase public JsonElement Json { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } + get + { + return this._element ??= JsonSerializer.SerializeToElement( + this.Value, + ModelBase.SerializerOptions + ); + } } public Content(ElementalContentSugar value, JsonElement? element = null) diff --git a/src/Courier/Models/Bulk/InboundBulkMessageUser.cs b/src/Courier/Models/Bulk/InboundBulkMessageUser.cs index 8a8b21de..cc3e43e5 100644 --- a/src/Courier/Models/Bulk/InboundBulkMessageUser.cs +++ b/src/Courier/Models/Bulk/InboundBulkMessageUser.cs @@ -15,7 +15,11 @@ public sealed record class InboundBulkMessageUser : JsonModel /// public JsonElement? Data { - get { return JsonModel.GetNullableStruct(this.RawData, "data"); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("data"); + } init { if (value == null) @@ -23,7 +27,7 @@ public JsonElement? Data return; } - JsonModel.Set(this._rawData, "data", value); + this._rawData.Set("data", value); } } @@ -31,9 +35,10 @@ public RecipientPreferences? Preferences { get { - return JsonModel.GetNullableClass(this.RawData, "preferences"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass("preferences"); } - init { JsonModel.Set(this._rawData, "preferences", value); } + init { this._rawData.Set("preferences", value); } } /// @@ -45,12 +50,16 @@ public IReadOnlyDictionary? Profile { get { - return JsonModel.GetNullableClass>( - this.RawData, - "profile" + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("profile"); + } + init + { + this._rawData.Set?>( + "profile", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "profile", value); } } /// @@ -58,8 +67,12 @@ public IReadOnlyDictionary? Profile /// public string? Recipient { - get { return JsonModel.GetNullableClass(this.RawData, "recipient"); } - init { JsonModel.Set(this._rawData, "recipient", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("recipient"); + } + init { this._rawData.Set("recipient", value); } } /// @@ -69,8 +82,12 @@ public string? Recipient /// public UserRecipient? To { - get { return JsonModel.GetNullableClass(this.RawData, "to"); } - init { JsonModel.Set(this._rawData, "to", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("to"); + } + init { this._rawData.Set("to", value); } } /// @@ -90,14 +107,14 @@ public InboundBulkMessageUser(InboundBulkMessageUser inboundBulkMessageUser) public InboundBulkMessageUser(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] InboundBulkMessageUser(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/ChannelPreference.cs b/src/Courier/Models/ChannelPreference.cs index 95a9c831..8fa43f22 100644 --- a/src/Courier/Models/ChannelPreference.cs +++ b/src/Courier/Models/ChannelPreference.cs @@ -14,12 +14,10 @@ public required ApiEnum Channel { get { - return JsonModel.GetNotNullClass>( - this.RawData, - "channel" - ); + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("channel"); } - init { JsonModel.Set(this._rawData, "channel", value); } + init { this._rawData.Set("channel", value); } } /// @@ -35,14 +33,14 @@ public ChannelPreference(ChannelPreference channelPreference) public ChannelPreference(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ChannelPreference(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Discord.cs b/src/Courier/Models/Discord.cs index 3b675815..de30e3d6 100644 --- a/src/Courier/Models/Discord.cs +++ b/src/Courier/Models/Discord.cs @@ -16,7 +16,13 @@ public record class Discord : ModelBase public JsonElement Json { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } + get + { + return this._element ??= JsonSerializer.SerializeToElement( + this.Value, + ModelBase.SerializerOptions + ); + } } public Discord(SendToChannel value, JsonElement? element = null) diff --git a/src/Courier/Models/ElementalActionNodeWithType.cs b/src/Courier/Models/ElementalActionNodeWithType.cs index 93777bd2..d191153b 100644 --- a/src/Courier/Models/ElementalActionNodeWithType.cs +++ b/src/Courier/Models/ElementalActionNodeWithType.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -16,34 +17,56 @@ public sealed record class ElementalActionNodeWithType : JsonModel { public IReadOnlyList? Channels { - get { return JsonModel.GetNullableClass>(this.RawData, "channels"); } - init { JsonModel.Set(this._rawData, "channels", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("channels"); + } + init + { + this._rawData.Set?>( + "channels", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } public string? If { - get { return JsonModel.GetNullableClass(this.RawData, "if"); } - init { JsonModel.Set(this._rawData, "if", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("if"); + } + init { this._rawData.Set("if", value); } } public string? Loop { - get { return JsonModel.GetNullableClass(this.RawData, "loop"); } - init { JsonModel.Set(this._rawData, "loop", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("loop"); + } + init { this._rawData.Set("loop", value); } } public string? Ref { - get { return JsonModel.GetNullableClass(this.RawData, "ref"); } - init { JsonModel.Set(this._rawData, "ref", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("ref"); + } + init { this._rawData.Set("ref", value); } } public ApiEnum? Type { get { - return JsonModel.GetNullableClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNullableClass>( "type" ); } @@ -54,7 +77,7 @@ public string? Ref return; } - JsonModel.Set(this._rawData, "type", value); + this._rawData.Set("type", value); } } @@ -86,14 +109,14 @@ public ElementalActionNodeWithType(ElementalActionNodeWithType elementalActionNo public ElementalActionNodeWithType(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalActionNodeWithType(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -121,8 +144,8 @@ public sealed record class IntersectionMember1 : JsonModel { get { - return JsonModel.GetNullableClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNullableClass>( "type" ); } @@ -133,7 +156,7 @@ public sealed record class IntersectionMember1 : JsonModel return; } - JsonModel.Set(this._rawData, "type", value); + this._rawData.Set("type", value); } } @@ -150,14 +173,14 @@ public IntersectionMember1(IntersectionMember1 intersectionMember1) public IntersectionMember1(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] IntersectionMember1(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/ElementalBaseNode.cs b/src/Courier/Models/ElementalBaseNode.cs index d54929dd..6b4c2a79 100644 --- a/src/Courier/Models/ElementalBaseNode.cs +++ b/src/Courier/Models/ElementalBaseNode.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -12,26 +13,48 @@ public sealed record class ElementalBaseNode : JsonModel { public IReadOnlyList? Channels { - get { return JsonModel.GetNullableClass>(this.RawData, "channels"); } - init { JsonModel.Set(this._rawData, "channels", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("channels"); + } + init + { + this._rawData.Set?>( + "channels", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } public string? If { - get { return JsonModel.GetNullableClass(this.RawData, "if"); } - init { JsonModel.Set(this._rawData, "if", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("if"); + } + init { this._rawData.Set("if", value); } } public string? Loop { - get { return JsonModel.GetNullableClass(this.RawData, "loop"); } - init { JsonModel.Set(this._rawData, "loop", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("loop"); + } + init { this._rawData.Set("loop", value); } } public string? Ref { - get { return JsonModel.GetNullableClass(this.RawData, "ref"); } - init { JsonModel.Set(this._rawData, "ref", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("ref"); + } + init { this._rawData.Set("ref", value); } } /// @@ -50,14 +73,14 @@ public ElementalBaseNode(ElementalBaseNode elementalBaseNode) public ElementalBaseNode(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalBaseNode(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/ElementalChannelNode.cs b/src/Courier/Models/ElementalChannelNode.cs index aa15c4cc..deedc706 100644 --- a/src/Courier/Models/ElementalChannelNode.cs +++ b/src/Courier/Models/ElementalChannelNode.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -23,36 +24,70 @@ public sealed record class ElementalChannelNode : JsonModel { public IReadOnlyList? Channels { - get { return JsonModel.GetNullableClass>(this.RawData, "channels"); } - init { JsonModel.Set(this._rawData, "channels", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("channels"); + } + init + { + this._rawData.Set?>( + "channels", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } public string? If { - get { return JsonModel.GetNullableClass(this.RawData, "if"); } - init { JsonModel.Set(this._rawData, "if", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("if"); + } + init { this._rawData.Set("if", value); } } public string? Loop { - get { return JsonModel.GetNullableClass(this.RawData, "loop"); } - init { JsonModel.Set(this._rawData, "loop", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("loop"); + } + init { this._rawData.Set("loop", value); } } public string? Ref { - get { return JsonModel.GetNullableClass(this.RawData, "ref"); } - init { JsonModel.Set(this._rawData, "ref", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("ref"); + } + init { this._rawData.Set("ref", value); } } /// /// The channel the contents of this element should be applied to. Can be `email`, /// `push`, `direct_message`, `sms` or a provider such as slack /// - public required string Channel + public string? Channel { - get { return JsonModel.GetNotNullClass(this.RawData, "channel"); } - init { JsonModel.Set(this._rawData, "channel", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("channel"); + } + init + { + if (value == null) + { + return; + } + + this._rawData.Set("channel", value); + } } /// @@ -63,9 +98,16 @@ public IReadOnlyDictionary? Raw { get { - return JsonModel.GetNullableClass>(this.RawData, "raw"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("raw"); + } + init + { + this._rawData.Set?>( + "raw", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); } - init { JsonModel.Set(this._rawData, "raw", value); } } public static implicit operator ElementalBaseNode(ElementalChannelNode elementalChannelNode) => @@ -95,14 +137,14 @@ public ElementalChannelNode(ElementalChannelNode elementalChannelNode) public ElementalChannelNode(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalChannelNode(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -113,13 +155,6 @@ IReadOnlyDictionary rawData { return new(FrozenDictionary.ToFrozenDictionary(rawData)); } - - [SetsRequiredMembers] - public ElementalChannelNode(string channel) - : this() - { - this.Channel = channel; - } } class ElementalChannelNodeFromRaw : IFromRawJson @@ -142,10 +177,22 @@ public sealed record class ElementalChannelNodeIntersectionMember1 : JsonModel /// The channel the contents of this element should be applied to. Can be `email`, /// `push`, `direct_message`, `sms` or a provider such as slack /// - public required string Channel + public string? Channel { - get { return JsonModel.GetNotNullClass(this.RawData, "channel"); } - init { JsonModel.Set(this._rawData, "channel", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("channel"); + } + init + { + if (value == null) + { + return; + } + + this._rawData.Set("channel", value); + } } /// @@ -156,9 +203,16 @@ public IReadOnlyDictionary? Raw { get { - return JsonModel.GetNullableClass>(this.RawData, "raw"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("raw"); + } + init + { + this._rawData.Set?>( + "raw", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); } - init { JsonModel.Set(this._rawData, "raw", value); } } /// @@ -177,14 +231,14 @@ ElementalChannelNodeIntersectionMember1 elementalChannelNodeIntersectionMember1 public ElementalChannelNodeIntersectionMember1(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalChannelNodeIntersectionMember1(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -195,13 +249,6 @@ IReadOnlyDictionary rawData { return new(FrozenDictionary.ToFrozenDictionary(rawData)); } - - [SetsRequiredMembers] - public ElementalChannelNodeIntersectionMember1(string channel) - : this() - { - this.Channel = channel; - } } class ElementalChannelNodeIntersectionMember1FromRaw diff --git a/src/Courier/Models/ElementalChannelNodeWithType.cs b/src/Courier/Models/ElementalChannelNodeWithType.cs index aaa80391..35f8de88 100644 --- a/src/Courier/Models/ElementalChannelNodeWithType.cs +++ b/src/Courier/Models/ElementalChannelNodeWithType.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -27,36 +28,70 @@ public sealed record class ElementalChannelNodeWithType : JsonModel { public IReadOnlyList? Channels { - get { return JsonModel.GetNullableClass>(this.RawData, "channels"); } - init { JsonModel.Set(this._rawData, "channels", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("channels"); + } + init + { + this._rawData.Set?>( + "channels", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } public string? If { - get { return JsonModel.GetNullableClass(this.RawData, "if"); } - init { JsonModel.Set(this._rawData, "if", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("if"); + } + init { this._rawData.Set("if", value); } } public string? Loop { - get { return JsonModel.GetNullableClass(this.RawData, "loop"); } - init { JsonModel.Set(this._rawData, "loop", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("loop"); + } + init { this._rawData.Set("loop", value); } } public string? Ref { - get { return JsonModel.GetNullableClass(this.RawData, "ref"); } - init { JsonModel.Set(this._rawData, "ref", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("ref"); + } + init { this._rawData.Set("ref", value); } } /// /// The channel the contents of this element should be applied to. Can be `email`, /// `push`, `direct_message`, `sms` or a provider such as slack /// - public required string Channel + public string? Channel { - get { return JsonModel.GetNotNullClass(this.RawData, "channel"); } - init { JsonModel.Set(this._rawData, "channel", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("channel"); + } + init + { + if (value == null) + { + return; + } + + this._rawData.Set("channel", value); + } } /// @@ -67,18 +102,26 @@ public IReadOnlyDictionary? Raw { get { - return JsonModel.GetNullableClass>(this.RawData, "raw"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("raw"); + } + init + { + this._rawData.Set?>( + "raw", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); } - init { JsonModel.Set(this._rawData, "raw", value); } } public ApiEnum? Type { get { - return JsonModel.GetNullableClass< + this._rawData.Freeze(); + return this._rawData.GetNullableClass< ApiEnum - >(this.RawData, "type"); + >("type"); } init { @@ -87,7 +130,7 @@ public ApiEnum? Typ return; } - JsonModel.Set(this._rawData, "type", value); + this._rawData.Set("type", value); } } @@ -123,14 +166,14 @@ public ElementalChannelNodeWithType(ElementalChannelNodeWithType elementalChanne public ElementalChannelNodeWithType(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalChannelNodeWithType(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -141,13 +184,6 @@ IReadOnlyDictionary rawData { return new(FrozenDictionary.ToFrozenDictionary(rawData)); } - - [SetsRequiredMembers] - public ElementalChannelNodeWithType(string channel) - : this() - { - this.Channel = channel; - } } class ElementalChannelNodeWithTypeFromRaw : IFromRawJson @@ -170,9 +206,10 @@ public ApiEnum? Typ { get { - return JsonModel.GetNullableClass< + this._rawData.Freeze(); + return this._rawData.GetNullableClass< ApiEnum - >(this.RawData, "type"); + >("type"); } init { @@ -181,7 +218,7 @@ public ApiEnum? Typ return; } - JsonModel.Set(this._rawData, "type", value); + this._rawData.Set("type", value); } } @@ -202,14 +239,14 @@ public ElementalChannelNodeWithTypeIntersectionMember1( IReadOnlyDictionary rawData ) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalChannelNodeWithTypeIntersectionMember1(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/ElementalContent.cs b/src/Courier/Models/ElementalContent.cs index 808a47dd..d59f81c1 100644 --- a/src/Courier/Models/ElementalContent.cs +++ b/src/Courier/Models/ElementalContent.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -12,8 +13,18 @@ public sealed record class ElementalContent : JsonModel { public required IReadOnlyList Elements { - get { return JsonModel.GetNotNullClass>(this.RawData, "elements"); } - init { JsonModel.Set(this._rawData, "elements", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("elements"); + } + init + { + this._rawData.Set>( + "elements", + ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -21,14 +32,22 @@ public required IReadOnlyList Elements /// public required string Version { - get { return JsonModel.GetNotNullClass(this.RawData, "version"); } - init { JsonModel.Set(this._rawData, "version", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("version"); + } + init { this._rawData.Set("version", value); } } public string? Brand { - get { return JsonModel.GetNullableClass(this.RawData, "brand"); } - init { JsonModel.Set(this._rawData, "brand", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("brand"); + } + init { this._rawData.Set("brand", value); } } /// @@ -49,14 +68,14 @@ public ElementalContent(ElementalContent elementalContent) public ElementalContent(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalContent(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/ElementalContentSugar.cs b/src/Courier/Models/ElementalContentSugar.cs index 3d1dd947..9df38edc 100644 --- a/src/Courier/Models/ElementalContentSugar.cs +++ b/src/Courier/Models/ElementalContentSugar.cs @@ -18,8 +18,12 @@ public sealed record class ElementalContentSugar : JsonModel /// public required string Body { - get { return JsonModel.GetNotNullClass(this.RawData, "body"); } - init { JsonModel.Set(this._rawData, "body", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("body"); + } + init { this._rawData.Set("body", value); } } /// @@ -27,8 +31,12 @@ public required string Body /// public required string Title { - get { return JsonModel.GetNotNullClass(this.RawData, "title"); } - init { JsonModel.Set(this._rawData, "title", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("title"); + } + init { this._rawData.Set("title", value); } } /// @@ -45,14 +53,14 @@ public ElementalContentSugar(ElementalContentSugar elementalContentSugar) public ElementalContentSugar(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalContentSugar(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/ElementalDividerNodeWithType.cs b/src/Courier/Models/ElementalDividerNodeWithType.cs index 39db95e6..4dfa7c2d 100644 --- a/src/Courier/Models/ElementalDividerNodeWithType.cs +++ b/src/Courier/Models/ElementalDividerNodeWithType.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -16,35 +17,58 @@ public sealed record class ElementalDividerNodeWithType : JsonModel { public IReadOnlyList? Channels { - get { return JsonModel.GetNullableClass>(this.RawData, "channels"); } - init { JsonModel.Set(this._rawData, "channels", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("channels"); + } + init + { + this._rawData.Set?>( + "channels", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } public string? If { - get { return JsonModel.GetNullableClass(this.RawData, "if"); } - init { JsonModel.Set(this._rawData, "if", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("if"); + } + init { this._rawData.Set("if", value); } } public string? Loop { - get { return JsonModel.GetNullableClass(this.RawData, "loop"); } - init { JsonModel.Set(this._rawData, "loop", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("loop"); + } + init { this._rawData.Set("loop", value); } } public string? Ref { - get { return JsonModel.GetNullableClass(this.RawData, "ref"); } - init { JsonModel.Set(this._rawData, "ref", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("ref"); + } + init { this._rawData.Set("ref", value); } } public ApiEnum? Type { get { - return JsonModel.GetNullableClass< + this._rawData.Freeze(); + return this._rawData.GetNullableClass< ApiEnum - >(this.RawData, "type"); + >("type"); } init { @@ -53,7 +77,7 @@ public ApiEnum? Typ return; } - JsonModel.Set(this._rawData, "type", value); + this._rawData.Set("type", value); } } @@ -85,14 +109,14 @@ public ElementalDividerNodeWithType(ElementalDividerNodeWithType elementalDivide public ElementalDividerNodeWithType(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalDividerNodeWithType(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -125,9 +149,10 @@ public ApiEnum? Typ { get { - return JsonModel.GetNullableClass< + this._rawData.Freeze(); + return this._rawData.GetNullableClass< ApiEnum - >(this.RawData, "type"); + >("type"); } init { @@ -136,7 +161,7 @@ public ApiEnum? Typ return; } - JsonModel.Set(this._rawData, "type", value); + this._rawData.Set("type", value); } } @@ -157,14 +182,14 @@ public ElementalDividerNodeWithTypeIntersectionMember1( IReadOnlyDictionary rawData ) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalDividerNodeWithTypeIntersectionMember1(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/ElementalImageNodeWithType.cs b/src/Courier/Models/ElementalImageNodeWithType.cs index 2a55fce8..12c4eea9 100644 --- a/src/Courier/Models/ElementalImageNodeWithType.cs +++ b/src/Courier/Models/ElementalImageNodeWithType.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -16,35 +17,58 @@ public sealed record class ElementalImageNodeWithType : JsonModel { public IReadOnlyList? Channels { - get { return JsonModel.GetNullableClass>(this.RawData, "channels"); } - init { JsonModel.Set(this._rawData, "channels", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("channels"); + } + init + { + this._rawData.Set?>( + "channels", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } public string? If { - get { return JsonModel.GetNullableClass(this.RawData, "if"); } - init { JsonModel.Set(this._rawData, "if", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("if"); + } + init { this._rawData.Set("if", value); } } public string? Loop { - get { return JsonModel.GetNullableClass(this.RawData, "loop"); } - init { JsonModel.Set(this._rawData, "loop", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("loop"); + } + init { this._rawData.Set("loop", value); } } public string? Ref { - get { return JsonModel.GetNullableClass(this.RawData, "ref"); } - init { JsonModel.Set(this._rawData, "ref", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("ref"); + } + init { this._rawData.Set("ref", value); } } public ApiEnum? Type { get { - return JsonModel.GetNullableClass< + this._rawData.Freeze(); + return this._rawData.GetNullableClass< ApiEnum - >(this.RawData, "type"); + >("type"); } init { @@ -53,7 +77,7 @@ public ApiEnum? Type return; } - JsonModel.Set(this._rawData, "type", value); + this._rawData.Set("type", value); } } @@ -85,14 +109,14 @@ public ElementalImageNodeWithType(ElementalImageNodeWithType elementalImageNodeW public ElementalImageNodeWithType(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalImageNodeWithType(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -125,9 +149,10 @@ public ApiEnum? Type { get { - return JsonModel.GetNullableClass< + this._rawData.Freeze(); + return this._rawData.GetNullableClass< ApiEnum - >(this.RawData, "type"); + >("type"); } init { @@ -136,7 +161,7 @@ public ApiEnum? Type return; } - JsonModel.Set(this._rawData, "type", value); + this._rawData.Set("type", value); } } @@ -157,14 +182,14 @@ public ElementalImageNodeWithTypeIntersectionMember1( IReadOnlyDictionary rawData ) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalImageNodeWithTypeIntersectionMember1(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/ElementalMetaNodeWithType.cs b/src/Courier/Models/ElementalMetaNodeWithType.cs index 7a60467b..04391045 100644 --- a/src/Courier/Models/ElementalMetaNodeWithType.cs +++ b/src/Courier/Models/ElementalMetaNodeWithType.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -16,35 +17,58 @@ public sealed record class ElementalMetaNodeWithType : JsonModel { public IReadOnlyList? Channels { - get { return JsonModel.GetNullableClass>(this.RawData, "channels"); } - init { JsonModel.Set(this._rawData, "channels", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("channels"); + } + init + { + this._rawData.Set?>( + "channels", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } public string? If { - get { return JsonModel.GetNullableClass(this.RawData, "if"); } - init { JsonModel.Set(this._rawData, "if", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("if"); + } + init { this._rawData.Set("if", value); } } public string? Loop { - get { return JsonModel.GetNullableClass(this.RawData, "loop"); } - init { JsonModel.Set(this._rawData, "loop", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("loop"); + } + init { this._rawData.Set("loop", value); } } public string? Ref { - get { return JsonModel.GetNullableClass(this.RawData, "ref"); } - init { JsonModel.Set(this._rawData, "ref", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("ref"); + } + init { this._rawData.Set("ref", value); } } public ApiEnum? Type { get { - return JsonModel.GetNullableClass< + this._rawData.Freeze(); + return this._rawData.GetNullableClass< ApiEnum - >(this.RawData, "type"); + >("type"); } init { @@ -53,7 +77,7 @@ public ApiEnum? Type return; } - JsonModel.Set(this._rawData, "type", value); + this._rawData.Set("type", value); } } @@ -85,14 +109,14 @@ public ElementalMetaNodeWithType(ElementalMetaNodeWithType elementalMetaNodeWith public ElementalMetaNodeWithType(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalMetaNodeWithType(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -125,9 +149,10 @@ public ApiEnum? Type { get { - return JsonModel.GetNullableClass< + this._rawData.Freeze(); + return this._rawData.GetNullableClass< ApiEnum - >(this.RawData, "type"); + >("type"); } init { @@ -136,7 +161,7 @@ public ApiEnum? Type return; } - JsonModel.Set(this._rawData, "type", value); + this._rawData.Set("type", value); } } @@ -157,14 +182,14 @@ public ElementalMetaNodeWithTypeIntersectionMember1( IReadOnlyDictionary rawData ) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalMetaNodeWithTypeIntersectionMember1(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/ElementalNode.cs b/src/Courier/Models/ElementalNode.cs index e4e19e34..ae38f912 100644 --- a/src/Courier/Models/ElementalNode.cs +++ b/src/Courier/Models/ElementalNode.cs @@ -28,7 +28,13 @@ public record class ElementalNode : ModelBase public JsonElement Json { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } + get + { + return this._element ??= JsonSerializer.SerializeToElement( + this.Value, + ModelBase.SerializerOptions + ); + } } public IReadOnlyList? Channels diff --git a/src/Courier/Models/ElementalQuoteNodeWithType.cs b/src/Courier/Models/ElementalQuoteNodeWithType.cs index 8d8d7ad6..27f42798 100644 --- a/src/Courier/Models/ElementalQuoteNodeWithType.cs +++ b/src/Courier/Models/ElementalQuoteNodeWithType.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -16,35 +17,58 @@ public sealed record class ElementalQuoteNodeWithType : JsonModel { public IReadOnlyList? Channels { - get { return JsonModel.GetNullableClass>(this.RawData, "channels"); } - init { JsonModel.Set(this._rawData, "channels", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("channels"); + } + init + { + this._rawData.Set?>( + "channels", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } public string? If { - get { return JsonModel.GetNullableClass(this.RawData, "if"); } - init { JsonModel.Set(this._rawData, "if", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("if"); + } + init { this._rawData.Set("if", value); } } public string? Loop { - get { return JsonModel.GetNullableClass(this.RawData, "loop"); } - init { JsonModel.Set(this._rawData, "loop", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("loop"); + } + init { this._rawData.Set("loop", value); } } public string? Ref { - get { return JsonModel.GetNullableClass(this.RawData, "ref"); } - init { JsonModel.Set(this._rawData, "ref", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("ref"); + } + init { this._rawData.Set("ref", value); } } public ApiEnum? Type { get { - return JsonModel.GetNullableClass< + this._rawData.Freeze(); + return this._rawData.GetNullableClass< ApiEnum - >(this.RawData, "type"); + >("type"); } init { @@ -53,7 +77,7 @@ public ApiEnum? Type return; } - JsonModel.Set(this._rawData, "type", value); + this._rawData.Set("type", value); } } @@ -85,14 +109,14 @@ public ElementalQuoteNodeWithType(ElementalQuoteNodeWithType elementalQuoteNodeW public ElementalQuoteNodeWithType(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalQuoteNodeWithType(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -125,9 +149,10 @@ public ApiEnum? Type { get { - return JsonModel.GetNullableClass< + this._rawData.Freeze(); + return this._rawData.GetNullableClass< ApiEnum - >(this.RawData, "type"); + >("type"); } init { @@ -136,7 +161,7 @@ public ApiEnum? Type return; } - JsonModel.Set(this._rawData, "type", value); + this._rawData.Set("type", value); } } @@ -157,14 +182,14 @@ public ElementalQuoteNodeWithTypeIntersectionMember1( IReadOnlyDictionary rawData ) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalQuoteNodeWithTypeIntersectionMember1(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/ElementalTextNodeWithType.cs b/src/Courier/Models/ElementalTextNodeWithType.cs index 0e6d30c2..77de02f5 100644 --- a/src/Courier/Models/ElementalTextNodeWithType.cs +++ b/src/Courier/Models/ElementalTextNodeWithType.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -16,35 +17,58 @@ public sealed record class ElementalTextNodeWithType : JsonModel { public IReadOnlyList? Channels { - get { return JsonModel.GetNullableClass>(this.RawData, "channels"); } - init { JsonModel.Set(this._rawData, "channels", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("channels"); + } + init + { + this._rawData.Set?>( + "channels", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } public string? If { - get { return JsonModel.GetNullableClass(this.RawData, "if"); } - init { JsonModel.Set(this._rawData, "if", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("if"); + } + init { this._rawData.Set("if", value); } } public string? Loop { - get { return JsonModel.GetNullableClass(this.RawData, "loop"); } - init { JsonModel.Set(this._rawData, "loop", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("loop"); + } + init { this._rawData.Set("loop", value); } } public string? Ref { - get { return JsonModel.GetNullableClass(this.RawData, "ref"); } - init { JsonModel.Set(this._rawData, "ref", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("ref"); + } + init { this._rawData.Set("ref", value); } } public ApiEnum? Type { get { - return JsonModel.GetNullableClass< + this._rawData.Freeze(); + return this._rawData.GetNullableClass< ApiEnum - >(this.RawData, "type"); + >("type"); } init { @@ -53,7 +77,7 @@ public ApiEnum? Type return; } - JsonModel.Set(this._rawData, "type", value); + this._rawData.Set("type", value); } } @@ -85,14 +109,14 @@ public ElementalTextNodeWithType(ElementalTextNodeWithType elementalTextNodeWith public ElementalTextNodeWithType(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalTextNodeWithType(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -125,9 +149,10 @@ public ApiEnum? Type { get { - return JsonModel.GetNullableClass< + this._rawData.Freeze(); + return this._rawData.GetNullableClass< ApiEnum - >(this.RawData, "type"); + >("type"); } init { @@ -136,7 +161,7 @@ public ApiEnum? Type return; } - JsonModel.Set(this._rawData, "type", value); + this._rawData.Set("type", value); } } @@ -157,14 +182,14 @@ public ElementalTextNodeWithTypeIntersectionMember1( IReadOnlyDictionary rawData ) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ElementalTextNodeWithTypeIntersectionMember1(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Expo.cs b/src/Courier/Models/Expo.cs index 1b9a1907..899e82c0 100644 --- a/src/Courier/Models/Expo.cs +++ b/src/Courier/Models/Expo.cs @@ -16,7 +16,13 @@ public record class Expo : ModelBase public JsonElement Json { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } + get + { + return this._element ??= JsonSerializer.SerializeToElement( + this.Value, + ModelBase.SerializerOptions + ); + } } public Expo(Token value, JsonElement? element = null) diff --git a/src/Courier/Models/FilterConfig.cs b/src/Courier/Models/FilterConfig.cs new file mode 100644 index 00000000..002de2df --- /dev/null +++ b/src/Courier/Models/FilterConfig.cs @@ -0,0 +1,152 @@ +using System.Collections.Frozen; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; +using System.Text.Json.Serialization; +using Courier.Core; + +namespace Courier.Models; + +/// +/// A filter rule that can be either a single condition (with path/value) or a nested +/// group (with filters array). Use comparison operators (EQ, GT, etc.) for single +/// conditions, and logical operators (AND, OR) for nested groups. +/// +[JsonConverter(typeof(JsonModelConverter))] +public sealed record class FilterConfig : JsonModel +{ + /// + /// The operator for this filter. Use comparison operators (EQ, GT, LT, GTE, + /// LTE, NEQ, EXISTS, INCLUDES, STARTS_WITH, ENDS_WITH, IS_BEFORE, IS_AFTER, + /// OMIT) for single conditions, or logical operators (AND, OR) for nested filter groups. + /// + public required string Operator + { + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("operator"); + } + init { this._rawData.Set("operator", value); } + } + + /// + /// Nested filter rules to combine with AND/OR. Required for nested filter groups, + /// not used for single filter conditions. + /// + public IReadOnlyList? Filters + { + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("filters"); + } + init + { + if (value == null) + { + return; + } + + this._rawData.Set?>( + "filters", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } + } + + /// + /// The attribute path from the user profile to filter on. Required for single + /// filter conditions, not used for nested filter groups. + /// + public string? Path + { + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("path"); + } + init + { + if (value == null) + { + return; + } + + this._rawData.Set("path", value); + } + } + + /// + /// The value to compare against. Required for single filter conditions, not + /// used for nested filter groups. + /// + public string? Value + { + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("value"); + } + init + { + if (value == null) + { + return; + } + + this._rawData.Set("value", value); + } + } + + /// + public override void Validate() + { + _ = this.Operator; + foreach (var item in this.Filters ?? []) + { + item.Validate(); + } + _ = this.Path; + _ = this.Value; + } + + public FilterConfig() { } + + public FilterConfig(FilterConfig filterConfig) + : base(filterConfig) { } + + public FilterConfig(IReadOnlyDictionary rawData) + { + this._rawData = new(rawData); + } + +#pragma warning disable CS8618 + [SetsRequiredMembers] + FilterConfig(FrozenDictionary rawData) + { + this._rawData = new(rawData); + } +#pragma warning restore CS8618 + + /// + public static FilterConfig FromRawUnchecked(IReadOnlyDictionary rawData) + { + return new(FrozenDictionary.ToFrozenDictionary(rawData)); + } + + [SetsRequiredMembers] + public FilterConfig(string operator_) + : this() + { + this.Operator = operator_; + } +} + +class FilterConfigFromRaw : IFromRawJson +{ + /// + public FilterConfig FromRawUnchecked(IReadOnlyDictionary rawData) => + FilterConfig.FromRawUnchecked(rawData); +} diff --git a/src/Courier/Models/Inbound/InboundTrackEventParams.cs b/src/Courier/Models/Inbound/InboundTrackEventParams.cs index 11963d5f..7c9ceca2 100644 --- a/src/Courier/Models/Inbound/InboundTrackEventParams.cs +++ b/src/Courier/Models/Inbound/InboundTrackEventParams.cs @@ -16,7 +16,7 @@ namespace Courier.Models.Inbound; /// public sealed record class InboundTrackEventParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -28,8 +28,12 @@ public IReadOnlyDictionary RawBodyData /// public required string Event { - get { return JsonModel.GetNotNullClass(this.RawBodyData, "event"); } - init { JsonModel.Set(this._rawBodyData, "event", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass("event"); + } + init { this._rawBodyData.Set("event", value); } } /// @@ -38,32 +42,42 @@ public required string Event /// public required string MessageID { - get { return JsonModel.GetNotNullClass(this.RawBodyData, "messageId"); } - init { JsonModel.Set(this._rawBodyData, "messageId", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass("messageId"); + } + init { this._rawBodyData.Set("messageId", value); } } public required IReadOnlyDictionary Properties { get { - return JsonModel.GetNotNullClass>( - this.RawBodyData, + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass>( "properties" ); } - init { JsonModel.Set(this._rawBodyData, "properties", value); } + init + { + this._rawBodyData.Set>( + "properties", + FrozenDictionary.ToFrozenDictionary(value) + ); + } } public required ApiEnum Type { get { - return JsonModel.GetNotNullClass>( - this.RawBodyData, - "type" - ); + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass< + ApiEnum + >("type"); } - init { JsonModel.Set(this._rawBodyData, "type", value); } + init { this._rawBodyData.Set("type", value); } } /// @@ -71,8 +85,12 @@ public required IReadOnlyDictionary Properties /// public string? UserID { - get { return JsonModel.GetNullableClass(this.RawBodyData, "userId"); } - init { JsonModel.Set(this._rawBodyData, "userId", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("userId"); + } + init { this._rawBodyData.Set("userId", value); } } public InboundTrackEventParams() { } @@ -80,7 +98,7 @@ public InboundTrackEventParams() { } public InboundTrackEventParams(InboundTrackEventParams inboundTrackEventParams) : base(inboundTrackEventParams) { - this._rawBodyData = [.. inboundTrackEventParams._rawBodyData]; + this._rawBodyData = new(inboundTrackEventParams._rawBodyData); } public InboundTrackEventParams( @@ -89,9 +107,9 @@ public InboundTrackEventParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -102,9 +120,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -133,7 +151,7 @@ IReadOnlyDictionary rawBodyData internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Inbound/InboundTrackEventResponse.cs b/src/Courier/Models/Inbound/InboundTrackEventResponse.cs index 6f07e731..fec0868c 100644 --- a/src/Courier/Models/Inbound/InboundTrackEventResponse.cs +++ b/src/Courier/Models/Inbound/InboundTrackEventResponse.cs @@ -18,8 +18,12 @@ public sealed record class InboundTrackEventResponse : JsonModel /// public required string MessageID { - get { return JsonModel.GetNotNullClass(this.RawData, "messageId"); } - init { JsonModel.Set(this._rawData, "messageId", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("messageId"); + } + init { this._rawData.Set("messageId", value); } } /// @@ -35,14 +39,14 @@ public InboundTrackEventResponse(InboundTrackEventResponse inboundTrackEventResp public InboundTrackEventResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] InboundTrackEventResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Intercom.cs b/src/Courier/Models/Intercom.cs index fb2ec322..1bf3688e 100644 --- a/src/Courier/Models/Intercom.cs +++ b/src/Courier/Models/Intercom.cs @@ -12,14 +12,22 @@ public sealed record class Intercom : JsonModel { public required string From { - get { return JsonModel.GetNotNullClass(this.RawData, "from"); } - init { JsonModel.Set(this._rawData, "from", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("from"); + } + init { this._rawData.Set("from", value); } } public required IntercomRecipient To { - get { return JsonModel.GetNotNullClass(this.RawData, "to"); } - init { JsonModel.Set(this._rawData, "to", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("to"); + } + init { this._rawData.Set("to", value); } } /// @@ -36,14 +44,14 @@ public Intercom(Intercom intercom) public Intercom(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Intercom(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/IntercomRecipient.cs b/src/Courier/Models/IntercomRecipient.cs index 2fe1fe2e..8776e9bd 100644 --- a/src/Courier/Models/IntercomRecipient.cs +++ b/src/Courier/Models/IntercomRecipient.cs @@ -12,8 +12,12 @@ public sealed record class IntercomRecipient : JsonModel { public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } /// @@ -29,14 +33,14 @@ public IntercomRecipient(IntercomRecipient intercomRecipient) public IntercomRecipient(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] IntercomRecipient(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/ListFilter.cs b/src/Courier/Models/ListFilter.cs index 68affe1b..26f0db87 100644 --- a/src/Courier/Models/ListFilter.cs +++ b/src/Courier/Models/ListFilter.cs @@ -19,27 +19,30 @@ public required ApiEnum Operator { get { - return JsonModel.GetNotNullClass>( - this.RawData, - "operator" - ); + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("operator"); } - init { JsonModel.Set(this._rawData, "operator", value); } + init { this._rawData.Set("operator", value); } } public required ApiEnum Path { get { - return JsonModel.GetNotNullClass>(this.RawData, "path"); + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("path"); } - init { JsonModel.Set(this._rawData, "path", value); } + init { this._rawData.Set("path", value); } } public required string Value { - get { return JsonModel.GetNotNullClass(this.RawData, "value"); } - init { JsonModel.Set(this._rawData, "value", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("value"); + } + init { this._rawData.Set("value", value); } } /// @@ -57,14 +60,14 @@ public ListFilter(ListFilter listFilter) public ListFilter(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ListFilter(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/ListPatternRecipient.cs b/src/Courier/Models/ListPatternRecipient.cs index 4bea1644..aeee3033 100644 --- a/src/Courier/Models/ListPatternRecipient.cs +++ b/src/Courier/Models/ListPatternRecipient.cs @@ -17,18 +17,26 @@ public IReadOnlyDictionary? Data { get { - return JsonModel.GetNullableClass>( - this.RawData, - "data" + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("data"); + } + init + { + this._rawData.Set?>( + "data", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "data", value); } } public string? ListPattern { - get { return JsonModel.GetNullableClass(this.RawData, "list_pattern"); } - init { JsonModel.Set(this._rawData, "list_pattern", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("list_pattern"); + } + init { this._rawData.Set("list_pattern", value); } } /// @@ -45,14 +53,14 @@ public ListPatternRecipient(ListPatternRecipient listPatternRecipient) public ListPatternRecipient(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ListPatternRecipient(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/ListRecipient.cs b/src/Courier/Models/ListRecipient.cs index 9d5264a3..51ca2bc3 100644 --- a/src/Courier/Models/ListRecipient.cs +++ b/src/Courier/Models/ListRecipient.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -17,24 +18,42 @@ public IReadOnlyDictionary? Data { get { - return JsonModel.GetNullableClass>( - this.RawData, - "data" + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("data"); + } + init + { + this._rawData.Set?>( + "data", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "data", value); } } public IReadOnlyList? Filters { - get { return JsonModel.GetNullableClass>(this.RawData, "filters"); } - init { JsonModel.Set(this._rawData, "filters", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("filters"); + } + init + { + this._rawData.Set?>( + "filters", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } public string? ListID { - get { return JsonModel.GetNullableClass(this.RawData, "list_id"); } - init { JsonModel.Set(this._rawData, "list_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("list_id"); + } + init { this._rawData.Set("list_id", value); } } /// @@ -55,14 +74,14 @@ public ListRecipient(ListRecipient listRecipient) public ListRecipient(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ListRecipient(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Lists/ListDeleteParams.cs b/src/Courier/Models/Lists/ListDeleteParams.cs index 13e92d41..eeaaca67 100644 --- a/src/Courier/Models/Lists/ListDeleteParams.cs +++ b/src/Courier/Models/Lists/ListDeleteParams.cs @@ -28,8 +28,8 @@ public ListDeleteParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Lists/ListListParams.cs b/src/Courier/Models/Lists/ListListParams.cs index a74d123e..732d4927 100644 --- a/src/Courier/Models/Lists/ListListParams.cs +++ b/src/Courier/Models/Lists/ListListParams.cs @@ -18,8 +18,12 @@ public sealed record class ListListParams : ParamsBase /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawQueryData, "cursor"); } - init { JsonModel.Set(this._rawQueryData, "cursor", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("cursor"); + } + init { this._rawQueryData.Set("cursor", value); } } /// @@ -30,8 +34,12 @@ public string? Cursor /// public string? Pattern { - get { return JsonModel.GetNullableClass(this.RawQueryData, "pattern"); } - init { JsonModel.Set(this._rawQueryData, "pattern", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("pattern"); + } + init { this._rawQueryData.Set("pattern", value); } } public ListListParams() { } @@ -44,8 +52,8 @@ public ListListParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -55,8 +63,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Lists/ListListResponse.cs b/src/Courier/Models/Lists/ListListResponse.cs index 62873fcc..10a983cd 100644 --- a/src/Courier/Models/Lists/ListListResponse.cs +++ b/src/Courier/Models/Lists/ListListResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -12,14 +13,28 @@ public sealed record class ListListResponse : JsonModel { public required IReadOnlyList Items { - get { return JsonModel.GetNotNullClass>(this.RawData, "items"); } - init { JsonModel.Set(this._rawData, "items", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("items"); + } + init + { + this._rawData.Set>( + "items", + ImmutableArray.ToImmutableArray(value) + ); + } } public required Paging Paging { - get { return JsonModel.GetNotNullClass(this.RawData, "paging"); } - init { JsonModel.Set(this._rawData, "paging", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("paging"); + } + init { this._rawData.Set("paging", value); } } /// @@ -39,14 +54,14 @@ public ListListResponse(ListListResponse listListResponse) public ListListResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ListListResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Lists/ListRestoreParams.cs b/src/Courier/Models/Lists/ListRestoreParams.cs index ed16c25d..ac1d636c 100644 --- a/src/Courier/Models/Lists/ListRestoreParams.cs +++ b/src/Courier/Models/Lists/ListRestoreParams.cs @@ -14,7 +14,7 @@ namespace Courier.Models.Lists; /// public sealed record class ListRestoreParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -29,7 +29,7 @@ public ListRestoreParams(ListRestoreParams listRestoreParams) { this.ListID = listRestoreParams.ListID; - this._rawBodyData = [.. listRestoreParams._rawBodyData]; + this._rawBodyData = new(listRestoreParams._rawBodyData); } public ListRestoreParams( @@ -38,9 +38,9 @@ public ListRestoreParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -51,9 +51,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -85,7 +85,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Lists/ListRetrieveParams.cs b/src/Courier/Models/Lists/ListRetrieveParams.cs index 1b621de3..5716ba0f 100644 --- a/src/Courier/Models/Lists/ListRetrieveParams.cs +++ b/src/Courier/Models/Lists/ListRetrieveParams.cs @@ -28,8 +28,8 @@ public ListRetrieveParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Lists/ListUpdateParams.cs b/src/Courier/Models/Lists/ListUpdateParams.cs index 0d5de4d3..9ab1868c 100644 --- a/src/Courier/Models/Lists/ListUpdateParams.cs +++ b/src/Courier/Models/Lists/ListUpdateParams.cs @@ -14,7 +14,7 @@ namespace Courier.Models.Lists; /// public sealed record class ListUpdateParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -24,20 +24,22 @@ public IReadOnlyDictionary RawBodyData public required string Name { - get { return JsonModel.GetNotNullClass(this.RawBodyData, "name"); } - init { JsonModel.Set(this._rawBodyData, "name", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass("name"); + } + init { this._rawBodyData.Set("name", value); } } public RecipientPreferences? Preferences { get { - return JsonModel.GetNullableClass( - this.RawBodyData, - "preferences" - ); + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("preferences"); } - init { JsonModel.Set(this._rawBodyData, "preferences", value); } + init { this._rawBodyData.Set("preferences", value); } } public ListUpdateParams() { } @@ -47,7 +49,7 @@ public ListUpdateParams(ListUpdateParams listUpdateParams) { this.ListID = listUpdateParams.ListID; - this._rawBodyData = [.. listUpdateParams._rawBodyData]; + this._rawBodyData = new(listUpdateParams._rawBodyData); } public ListUpdateParams( @@ -56,9 +58,9 @@ public ListUpdateParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -69,9 +71,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -102,7 +104,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Lists/PutSubscriptionsRecipient.cs b/src/Courier/Models/Lists/PutSubscriptionsRecipient.cs index 81ea51ea..cd11fb80 100644 --- a/src/Courier/Models/Lists/PutSubscriptionsRecipient.cs +++ b/src/Courier/Models/Lists/PutSubscriptionsRecipient.cs @@ -14,17 +14,22 @@ public sealed record class PutSubscriptionsRecipient : JsonModel { public required string RecipientID { - get { return JsonModel.GetNotNullClass(this.RawData, "recipientId"); } - init { JsonModel.Set(this._rawData, "recipientId", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("recipientId"); + } + init { this._rawData.Set("recipientId", value); } } public RecipientPreferences? Preferences { get { - return JsonModel.GetNullableClass(this.RawData, "preferences"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass("preferences"); } - init { JsonModel.Set(this._rawData, "preferences", value); } + init { this._rawData.Set("preferences", value); } } /// @@ -41,14 +46,14 @@ public PutSubscriptionsRecipient(PutSubscriptionsRecipient putSubscriptionsRecip public PutSubscriptionsRecipient(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] PutSubscriptionsRecipient(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Lists/SubscriptionList.cs b/src/Courier/Models/Lists/SubscriptionList.cs index c2c635d0..bb81fcc1 100644 --- a/src/Courier/Models/Lists/SubscriptionList.cs +++ b/src/Courier/Models/Lists/SubscriptionList.cs @@ -12,26 +12,42 @@ public sealed record class SubscriptionList : JsonModel { public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } public required string Name { - get { return JsonModel.GetNotNullClass(this.RawData, "name"); } - init { JsonModel.Set(this._rawData, "name", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("name"); + } + init { this._rawData.Set("name", value); } } public string? Created { - get { return JsonModel.GetNullableClass(this.RawData, "created"); } - init { JsonModel.Set(this._rawData, "created", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("created"); + } + init { this._rawData.Set("created", value); } } public string? Updated { - get { return JsonModel.GetNullableClass(this.RawData, "updated"); } - init { JsonModel.Set(this._rawData, "updated", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("updated"); + } + init { this._rawData.Set("updated", value); } } /// @@ -50,14 +66,14 @@ public SubscriptionList(SubscriptionList subscriptionList) public SubscriptionList(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SubscriptionList(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Lists/Subscriptions/SubscriptionAddParams.cs b/src/Courier/Models/Lists/Subscriptions/SubscriptionAddParams.cs index ea38fcfc..8b5b682c 100644 --- a/src/Courier/Models/Lists/Subscriptions/SubscriptionAddParams.cs +++ b/src/Courier/Models/Lists/Subscriptions/SubscriptionAddParams.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Net.Http; using System.Text; @@ -15,7 +16,7 @@ namespace Courier.Models.Lists.Subscriptions; /// public sealed record class SubscriptionAddParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -27,12 +28,18 @@ public required IReadOnlyList Recipients { get { - return JsonModel.GetNotNullClass>( - this.RawBodyData, + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullStruct>( "recipients" ); } - init { JsonModel.Set(this._rawBodyData, "recipients", value); } + init + { + this._rawBodyData.Set>( + "recipients", + ImmutableArray.ToImmutableArray(value) + ); + } } public SubscriptionAddParams() { } @@ -42,7 +49,7 @@ public SubscriptionAddParams(SubscriptionAddParams subscriptionAddParams) { this.ListID = subscriptionAddParams.ListID; - this._rawBodyData = [.. subscriptionAddParams._rawBodyData]; + this._rawBodyData = new(subscriptionAddParams._rawBodyData); } public SubscriptionAddParams( @@ -51,9 +58,9 @@ public SubscriptionAddParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -64,9 +71,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -98,7 +105,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Lists/Subscriptions/SubscriptionListParams.cs b/src/Courier/Models/Lists/Subscriptions/SubscriptionListParams.cs index 7c3e1652..de7caacf 100644 --- a/src/Courier/Models/Lists/Subscriptions/SubscriptionListParams.cs +++ b/src/Courier/Models/Lists/Subscriptions/SubscriptionListParams.cs @@ -20,8 +20,12 @@ public sealed record class SubscriptionListParams : ParamsBase /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawQueryData, "cursor"); } - init { JsonModel.Set(this._rawQueryData, "cursor", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("cursor"); + } + init { this._rawQueryData.Set("cursor", value); } } public SubscriptionListParams() { } @@ -37,8 +41,8 @@ public SubscriptionListParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -48,8 +52,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Lists/Subscriptions/SubscriptionListResponse.cs b/src/Courier/Models/Lists/Subscriptions/SubscriptionListResponse.cs index 8bf037d5..858a27ba 100644 --- a/src/Courier/Models/Lists/Subscriptions/SubscriptionListResponse.cs +++ b/src/Courier/Models/Lists/Subscriptions/SubscriptionListResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -14,14 +15,28 @@ public sealed record class SubscriptionListResponse : JsonModel { public required IReadOnlyList Items { - get { return JsonModel.GetNotNullClass>(this.RawData, "items"); } - init { JsonModel.Set(this._rawData, "items", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("items"); + } + init + { + this._rawData.Set>( + "items", + ImmutableArray.ToImmutableArray(value) + ); + } } public required Paging Paging { - get { return JsonModel.GetNotNullClass(this.RawData, "paging"); } - init { JsonModel.Set(this._rawData, "paging", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("paging"); + } + init { this._rawData.Set("paging", value); } } /// @@ -41,14 +56,14 @@ public SubscriptionListResponse(SubscriptionListResponse subscriptionListRespons public SubscriptionListResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SubscriptionListResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -74,23 +89,32 @@ public sealed record class Item : JsonModel { public required string RecipientID { - get { return JsonModel.GetNotNullClass(this.RawData, "recipientId"); } - init { JsonModel.Set(this._rawData, "recipientId", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("recipientId"); + } + init { this._rawData.Set("recipientId", value); } } public string? Created { - get { return JsonModel.GetNullableClass(this.RawData, "created"); } - init { JsonModel.Set(this._rawData, "created", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("created"); + } + init { this._rawData.Set("created", value); } } public RecipientPreferences? Preferences { get { - return JsonModel.GetNullableClass(this.RawData, "preferences"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass("preferences"); } - init { JsonModel.Set(this._rawData, "preferences", value); } + init { this._rawData.Set("preferences", value); } } /// @@ -108,14 +132,14 @@ public Item(Item item) public Item(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Item(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Lists/Subscriptions/SubscriptionSubscribeParams.cs b/src/Courier/Models/Lists/Subscriptions/SubscriptionSubscribeParams.cs index e0273c1b..de4b3867 100644 --- a/src/Courier/Models/Lists/Subscriptions/SubscriptionSubscribeParams.cs +++ b/src/Courier/Models/Lists/Subscriptions/SubscriptionSubscribeParams.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Net.Http; using System.Text; @@ -15,7 +16,7 @@ namespace Courier.Models.Lists.Subscriptions; /// public sealed record class SubscriptionSubscribeParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -27,12 +28,18 @@ public required IReadOnlyList Recipients { get { - return JsonModel.GetNotNullClass>( - this.RawBodyData, + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullStruct>( "recipients" ); } - init { JsonModel.Set(this._rawBodyData, "recipients", value); } + init + { + this._rawBodyData.Set>( + "recipients", + ImmutableArray.ToImmutableArray(value) + ); + } } public SubscriptionSubscribeParams() { } @@ -42,7 +49,7 @@ public SubscriptionSubscribeParams(SubscriptionSubscribeParams subscriptionSubsc { this.ListID = subscriptionSubscribeParams.ListID; - this._rawBodyData = [.. subscriptionSubscribeParams._rawBodyData]; + this._rawBodyData = new(subscriptionSubscribeParams._rawBodyData); } public SubscriptionSubscribeParams( @@ -51,9 +58,9 @@ public SubscriptionSubscribeParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -64,9 +71,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -98,7 +105,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Lists/Subscriptions/SubscriptionSubscribeUserParams.cs b/src/Courier/Models/Lists/Subscriptions/SubscriptionSubscribeUserParams.cs index dde59189..a06b743f 100644 --- a/src/Courier/Models/Lists/Subscriptions/SubscriptionSubscribeUserParams.cs +++ b/src/Courier/Models/Lists/Subscriptions/SubscriptionSubscribeUserParams.cs @@ -15,7 +15,7 @@ namespace Courier.Models.Lists.Subscriptions; /// public sealed record class SubscriptionSubscribeUserParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -29,12 +29,10 @@ public RecipientPreferences? Preferences { get { - return JsonModel.GetNullableClass( - this.RawBodyData, - "preferences" - ); + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("preferences"); } - init { JsonModel.Set(this._rawBodyData, "preferences", value); } + init { this._rawBodyData.Set("preferences", value); } } public SubscriptionSubscribeUserParams() { } @@ -47,7 +45,7 @@ SubscriptionSubscribeUserParams subscriptionSubscribeUserParams this.ListID = subscriptionSubscribeUserParams.ListID; this.UserID = subscriptionSubscribeUserParams.UserID; - this._rawBodyData = [.. subscriptionSubscribeUserParams._rawBodyData]; + this._rawBodyData = new(subscriptionSubscribeUserParams._rawBodyData); } public SubscriptionSubscribeUserParams( @@ -56,9 +54,9 @@ public SubscriptionSubscribeUserParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -69,9 +67,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -103,7 +101,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Lists/Subscriptions/SubscriptionUnsubscribeUserParams.cs b/src/Courier/Models/Lists/Subscriptions/SubscriptionUnsubscribeUserParams.cs index 554f60d4..5ff661ac 100644 --- a/src/Courier/Models/Lists/Subscriptions/SubscriptionUnsubscribeUserParams.cs +++ b/src/Courier/Models/Lists/Subscriptions/SubscriptionUnsubscribeUserParams.cs @@ -33,8 +33,8 @@ public SubscriptionUnsubscribeUserParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -44,8 +44,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/MessageContext.cs b/src/Courier/Models/MessageContext.cs index 9f670b44..bf8b3efe 100644 --- a/src/Courier/Models/MessageContext.cs +++ b/src/Courier/Models/MessageContext.cs @@ -15,8 +15,12 @@ public sealed record class MessageContext : JsonModel /// public string? TenantID { - get { return JsonModel.GetNullableClass(this.RawData, "tenant_id"); } - init { JsonModel.Set(this._rawData, "tenant_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("tenant_id"); + } + init { this._rawData.Set("tenant_id", value); } } /// @@ -32,14 +36,14 @@ public MessageContext(MessageContext messageContext) public MessageContext(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] MessageContext(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/MessageRouting.cs b/src/Courier/Models/MessageRouting.cs index d9b3ca3b..be931e16 100644 --- a/src/Courier/Models/MessageRouting.cs +++ b/src/Courier/Models/MessageRouting.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -16,15 +17,28 @@ public required IReadOnlyList Channels { get { - return JsonModel.GetNotNullClass>(this.RawData, "channels"); + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>( + "channels" + ); + } + init + { + this._rawData.Set>( + "channels", + ImmutableArray.ToImmutableArray(value) + ); } - init { JsonModel.Set(this._rawData, "channels", value); } } public required ApiEnum Method { - get { return JsonModel.GetNotNullClass>(this.RawData, "method"); } - init { JsonModel.Set(this._rawData, "method", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("method"); + } + init { this._rawData.Set("method", value); } } /// @@ -44,14 +58,14 @@ public MessageRouting(MessageRouting messageRouting) public MessageRouting(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] MessageRouting(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/MessageRoutingChannel.cs b/src/Courier/Models/MessageRoutingChannel.cs index 409dba44..83a440b7 100644 --- a/src/Courier/Models/MessageRoutingChannel.cs +++ b/src/Courier/Models/MessageRoutingChannel.cs @@ -16,7 +16,13 @@ public record class MessageRoutingChannel : ModelBase public JsonElement Json { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } + get + { + return this._element ??= JsonSerializer.SerializeToElement( + this.Value, + ModelBase.SerializerOptions + ); + } } public MessageRoutingChannel(string value, JsonElement? element = null) diff --git a/src/Courier/Models/Messages/MessageCancelParams.cs b/src/Courier/Models/Messages/MessageCancelParams.cs index eca80869..976cd48a 100644 --- a/src/Courier/Models/Messages/MessageCancelParams.cs +++ b/src/Courier/Models/Messages/MessageCancelParams.cs @@ -31,8 +31,8 @@ public MessageCancelParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -42,8 +42,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Messages/MessageContentParams.cs b/src/Courier/Models/Messages/MessageContentParams.cs index 2f7bf564..5f2d0298 100644 --- a/src/Courier/Models/Messages/MessageContentParams.cs +++ b/src/Courier/Models/Messages/MessageContentParams.cs @@ -28,8 +28,8 @@ public MessageContentParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Messages/MessageContentResponse.cs b/src/Courier/Models/Messages/MessageContentResponse.cs index 8509a3fd..83041514 100644 --- a/src/Courier/Models/Messages/MessageContentResponse.cs +++ b/src/Courier/Models/Messages/MessageContentResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -15,8 +16,18 @@ public sealed record class MessageContentResponse : JsonModel /// public required IReadOnlyList Results { - get { return JsonModel.GetNotNullClass>(this.RawData, "results"); } - init { JsonModel.Set(this._rawData, "results", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("results"); + } + init + { + this._rawData.Set>( + "results", + ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -35,14 +46,14 @@ public MessageContentResponse(MessageContentResponse messageContentResponse) public MessageContentResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] MessageContentResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -55,7 +66,7 @@ IReadOnlyDictionary rawData } [SetsRequiredMembers] - public MessageContentResponse(List results) + public MessageContentResponse(IReadOnlyList results) : this() { this.Results = results; @@ -78,8 +89,12 @@ public sealed record class Result : JsonModel /// public required string Channel { - get { return JsonModel.GetNotNullClass(this.RawData, "channel"); } - init { JsonModel.Set(this._rawData, "channel", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("channel"); + } + init { this._rawData.Set("channel", value); } } /// @@ -87,8 +102,12 @@ public required string Channel /// public required string ChannelID { - get { return JsonModel.GetNotNullClass(this.RawData, "channel_id"); } - init { JsonModel.Set(this._rawData, "channel_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("channel_id"); + } + init { this._rawData.Set("channel_id", value); } } /// @@ -96,8 +115,12 @@ public required string ChannelID /// public required Content Content { - get { return JsonModel.GetNotNullClass(this.RawData, "content"); } - init { JsonModel.Set(this._rawData, "content", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("content"); + } + init { this._rawData.Set("content", value); } } /// @@ -115,14 +138,14 @@ public Result(Result result) public Result(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Result(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -151,8 +174,18 @@ public sealed record class Content : JsonModel /// public required IReadOnlyList Blocks { - get { return JsonModel.GetNotNullClass>(this.RawData, "blocks"); } - init { JsonModel.Set(this._rawData, "blocks", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("blocks"); + } + init + { + this._rawData.Set>( + "blocks", + ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -160,8 +193,12 @@ public required IReadOnlyList Blocks /// public required string Body { - get { return JsonModel.GetNotNullClass(this.RawData, "body"); } - init { JsonModel.Set(this._rawData, "body", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("body"); + } + init { this._rawData.Set("body", value); } } /// @@ -169,8 +206,12 @@ public required string Body /// public required string Html { - get { return JsonModel.GetNotNullClass(this.RawData, "html"); } - init { JsonModel.Set(this._rawData, "html", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("html"); + } + init { this._rawData.Set("html", value); } } /// @@ -178,8 +219,12 @@ public required string Html /// public required string Subject { - get { return JsonModel.GetNotNullClass(this.RawData, "subject"); } - init { JsonModel.Set(this._rawData, "subject", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("subject"); + } + init { this._rawData.Set("subject", value); } } /// @@ -187,8 +232,12 @@ public required string Subject /// public required string Text { - get { return JsonModel.GetNotNullClass(this.RawData, "text"); } - init { JsonModel.Set(this._rawData, "text", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("text"); + } + init { this._rawData.Set("text", value); } } /// @@ -196,8 +245,12 @@ public required string Text /// public required string Title { - get { return JsonModel.GetNotNullClass(this.RawData, "title"); } - init { JsonModel.Set(this._rawData, "title", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("title"); + } + init { this._rawData.Set("title", value); } } /// @@ -221,14 +274,14 @@ public Content(Content content) public Content(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Content(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -254,8 +307,12 @@ public sealed record class Block : JsonModel /// public required string Text { - get { return JsonModel.GetNotNullClass(this.RawData, "text"); } - init { JsonModel.Set(this._rawData, "text", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("text"); + } + init { this._rawData.Set("text", value); } } /// @@ -263,8 +320,12 @@ public required string Text /// public required string Type { - get { return JsonModel.GetNotNullClass(this.RawData, "type"); } - init { JsonModel.Set(this._rawData, "type", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("type"); + } + init { this._rawData.Set("type", value); } } /// @@ -281,14 +342,14 @@ public Block(Block block) public Block(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Block(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Messages/MessageDetails.cs b/src/Courier/Models/Messages/MessageDetails.cs index 5608fa36..6f772c4b 100644 --- a/src/Courier/Models/Messages/MessageDetails.cs +++ b/src/Courier/Models/Messages/MessageDetails.cs @@ -18,8 +18,12 @@ public sealed record class MessageDetails : JsonModel /// public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } /// @@ -28,8 +32,12 @@ public required string ID /// public required long Clicked { - get { return JsonModel.GetNotNullStruct(this.RawData, "clicked"); } - init { JsonModel.Set(this._rawData, "clicked", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("clicked"); + } + init { this._rawData.Set("clicked", value); } } /// @@ -38,8 +46,12 @@ public required long Clicked /// public required long Delivered { - get { return JsonModel.GetNotNullStruct(this.RawData, "delivered"); } - init { JsonModel.Set(this._rawData, "delivered", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("delivered"); + } + init { this._rawData.Set("delivered", value); } } /// @@ -48,8 +60,12 @@ public required long Delivered /// public required long Enqueued { - get { return JsonModel.GetNotNullStruct(this.RawData, "enqueued"); } - init { JsonModel.Set(this._rawData, "enqueued", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("enqueued"); + } + init { this._rawData.Set("enqueued", value); } } /// @@ -57,8 +73,12 @@ public required long Enqueued /// public required string Event { - get { return JsonModel.GetNotNullClass(this.RawData, "event"); } - init { JsonModel.Set(this._rawData, "event", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("event"); + } + init { this._rawData.Set("event", value); } } /// @@ -66,8 +86,12 @@ public required string Event /// public required string Notification { - get { return JsonModel.GetNotNullClass(this.RawData, "notification"); } - init { JsonModel.Set(this._rawData, "notification", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("notification"); + } + init { this._rawData.Set("notification", value); } } /// @@ -76,8 +100,12 @@ public required string Notification /// public required long Opened { - get { return JsonModel.GetNotNullStruct(this.RawData, "opened"); } - init { JsonModel.Set(this._rawData, "opened", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("opened"); + } + init { this._rawData.Set("opened", value); } } /// @@ -85,8 +113,12 @@ public required long Opened /// public required string Recipient { - get { return JsonModel.GetNotNullClass(this.RawData, "recipient"); } - init { JsonModel.Set(this._rawData, "recipient", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("recipient"); + } + init { this._rawData.Set("recipient", value); } } /// @@ -95,8 +127,12 @@ public required string Recipient /// public required long Sent { - get { return JsonModel.GetNotNullStruct(this.RawData, "sent"); } - init { JsonModel.Set(this._rawData, "sent", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("sent"); + } + init { this._rawData.Set("sent", value); } } /// @@ -104,8 +140,12 @@ public required long Sent /// public required ApiEnum Status { - get { return JsonModel.GetNotNullClass>(this.RawData, "status"); } - init { JsonModel.Set(this._rawData, "status", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("status"); + } + init { this._rawData.Set("status", value); } } /// @@ -113,8 +153,12 @@ public required ApiEnum Status /// public string? Error { - get { return JsonModel.GetNullableClass(this.RawData, "error"); } - init { JsonModel.Set(this._rawData, "error", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("error"); + } + init { this._rawData.Set("error", value); } } /// @@ -122,8 +166,12 @@ public string? Error /// public ApiEnum? Reason { - get { return JsonModel.GetNullableClass>(this.RawData, "reason"); } - init { JsonModel.Set(this._rawData, "reason", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("reason"); + } + init { this._rawData.Set("reason", value); } } /// @@ -150,14 +198,14 @@ public MessageDetails(MessageDetails messageDetails) public MessageDetails(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] MessageDetails(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Messages/MessageHistoryParams.cs b/src/Courier/Models/Messages/MessageHistoryParams.cs index 8fc0169f..ac6f253f 100644 --- a/src/Courier/Models/Messages/MessageHistoryParams.cs +++ b/src/Courier/Models/Messages/MessageHistoryParams.cs @@ -20,8 +20,12 @@ public sealed record class MessageHistoryParams : ParamsBase /// public string? Type { - get { return JsonModel.GetNullableClass(this.RawQueryData, "type"); } - init { JsonModel.Set(this._rawQueryData, "type", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("type"); + } + init { this._rawQueryData.Set("type", value); } } public MessageHistoryParams() { } @@ -37,8 +41,8 @@ public MessageHistoryParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -48,8 +52,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Messages/MessageHistoryResponse.cs b/src/Courier/Models/Messages/MessageHistoryResponse.cs index 7bba1b51..4b74b049 100644 --- a/src/Courier/Models/Messages/MessageHistoryResponse.cs +++ b/src/Courier/Models/Messages/MessageHistoryResponse.cs @@ -1,6 +1,8 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; +using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; using Courier.Core; @@ -10,16 +12,24 @@ namespace Courier.Models.Messages; [JsonConverter(typeof(JsonModelConverter))] public sealed record class MessageHistoryResponse : JsonModel { - public required IReadOnlyList> Results + public required IReadOnlyList> Results { get { - return JsonModel.GetNotNullClass>>( - this.RawData, - "results" + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct< + ImmutableArray> + >("results"); + } + init + { + this._rawData.Set>>( + "results", + ImmutableArray.ToImmutableArray( + Enumerable.Select(value, (item) => FrozenDictionary.ToFrozenDictionary(item)) + ) ); } - init { JsonModel.Set(this._rawData, "results", value); } } /// @@ -35,14 +45,14 @@ public MessageHistoryResponse(MessageHistoryResponse messageHistoryResponse) public MessageHistoryResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] MessageHistoryResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -55,7 +65,7 @@ IReadOnlyDictionary rawData } [SetsRequiredMembers] - public MessageHistoryResponse(List> results) + public MessageHistoryResponse(IReadOnlyList> results) : this() { this.Results = results; diff --git a/src/Courier/Models/Messages/MessageListParams.cs b/src/Courier/Models/Messages/MessageListParams.cs index 372cb941..0be3d68d 100644 --- a/src/Courier/Models/Messages/MessageListParams.cs +++ b/src/Courier/Models/Messages/MessageListParams.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Net.Http; using System.Text.Json; @@ -19,8 +20,12 @@ public sealed record class MessageListParams : ParamsBase /// public bool? Archived { - get { return JsonModel.GetNullableStruct(this.RawQueryData, "archived"); } - init { JsonModel.Set(this._rawQueryData, "archived", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableStruct("archived"); + } + init { this._rawQueryData.Set("archived", value); } } /// @@ -28,8 +33,12 @@ public bool? Archived /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawQueryData, "cursor"); } - init { JsonModel.Set(this._rawQueryData, "cursor", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("cursor"); + } + init { this._rawQueryData.Set("cursor", value); } } /// @@ -37,8 +46,12 @@ public string? Cursor /// public string? EnqueuedAfter { - get { return JsonModel.GetNullableClass(this.RawQueryData, "enqueued_after"); } - init { JsonModel.Set(this._rawQueryData, "enqueued_after", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("enqueued_after"); + } + init { this._rawQueryData.Set("enqueued_after", value); } } /// @@ -46,8 +59,12 @@ public string? EnqueuedAfter /// public string? Event { - get { return JsonModel.GetNullableClass(this.RawQueryData, "event"); } - init { JsonModel.Set(this._rawQueryData, "event", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("event"); + } + init { this._rawQueryData.Set("event", value); } } /// @@ -55,8 +72,12 @@ public string? Event /// public string? List { - get { return JsonModel.GetNullableClass(this.RawQueryData, "list"); } - init { JsonModel.Set(this._rawQueryData, "list", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("list"); + } + init { this._rawQueryData.Set("list", value); } } /// @@ -65,8 +86,12 @@ public string? List /// public string? MessageID { - get { return JsonModel.GetNullableClass(this.RawQueryData, "messageId"); } - init { JsonModel.Set(this._rawQueryData, "messageId", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("messageId"); + } + init { this._rawQueryData.Set("messageId", value); } } /// @@ -74,8 +99,12 @@ public string? MessageID /// public string? Notification { - get { return JsonModel.GetNullableClass(this.RawQueryData, "notification"); } - init { JsonModel.Set(this._rawQueryData, "notification", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("notification"); + } + init { this._rawQueryData.Set("notification", value); } } /// @@ -84,7 +113,11 @@ public string? Notification /// public IReadOnlyList? Provider { - get { return JsonModel.GetNullableClass>(this.RawQueryData, "provider"); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableStruct>("provider"); + } init { if (value == null) @@ -92,7 +125,10 @@ public IReadOnlyList? Provider return; } - JsonModel.Set(this._rawQueryData, "provider", value); + this._rawQueryData.Set?>( + "provider", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); } } @@ -101,8 +137,12 @@ public IReadOnlyList? Provider /// public string? Recipient { - get { return JsonModel.GetNullableClass(this.RawQueryData, "recipient"); } - init { JsonModel.Set(this._rawQueryData, "recipient", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("recipient"); + } + init { this._rawQueryData.Set("recipient", value); } } /// @@ -111,7 +151,11 @@ public string? Recipient /// public IReadOnlyList? Status { - get { return JsonModel.GetNullableClass>(this.RawQueryData, "status"); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableStruct>("status"); + } init { if (value == null) @@ -119,7 +163,10 @@ public IReadOnlyList? Status return; } - JsonModel.Set(this._rawQueryData, "status", value); + this._rawQueryData.Set?>( + "status", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); } } @@ -129,7 +176,11 @@ public IReadOnlyList? Status /// public IReadOnlyList? Tag { - get { return JsonModel.GetNullableClass>(this.RawQueryData, "tag"); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableStruct>("tag"); + } init { if (value == null) @@ -137,7 +188,10 @@ public IReadOnlyList? Tag return; } - JsonModel.Set(this._rawQueryData, "tag", value); + this._rawQueryData.Set?>( + "tag", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); } } @@ -147,8 +201,12 @@ public IReadOnlyList? Tag /// public string? Tags { - get { return JsonModel.GetNullableClass(this.RawQueryData, "tags"); } - init { JsonModel.Set(this._rawQueryData, "tags", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("tags"); + } + init { this._rawQueryData.Set("tags", value); } } /// @@ -156,8 +214,12 @@ public string? Tags /// public string? TenantID { - get { return JsonModel.GetNullableClass(this.RawQueryData, "tenant_id"); } - init { JsonModel.Set(this._rawQueryData, "tenant_id", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("tenant_id"); + } + init { this._rawQueryData.Set("tenant_id", value); } } /// @@ -165,8 +227,12 @@ public string? TenantID /// public string? TraceID { - get { return JsonModel.GetNullableClass(this.RawQueryData, "traceId"); } - init { JsonModel.Set(this._rawQueryData, "traceId", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("traceId"); + } + init { this._rawQueryData.Set("traceId", value); } } public MessageListParams() { } @@ -179,8 +245,8 @@ public MessageListParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -190,8 +256,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Messages/MessageListResponse.cs b/src/Courier/Models/Messages/MessageListResponse.cs index 03d044f1..e04ae3de 100644 --- a/src/Courier/Models/Messages/MessageListResponse.cs +++ b/src/Courier/Models/Messages/MessageListResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -15,8 +16,12 @@ public sealed record class MessageListResponse : JsonModel /// public required Paging Paging { - get { return JsonModel.GetNotNullClass(this.RawData, "paging"); } - init { JsonModel.Set(this._rawData, "paging", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("paging"); + } + init { this._rawData.Set("paging", value); } } /// @@ -24,8 +29,18 @@ public required Paging Paging /// public required IReadOnlyList Results { - get { return JsonModel.GetNotNullClass>(this.RawData, "results"); } - init { JsonModel.Set(this._rawData, "results", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("results"); + } + init + { + this._rawData.Set>( + "results", + ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -45,14 +60,14 @@ public MessageListResponse(MessageListResponse messageListResponse) public MessageListResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] MessageListResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Messages/MessageRetrieveParams.cs b/src/Courier/Models/Messages/MessageRetrieveParams.cs index 7be85e28..4ef808b8 100644 --- a/src/Courier/Models/Messages/MessageRetrieveParams.cs +++ b/src/Courier/Models/Messages/MessageRetrieveParams.cs @@ -28,8 +28,8 @@ public MessageRetrieveParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Messages/MessageRetrieveResponse.cs b/src/Courier/Models/Messages/MessageRetrieveResponse.cs index 649051d9..1fdac328 100644 --- a/src/Courier/Models/Messages/MessageRetrieveResponse.cs +++ b/src/Courier/Models/Messages/MessageRetrieveResponse.cs @@ -1,6 +1,8 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; +using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; using Courier.Core; @@ -16,8 +18,12 @@ public sealed record class MessageRetrieveResponse : JsonModel /// public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } /// @@ -26,8 +32,12 @@ public required string ID /// public required long Clicked { - get { return JsonModel.GetNotNullStruct(this.RawData, "clicked"); } - init { JsonModel.Set(this._rawData, "clicked", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("clicked"); + } + init { this._rawData.Set("clicked", value); } } /// @@ -36,8 +46,12 @@ public required long Clicked /// public required long Delivered { - get { return JsonModel.GetNotNullStruct(this.RawData, "delivered"); } - init { JsonModel.Set(this._rawData, "delivered", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("delivered"); + } + init { this._rawData.Set("delivered", value); } } /// @@ -46,8 +60,12 @@ public required long Delivered /// public required long Enqueued { - get { return JsonModel.GetNotNullStruct(this.RawData, "enqueued"); } - init { JsonModel.Set(this._rawData, "enqueued", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("enqueued"); + } + init { this._rawData.Set("enqueued", value); } } /// @@ -55,8 +73,12 @@ public required long Enqueued /// public required string Event { - get { return JsonModel.GetNotNullClass(this.RawData, "event"); } - init { JsonModel.Set(this._rawData, "event", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("event"); + } + init { this._rawData.Set("event", value); } } /// @@ -64,8 +86,12 @@ public required string Event /// public required string Notification { - get { return JsonModel.GetNotNullClass(this.RawData, "notification"); } - init { JsonModel.Set(this._rawData, "notification", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("notification"); + } + init { this._rawData.Set("notification", value); } } /// @@ -74,8 +100,12 @@ public required string Notification /// public required long Opened { - get { return JsonModel.GetNotNullStruct(this.RawData, "opened"); } - init { JsonModel.Set(this._rawData, "opened", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("opened"); + } + init { this._rawData.Set("opened", value); } } /// @@ -83,8 +113,12 @@ public required long Opened /// public required string Recipient { - get { return JsonModel.GetNotNullClass(this.RawData, "recipient"); } - init { JsonModel.Set(this._rawData, "recipient", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("recipient"); + } + init { this._rawData.Set("recipient", value); } } /// @@ -93,8 +127,12 @@ public required string Recipient /// public required long Sent { - get { return JsonModel.GetNotNullStruct(this.RawData, "sent"); } - init { JsonModel.Set(this._rawData, "sent", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("sent"); + } + init { this._rawData.Set("sent", value); } } /// @@ -102,8 +140,12 @@ public required long Sent /// public required ApiEnum Status { - get { return JsonModel.GetNotNullClass>(this.RawData, "status"); } - init { JsonModel.Set(this._rawData, "status", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("status"); + } + init { this._rawData.Set("status", value); } } /// @@ -111,8 +153,12 @@ public required ApiEnum Status /// public string? Error { - get { return JsonModel.GetNullableClass(this.RawData, "error"); } - init { JsonModel.Set(this._rawData, "error", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("error"); + } + init { this._rawData.Set("error", value); } } /// @@ -120,20 +166,37 @@ public string? Error /// public ApiEnum? Reason { - get { return JsonModel.GetNullableClass>(this.RawData, "reason"); } - init { JsonModel.Set(this._rawData, "reason", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("reason"); + } + init { this._rawData.Set("reason", value); } } - public IReadOnlyList>? Providers + public IReadOnlyList>? Providers { get { - return JsonModel.GetNullableClass>>( - this.RawData, - "providers" + this._rawData.Freeze(); + return this._rawData.GetNullableStruct< + ImmutableArray> + >("providers"); + } + init + { + this._rawData.Set>?>( + "providers", + value == null + ? null + : ImmutableArray.ToImmutableArray( + Enumerable.Select( + value, + (item) => FrozenDictionary.ToFrozenDictionary(item) + ) + ) ); } - init { JsonModel.Set(this._rawData, "providers", value); } } public static implicit operator MessageDetails( @@ -180,14 +243,14 @@ public MessageRetrieveResponse(MessageRetrieveResponse messageRetrieveResponse) public MessageRetrieveResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] MessageRetrieveResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -216,16 +279,29 @@ IReadOnlyDictionary rawData )] public sealed record class IntersectionMember1 : JsonModel { - public IReadOnlyList>? Providers + public IReadOnlyList>? Providers { get { - return JsonModel.GetNullableClass>>( - this.RawData, - "providers" + this._rawData.Freeze(); + return this._rawData.GetNullableStruct< + ImmutableArray> + >("providers"); + } + init + { + this._rawData.Set>?>( + "providers", + value == null + ? null + : ImmutableArray.ToImmutableArray( + Enumerable.Select( + value, + (item) => FrozenDictionary.ToFrozenDictionary(item) + ) + ) ); } - init { JsonModel.Set(this._rawData, "providers", value); } } /// @@ -243,14 +319,14 @@ public IntersectionMember1( public IntersectionMember1(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] IntersectionMember1(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/MsTeams.cs b/src/Courier/Models/MsTeams.cs index 14d164be..807e439b 100644 --- a/src/Courier/Models/MsTeams.cs +++ b/src/Courier/Models/MsTeams.cs @@ -16,7 +16,13 @@ public record class MsTeams : ModelBase public JsonElement Json { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } + get + { + return this._element ??= JsonSerializer.SerializeToElement( + this.Value, + ModelBase.SerializerOptions + ); + } } public string ServiceUrl diff --git a/src/Courier/Models/MsTeamsBaseProperties.cs b/src/Courier/Models/MsTeamsBaseProperties.cs index 2a36f1a9..2bd22195 100644 --- a/src/Courier/Models/MsTeamsBaseProperties.cs +++ b/src/Courier/Models/MsTeamsBaseProperties.cs @@ -12,14 +12,22 @@ public sealed record class MsTeamsBaseProperties : JsonModel { public required string ServiceUrl { - get { return JsonModel.GetNotNullClass(this.RawData, "service_url"); } - init { JsonModel.Set(this._rawData, "service_url", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("service_url"); + } + init { this._rawData.Set("service_url", value); } } public required string TenantID { - get { return JsonModel.GetNotNullClass(this.RawData, "tenant_id"); } - init { JsonModel.Set(this._rawData, "tenant_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("tenant_id"); + } + init { this._rawData.Set("tenant_id", value); } } /// @@ -36,14 +44,14 @@ public MsTeamsBaseProperties(MsTeamsBaseProperties msTeamsBaseProperties) public MsTeamsBaseProperties(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] MsTeamsBaseProperties(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/MsTeamsRecipient.cs b/src/Courier/Models/MsTeamsRecipient.cs index 9baba4f8..8c14b8df 100644 --- a/src/Courier/Models/MsTeamsRecipient.cs +++ b/src/Courier/Models/MsTeamsRecipient.cs @@ -15,8 +15,12 @@ public sealed record class MsTeamsRecipient : JsonModel { public required MsTeams MsTeams { - get { return JsonModel.GetNotNullClass(this.RawData, "ms_teams"); } - init { JsonModel.Set(this._rawData, "ms_teams", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("ms_teams"); + } + init { this._rawData.Set("ms_teams", value); } } /// @@ -32,14 +36,14 @@ public MsTeamsRecipient(MsTeamsRecipient msTeamsRecipient) public MsTeamsRecipient(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] MsTeamsRecipient(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/MultipleTokens.cs b/src/Courier/Models/MultipleTokens.cs index 3a4e7b7c..0da4e4dd 100644 --- a/src/Courier/Models/MultipleTokens.cs +++ b/src/Courier/Models/MultipleTokens.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -12,8 +13,18 @@ public sealed record class MultipleTokens : JsonModel { public required IReadOnlyList Tokens { - get { return JsonModel.GetNotNullClass>(this.RawData, "tokens"); } - init { JsonModel.Set(this._rawData, "tokens", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("tokens"); + } + init + { + this._rawData.Set>( + "tokens", + ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -32,14 +43,14 @@ public MultipleTokens(MultipleTokens multipleTokens) public MultipleTokens(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] MultipleTokens(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -50,7 +61,7 @@ public static MultipleTokens FromRawUnchecked(IReadOnlyDictionary tokens) + public MultipleTokens(IReadOnlyList tokens) : this() { this.Tokens = tokens; diff --git a/src/Courier/Models/NotificationPreferenceDetails.cs b/src/Courier/Models/NotificationPreferenceDetails.cs index 22859536..6520ed49 100644 --- a/src/Courier/Models/NotificationPreferenceDetails.cs +++ b/src/Courier/Models/NotificationPreferenceDetails.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -16,30 +17,44 @@ public required ApiEnum Status { get { - return JsonModel.GetNotNullClass>( - this.RawData, - "status" - ); + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("status"); } - init { JsonModel.Set(this._rawData, "status", value); } + init { this._rawData.Set("status", value); } } public IReadOnlyList? ChannelPreferences { get { - return JsonModel.GetNullableClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>( "channel_preferences" ); } - init { JsonModel.Set(this._rawData, "channel_preferences", value); } + init + { + this._rawData.Set?>( + "channel_preferences", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } public IReadOnlyList? Rules { - get { return JsonModel.GetNullableClass>(this.RawData, "rules"); } - init { JsonModel.Set(this._rawData, "rules", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("rules"); + } + init + { + this._rawData.Set?>( + "rules", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -65,14 +80,14 @@ NotificationPreferenceDetails notificationPreferenceDetails public NotificationPreferenceDetails(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] NotificationPreferenceDetails(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Notifications/BaseCheck.cs b/src/Courier/Models/Notifications/BaseCheck.cs index 0e69019d..d7b50638 100644 --- a/src/Courier/Models/Notifications/BaseCheck.cs +++ b/src/Courier/Models/Notifications/BaseCheck.cs @@ -14,25 +14,34 @@ public sealed record class BaseCheck : JsonModel { public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } public required ApiEnum Status { - get { return JsonModel.GetNotNullClass>(this.RawData, "status"); } - init { JsonModel.Set(this._rawData, "status", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("status"); + } + init { this._rawData.Set("status", value); } } public required ApiEnum Type { get { - return JsonModel.GetNotNullClass< + this._rawData.Freeze(); + return this._rawData.GetNotNullClass< ApiEnum - >(this.RawData, "type"); + >("type"); } - init { JsonModel.Set(this._rawData, "type", value); } + init { this._rawData.Set("type", value); } } /// @@ -50,14 +59,14 @@ public BaseCheck(BaseCheck baseCheck) public BaseCheck(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] BaseCheck(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Notifications/Check.cs b/src/Courier/Models/Notifications/Check.cs index a238bd96..76b6bfa5 100644 --- a/src/Courier/Models/Notifications/Check.cs +++ b/src/Courier/Models/Notifications/Check.cs @@ -12,31 +12,44 @@ public sealed record class Check : JsonModel { public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } public required ApiEnum Status { - get { return JsonModel.GetNotNullClass>(this.RawData, "status"); } - init { JsonModel.Set(this._rawData, "status", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("status"); + } + init { this._rawData.Set("status", value); } } public required ApiEnum Type { get { - return JsonModel.GetNotNullClass< + this._rawData.Freeze(); + return this._rawData.GetNotNullClass< ApiEnum - >(this.RawData, "type"); + >("type"); } - init { JsonModel.Set(this._rawData, "type", value); } + init { this._rawData.Set("type", value); } } public required long Updated { - get { return JsonModel.GetNotNullStruct(this.RawData, "updated"); } - init { JsonModel.Set(this._rawData, "updated", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("updated"); + } + init { this._rawData.Set("updated", value); } } public static implicit operator BaseCheck(Check check) => @@ -63,14 +76,14 @@ public Check(Check check) public Check(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Check(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -98,8 +111,12 @@ public sealed record class IntersectionMember1 : JsonModel { public required long Updated { - get { return JsonModel.GetNotNullStruct(this.RawData, "updated"); } - init { JsonModel.Set(this._rawData, "updated", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("updated"); + } + init { this._rawData.Set("updated", value); } } /// @@ -117,14 +134,14 @@ public IntersectionMember1( public IntersectionMember1(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] IntersectionMember1(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Notifications/Checks/CheckDeleteParams.cs b/src/Courier/Models/Notifications/Checks/CheckDeleteParams.cs index aa38071b..e6bba1ca 100644 --- a/src/Courier/Models/Notifications/Checks/CheckDeleteParams.cs +++ b/src/Courier/Models/Notifications/Checks/CheckDeleteParams.cs @@ -28,8 +28,8 @@ public CheckDeleteParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Notifications/Checks/CheckListParams.cs b/src/Courier/Models/Notifications/Checks/CheckListParams.cs index 211b18eb..d43c2568 100644 --- a/src/Courier/Models/Notifications/Checks/CheckListParams.cs +++ b/src/Courier/Models/Notifications/Checks/CheckListParams.cs @@ -28,8 +28,8 @@ public CheckListParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Notifications/Checks/CheckListResponse.cs b/src/Courier/Models/Notifications/Checks/CheckListResponse.cs index d030b161..74956294 100644 --- a/src/Courier/Models/Notifications/Checks/CheckListResponse.cs +++ b/src/Courier/Models/Notifications/Checks/CheckListResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -12,8 +13,18 @@ public sealed record class CheckListResponse : JsonModel { public required IReadOnlyList Checks { - get { return JsonModel.GetNotNullClass>(this.RawData, "checks"); } - init { JsonModel.Set(this._rawData, "checks", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("checks"); + } + init + { + this._rawData.Set>( + "checks", + ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -32,14 +43,14 @@ public CheckListResponse(CheckListResponse checkListResponse) public CheckListResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] CheckListResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -52,7 +63,7 @@ IReadOnlyDictionary rawData } [SetsRequiredMembers] - public CheckListResponse(List checks) + public CheckListResponse(IReadOnlyList checks) : this() { this.Checks = checks; diff --git a/src/Courier/Models/Notifications/Checks/CheckUpdateParams.cs b/src/Courier/Models/Notifications/Checks/CheckUpdateParams.cs index a7963353..912629ab 100644 --- a/src/Courier/Models/Notifications/Checks/CheckUpdateParams.cs +++ b/src/Courier/Models/Notifications/Checks/CheckUpdateParams.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Net.Http; using System.Text; @@ -11,7 +12,7 @@ namespace Courier.Models.Notifications.Checks; public sealed record class CheckUpdateParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -23,8 +24,18 @@ public IReadOnlyDictionary RawBodyData public required IReadOnlyList Checks { - get { return JsonModel.GetNotNullClass>(this.RawBodyData, "checks"); } - init { JsonModel.Set(this._rawBodyData, "checks", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullStruct>("checks"); + } + init + { + this._rawBodyData.Set>( + "checks", + ImmutableArray.ToImmutableArray(value) + ); + } } public CheckUpdateParams() { } @@ -35,7 +46,7 @@ public CheckUpdateParams(CheckUpdateParams checkUpdateParams) this.ID = checkUpdateParams.ID; this.SubmissionID = checkUpdateParams.SubmissionID; - this._rawBodyData = [.. checkUpdateParams._rawBodyData]; + this._rawBodyData = new(checkUpdateParams._rawBodyData); } public CheckUpdateParams( @@ -44,9 +55,9 @@ public CheckUpdateParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -57,9 +68,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -91,7 +102,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Notifications/Checks/CheckUpdateResponse.cs b/src/Courier/Models/Notifications/Checks/CheckUpdateResponse.cs index 9c8a5804..2c3c2fb4 100644 --- a/src/Courier/Models/Notifications/Checks/CheckUpdateResponse.cs +++ b/src/Courier/Models/Notifications/Checks/CheckUpdateResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -12,8 +13,18 @@ public sealed record class CheckUpdateResponse : JsonModel { public required IReadOnlyList Checks { - get { return JsonModel.GetNotNullClass>(this.RawData, "checks"); } - init { JsonModel.Set(this._rawData, "checks", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("checks"); + } + init + { + this._rawData.Set>( + "checks", + ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -32,14 +43,14 @@ public CheckUpdateResponse(CheckUpdateResponse checkUpdateResponse) public CheckUpdateResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] CheckUpdateResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -52,7 +63,7 @@ IReadOnlyDictionary rawData } [SetsRequiredMembers] - public CheckUpdateResponse(List checks) + public CheckUpdateResponse(IReadOnlyList checks) : this() { this.Checks = checks; diff --git a/src/Courier/Models/Notifications/Draft/DraftRetrieveContentParams.cs b/src/Courier/Models/Notifications/Draft/DraftRetrieveContentParams.cs index b9ad1fe7..4bf42a1d 100644 --- a/src/Courier/Models/Notifications/Draft/DraftRetrieveContentParams.cs +++ b/src/Courier/Models/Notifications/Draft/DraftRetrieveContentParams.cs @@ -25,8 +25,8 @@ public DraftRetrieveContentParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -36,8 +36,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Notifications/NotificationGetContent.cs b/src/Courier/Models/Notifications/NotificationGetContent.cs index 3086799b..fa15bda1 100644 --- a/src/Courier/Models/Notifications/NotificationGetContent.cs +++ b/src/Courier/Models/Notifications/NotificationGetContent.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -14,20 +15,44 @@ public sealed record class NotificationGetContent : JsonModel { public IReadOnlyList? Blocks { - get { return JsonModel.GetNullableClass>(this.RawData, "blocks"); } - init { JsonModel.Set(this._rawData, "blocks", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("blocks"); + } + init + { + this._rawData.Set?>( + "blocks", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } public IReadOnlyList? Channels { - get { return JsonModel.GetNullableClass>(this.RawData, "channels"); } - init { JsonModel.Set(this._rawData, "channels", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("channels"); + } + init + { + this._rawData.Set?>( + "channels", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } public string? Checksum { - get { return JsonModel.GetNullableClass(this.RawData, "checksum"); } - init { JsonModel.Set(this._rawData, "checksum", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("checksum"); + } + init { this._rawData.Set("checksum", value); } } /// @@ -51,14 +76,14 @@ public NotificationGetContent(NotificationGetContent notificationGetContent) public NotificationGetContent(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] NotificationGetContent(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -84,47 +109,78 @@ public sealed record class Block : JsonModel { public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } public required ApiEnum Type { - get { return JsonModel.GetNotNullClass>(this.RawData, "type"); } - init { JsonModel.Set(this._rawData, "type", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("type"); + } + init { this._rawData.Set("type", value); } } public string? Alias { - get { return JsonModel.GetNullableClass(this.RawData, "alias"); } - init { JsonModel.Set(this._rawData, "alias", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("alias"); + } + init { this._rawData.Set("alias", value); } } public string? Checksum { - get { return JsonModel.GetNullableClass(this.RawData, "checksum"); } - init { JsonModel.Set(this._rawData, "checksum", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("checksum"); + } + init { this._rawData.Set("checksum", value); } } public Content? Content { - get { return JsonModel.GetNullableClass(this.RawData, "content"); } - init { JsonModel.Set(this._rawData, "content", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("content"); + } + init { this._rawData.Set("content", value); } } public string? Context { - get { return JsonModel.GetNullableClass(this.RawData, "context"); } - init { JsonModel.Set(this._rawData, "context", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("context"); + } + init { this._rawData.Set("context", value); } } public IReadOnlyDictionary? Locales { get { - return JsonModel.GetNullableClass>(this.RawData, "locales"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("locales"); + } + init + { + this._rawData.Set?>( + "locales", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); } - init { JsonModel.Set(this._rawData, "locales", value); } } /// @@ -152,14 +208,14 @@ public Block(Block block) public Block(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Block(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -251,7 +307,13 @@ public record class Content : ModelBase public JsonElement Json { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } + get + { + return this._element ??= JsonSerializer.SerializeToElement( + this.Value, + ModelBase.SerializerOptions + ); + } } public Content(string value, JsonElement? element = null) @@ -482,14 +544,22 @@ public sealed record class NotificationContentHierarchy : JsonModel { public string? Children { - get { return JsonModel.GetNullableClass(this.RawData, "children"); } - init { JsonModel.Set(this._rawData, "children", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("children"); + } + init { this._rawData.Set("children", value); } } public string? Parent { - get { return JsonModel.GetNullableClass(this.RawData, "parent"); } - init { JsonModel.Set(this._rawData, "parent", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("parent"); + } + init { this._rawData.Set("parent", value); } } /// @@ -506,14 +576,14 @@ public NotificationContentHierarchy(NotificationContentHierarchy notificationCon public NotificationContentHierarchy(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] NotificationContentHierarchy(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -543,7 +613,13 @@ public record class Locale : ModelBase public JsonElement Json { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } + get + { + return this._element ??= JsonSerializer.SerializeToElement( + this.Value, + ModelBase.SerializerOptions + ); + } } public Locale(string value, JsonElement? element = null) @@ -777,14 +853,22 @@ public sealed record class LocaleNotificationContentHierarchy : JsonModel { public string? Children { - get { return JsonModel.GetNullableClass(this.RawData, "children"); } - init { JsonModel.Set(this._rawData, "children", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("children"); + } + init { this._rawData.Set("children", value); } } public string? Parent { - get { return JsonModel.GetNullableClass(this.RawData, "parent"); } - init { JsonModel.Set(this._rawData, "parent", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("parent"); + } + init { this._rawData.Set("parent", value); } } /// @@ -803,14 +887,14 @@ LocaleNotificationContentHierarchy localeNotificationContentHierarchy public LocaleNotificationContentHierarchy(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] LocaleNotificationContentHierarchy(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -836,38 +920,58 @@ public sealed record class Channel : JsonModel { public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } public string? Checksum { - get { return JsonModel.GetNullableClass(this.RawData, "checksum"); } - init { JsonModel.Set(this._rawData, "checksum", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("checksum"); + } + init { this._rawData.Set("checksum", value); } } public ChannelContent? Content { - get { return JsonModel.GetNullableClass(this.RawData, "content"); } - init { JsonModel.Set(this._rawData, "content", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("content"); + } + init { this._rawData.Set("content", value); } } public IReadOnlyDictionary? Locales { get { - return JsonModel.GetNullableClass>( - this.RawData, - "locales" + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("locales"); + } + init + { + this._rawData.Set?>( + "locales", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "locales", value); } } public string? Type { - get { return JsonModel.GetNullableClass(this.RawData, "type"); } - init { JsonModel.Set(this._rawData, "type", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("type"); + } + init { this._rawData.Set("type", value); } } /// @@ -893,14 +997,14 @@ public Channel(Channel channel) public Channel(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Channel(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -930,14 +1034,22 @@ public sealed record class ChannelContent : JsonModel { public string? Subject { - get { return JsonModel.GetNullableClass(this.RawData, "subject"); } - init { JsonModel.Set(this._rawData, "subject", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("subject"); + } + init { this._rawData.Set("subject", value); } } public string? Title { - get { return JsonModel.GetNullableClass(this.RawData, "title"); } - init { JsonModel.Set(this._rawData, "title", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("title"); + } + init { this._rawData.Set("title", value); } } /// @@ -954,14 +1066,14 @@ public ChannelContent(ChannelContent channelContent) public ChannelContent(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ChannelContent(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -984,14 +1096,22 @@ public sealed record class LocalesItem : JsonModel { public string? Subject { - get { return JsonModel.GetNullableClass(this.RawData, "subject"); } - init { JsonModel.Set(this._rawData, "subject", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("subject"); + } + init { this._rawData.Set("subject", value); } } public string? Title { - get { return JsonModel.GetNullableClass(this.RawData, "title"); } - init { JsonModel.Set(this._rawData, "title", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("title"); + } + init { this._rawData.Set("title", value); } } /// @@ -1008,14 +1128,14 @@ public LocalesItem(LocalesItem localesItem) public LocalesItem(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] LocalesItem(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Notifications/NotificationListParams.cs b/src/Courier/Models/Notifications/NotificationListParams.cs index 8b3e381e..7e8e5e56 100644 --- a/src/Courier/Models/Notifications/NotificationListParams.cs +++ b/src/Courier/Models/Notifications/NotificationListParams.cs @@ -12,8 +12,12 @@ public sealed record class NotificationListParams : ParamsBase { public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawQueryData, "cursor"); } - init { JsonModel.Set(this._rawQueryData, "cursor", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("cursor"); + } + init { this._rawQueryData.Set("cursor", value); } } /// @@ -21,8 +25,12 @@ public string? Cursor /// public bool? Notes { - get { return JsonModel.GetNullableStruct(this.RawQueryData, "notes"); } - init { JsonModel.Set(this._rawQueryData, "notes", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableStruct("notes"); + } + init { this._rawQueryData.Set("notes", value); } } public NotificationListParams() { } @@ -35,8 +43,8 @@ public NotificationListParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -46,8 +54,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Notifications/NotificationListResponse.cs b/src/Courier/Models/Notifications/NotificationListResponse.cs index c5e19741..508a0e5d 100644 --- a/src/Courier/Models/Notifications/NotificationListResponse.cs +++ b/src/Courier/Models/Notifications/NotificationListResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -14,14 +15,28 @@ public sealed record class NotificationListResponse : JsonModel { public required Paging Paging { - get { return JsonModel.GetNotNullClass(this.RawData, "paging"); } - init { JsonModel.Set(this._rawData, "paging", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("paging"); + } + init { this._rawData.Set("paging", value); } } public required IReadOnlyList Results { - get { return JsonModel.GetNotNullClass>(this.RawData, "results"); } - init { JsonModel.Set(this._rawData, "results", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("results"); + } + init + { + this._rawData.Set>( + "results", + ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -41,14 +56,14 @@ public NotificationListResponse(NotificationListResponse notificationListRespons public NotificationListResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] NotificationListResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -74,14 +89,22 @@ public sealed record class Result : JsonModel { public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } public required long CreatedAt { - get { return JsonModel.GetNotNullStruct(this.RawData, "created_at"); } - init { JsonModel.Set(this._rawData, "created_at", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("created_at"); + } + init { this._rawData.Set("created_at", value); } } /// @@ -89,44 +112,78 @@ public required long CreatedAt /// public required IReadOnlyList EventIds { - get { return JsonModel.GetNotNullClass>(this.RawData, "event_ids"); } - init { JsonModel.Set(this._rawData, "event_ids", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("event_ids"); + } + init + { + this._rawData.Set>( + "event_ids", + ImmutableArray.ToImmutableArray(value) + ); + } } public required string Note { - get { return JsonModel.GetNotNullClass(this.RawData, "note"); } - init { JsonModel.Set(this._rawData, "note", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("note"); + } + init { this._rawData.Set("note", value); } } public required MessageRouting Routing { - get { return JsonModel.GetNotNullClass(this.RawData, "routing"); } - init { JsonModel.Set(this._rawData, "routing", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("routing"); + } + init { this._rawData.Set("routing", value); } } public required string TopicID { - get { return JsonModel.GetNotNullClass(this.RawData, "topic_id"); } - init { JsonModel.Set(this._rawData, "topic_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("topic_id"); + } + init { this._rawData.Set("topic_id", value); } } public required long UpdatedAt { - get { return JsonModel.GetNotNullStruct(this.RawData, "updated_at"); } - init { JsonModel.Set(this._rawData, "updated_at", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("updated_at"); + } + init { this._rawData.Set("updated_at", value); } } public Tags? Tags { - get { return JsonModel.GetNullableClass(this.RawData, "tags"); } - init { JsonModel.Set(this._rawData, "tags", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("tags"); + } + init { this._rawData.Set("tags", value); } } public string? Title { - get { return JsonModel.GetNullableClass(this.RawData, "title"); } - init { JsonModel.Set(this._rawData, "title", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("title"); + } + init { this._rawData.Set("title", value); } } /// @@ -150,14 +207,14 @@ public Result(Result result) public Result(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Result(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -180,8 +237,15 @@ public sealed record class Tags : JsonModel { public required IReadOnlyList Data { - get { return JsonModel.GetNotNullClass>(this.RawData, "data"); } - init { JsonModel.Set(this._rawData, "data", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("data"); + } + init + { + this._rawData.Set>("data", ImmutableArray.ToImmutableArray(value)); + } } /// @@ -200,14 +264,14 @@ public Tags(Tags tags) public Tags(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Tags(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -218,7 +282,7 @@ public static Tags FromRawUnchecked(IReadOnlyDictionary raw } [SetsRequiredMembers] - public Tags(List data) + public Tags(IReadOnlyList data) : this() { this.Data = data; @@ -237,14 +301,22 @@ public sealed record class Data : JsonModel { public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } public required string Name { - get { return JsonModel.GetNotNullClass(this.RawData, "name"); } - init { JsonModel.Set(this._rawData, "name", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("name"); + } + init { this._rawData.Set("name", value); } } /// @@ -261,14 +333,14 @@ public Data(Data data) public Data(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Data(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Notifications/NotificationRetrieveContentParams.cs b/src/Courier/Models/Notifications/NotificationRetrieveContentParams.cs index 1c48cb13..ce0b1230 100644 --- a/src/Courier/Models/Notifications/NotificationRetrieveContentParams.cs +++ b/src/Courier/Models/Notifications/NotificationRetrieveContentParams.cs @@ -27,8 +27,8 @@ public NotificationRetrieveContentParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -38,8 +38,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Pagerduty.cs b/src/Courier/Models/Pagerduty.cs index 6caa4184..12ea86db 100644 --- a/src/Courier/Models/Pagerduty.cs +++ b/src/Courier/Models/Pagerduty.cs @@ -12,26 +12,42 @@ public sealed record class Pagerduty : JsonModel { public string? EventAction { - get { return JsonModel.GetNullableClass(this.RawData, "event_action"); } - init { JsonModel.Set(this._rawData, "event_action", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("event_action"); + } + init { this._rawData.Set("event_action", value); } } public string? RoutingKey { - get { return JsonModel.GetNullableClass(this.RawData, "routing_key"); } - init { JsonModel.Set(this._rawData, "routing_key", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("routing_key"); + } + init { this._rawData.Set("routing_key", value); } } public string? Severity { - get { return JsonModel.GetNullableClass(this.RawData, "severity"); } - init { JsonModel.Set(this._rawData, "severity", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("severity"); + } + init { this._rawData.Set("severity", value); } } public string? Source { - get { return JsonModel.GetNullableClass(this.RawData, "source"); } - init { JsonModel.Set(this._rawData, "source", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("source"); + } + init { this._rawData.Set("source", value); } } /// @@ -50,14 +66,14 @@ public Pagerduty(Pagerduty pagerduty) public Pagerduty(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Pagerduty(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/PagerdutyRecipient.cs b/src/Courier/Models/PagerdutyRecipient.cs index b4190e76..c0e9ab37 100644 --- a/src/Courier/Models/PagerdutyRecipient.cs +++ b/src/Courier/Models/PagerdutyRecipient.cs @@ -15,8 +15,12 @@ public sealed record class PagerdutyRecipient : JsonModel { public required Pagerduty Pagerduty { - get { return JsonModel.GetNotNullClass(this.RawData, "pagerduty"); } - init { JsonModel.Set(this._rawData, "pagerduty", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("pagerduty"); + } + init { this._rawData.Set("pagerduty", value); } } /// @@ -32,14 +36,14 @@ public PagerdutyRecipient(PagerdutyRecipient pagerdutyRecipient) public PagerdutyRecipient(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] PagerdutyRecipient(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Paging.cs b/src/Courier/Models/Paging.cs index 0569f56a..18d45252 100644 --- a/src/Courier/Models/Paging.cs +++ b/src/Courier/Models/Paging.cs @@ -12,14 +12,22 @@ public sealed record class Paging : JsonModel { public required bool More { - get { return JsonModel.GetNotNullStruct(this.RawData, "more"); } - init { JsonModel.Set(this._rawData, "more", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("more"); + } + init { this._rawData.Set("more", value); } } public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawData, "cursor"); } - init { JsonModel.Set(this._rawData, "cursor", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("cursor"); + } + init { this._rawData.Set("cursor", value); } } /// @@ -36,14 +44,14 @@ public Paging(Paging paging) public Paging(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Paging(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Preference.cs b/src/Courier/Models/Preference.cs index 9d2348a4..f9801f1e 100644 --- a/src/Courier/Models/Preference.cs +++ b/src/Courier/Models/Preference.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -16,36 +17,54 @@ public required ApiEnum Status { get { - return JsonModel.GetNotNullClass>( - this.RawData, - "status" - ); + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("status"); } - init { JsonModel.Set(this._rawData, "status", value); } + init { this._rawData.Set("status", value); } } public IReadOnlyList? ChannelPreferences { get { - return JsonModel.GetNullableClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>( "channel_preferences" ); } - init { JsonModel.Set(this._rawData, "channel_preferences", value); } + init + { + this._rawData.Set?>( + "channel_preferences", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } public IReadOnlyList? Rules { - get { return JsonModel.GetNullableClass>(this.RawData, "rules"); } - init { JsonModel.Set(this._rawData, "rules", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("rules"); + } + init + { + this._rawData.Set?>( + "rules", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } public ApiEnum? Source { - get { return JsonModel.GetNullableClass>(this.RawData, "source"); } - init { JsonModel.Set(this._rawData, "source", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("source"); + } + init { this._rawData.Set("source", value); } } /// @@ -70,14 +89,14 @@ public Preference(Preference preference) public Preference(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Preference(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Profiles/Lists/ListDeleteParams.cs b/src/Courier/Models/Profiles/Lists/ListDeleteParams.cs index 556d3e59..86965205 100644 --- a/src/Courier/Models/Profiles/Lists/ListDeleteParams.cs +++ b/src/Courier/Models/Profiles/Lists/ListDeleteParams.cs @@ -28,8 +28,8 @@ public ListDeleteParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Profiles/Lists/ListDeleteResponse.cs b/src/Courier/Models/Profiles/Lists/ListDeleteResponse.cs index 9faabd22..2191a7ea 100644 --- a/src/Courier/Models/Profiles/Lists/ListDeleteResponse.cs +++ b/src/Courier/Models/Profiles/Lists/ListDeleteResponse.cs @@ -16,11 +16,12 @@ public sealed record class ListDeleteResponse : JsonModel { get { - return JsonModel.GetNotNullClass< + this._rawData.Freeze(); + return this._rawData.GetNotNullClass< ApiEnum - >(this.RawData, "status"); + >("status"); } - init { JsonModel.Set(this._rawData, "status", value); } + init { this._rawData.Set("status", value); } } /// @@ -36,14 +37,14 @@ public ListDeleteResponse(ListDeleteResponse listDeleteResponse) public ListDeleteResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ListDeleteResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Profiles/Lists/ListRetrieveParams.cs b/src/Courier/Models/Profiles/Lists/ListRetrieveParams.cs index 79b7a23a..1bb291e9 100644 --- a/src/Courier/Models/Profiles/Lists/ListRetrieveParams.cs +++ b/src/Courier/Models/Profiles/Lists/ListRetrieveParams.cs @@ -20,8 +20,12 @@ public sealed record class ListRetrieveParams : ParamsBase /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawQueryData, "cursor"); } - init { JsonModel.Set(this._rawQueryData, "cursor", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("cursor"); + } + init { this._rawQueryData.Set("cursor", value); } } public ListRetrieveParams() { } @@ -37,8 +41,8 @@ public ListRetrieveParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -48,8 +52,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Profiles/Lists/ListRetrieveResponse.cs b/src/Courier/Models/Profiles/Lists/ListRetrieveResponse.cs index 623c0df0..99c0c454 100644 --- a/src/Courier/Models/Profiles/Lists/ListRetrieveResponse.cs +++ b/src/Courier/Models/Profiles/Lists/ListRetrieveResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -12,8 +13,12 @@ public sealed record class ListRetrieveResponse : JsonModel { public required Paging Paging { - get { return JsonModel.GetNotNullClass(this.RawData, "paging"); } - init { JsonModel.Set(this._rawData, "paging", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("paging"); + } + init { this._rawData.Set("paging", value); } } /// @@ -21,8 +26,18 @@ public required Paging Paging /// public required IReadOnlyList Results { - get { return JsonModel.GetNotNullClass>(this.RawData, "results"); } - init { JsonModel.Set(this._rawData, "results", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("results"); + } + init + { + this._rawData.Set>( + "results", + ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -42,14 +57,14 @@ public ListRetrieveResponse(ListRetrieveResponse listRetrieveResponse) public ListRetrieveResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ListRetrieveResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -75,8 +90,12 @@ public sealed record class Result : JsonModel { public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } /// @@ -84,8 +103,12 @@ public required string ID /// public required string Created { - get { return JsonModel.GetNotNullClass(this.RawData, "created"); } - init { JsonModel.Set(this._rawData, "created", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("created"); + } + init { this._rawData.Set("created", value); } } /// @@ -93,8 +116,12 @@ public required string Created /// public required string Name { - get { return JsonModel.GetNotNullClass(this.RawData, "name"); } - init { JsonModel.Set(this._rawData, "name", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("name"); + } + init { this._rawData.Set("name", value); } } /// @@ -102,17 +129,22 @@ public required string Name /// public required string Updated { - get { return JsonModel.GetNotNullClass(this.RawData, "updated"); } - init { JsonModel.Set(this._rawData, "updated", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("updated"); + } + init { this._rawData.Set("updated", value); } } public RecipientPreferences? Preferences { get { - return JsonModel.GetNullableClass(this.RawData, "preferences"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass("preferences"); } - init { JsonModel.Set(this._rawData, "preferences", value); } + init { this._rawData.Set("preferences", value); } } /// @@ -132,14 +164,14 @@ public Result(Result result) public Result(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Result(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Profiles/Lists/ListSubscribeParams.cs b/src/Courier/Models/Profiles/Lists/ListSubscribeParams.cs index d017804a..481b9c8b 100644 --- a/src/Courier/Models/Profiles/Lists/ListSubscribeParams.cs +++ b/src/Courier/Models/Profiles/Lists/ListSubscribeParams.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Net.Http; using System.Text; @@ -15,7 +16,7 @@ namespace Courier.Models.Profiles.Lists; /// public sealed record class ListSubscribeParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -27,12 +28,18 @@ public required IReadOnlyList Lists { get { - return JsonModel.GetNotNullClass>( - this.RawBodyData, + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullStruct>( "lists" ); } - init { JsonModel.Set(this._rawBodyData, "lists", value); } + init + { + this._rawBodyData.Set>( + "lists", + ImmutableArray.ToImmutableArray(value) + ); + } } public ListSubscribeParams() { } @@ -42,7 +49,7 @@ public ListSubscribeParams(ListSubscribeParams listSubscribeParams) { this.UserID = listSubscribeParams.UserID; - this._rawBodyData = [.. listSubscribeParams._rawBodyData]; + this._rawBodyData = new(listSubscribeParams._rawBodyData); } public ListSubscribeParams( @@ -51,9 +58,9 @@ public ListSubscribeParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -64,9 +71,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -98,7 +105,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Profiles/Lists/ListSubscribeResponse.cs b/src/Courier/Models/Profiles/Lists/ListSubscribeResponse.cs index 2a8559a7..509e8c36 100644 --- a/src/Courier/Models/Profiles/Lists/ListSubscribeResponse.cs +++ b/src/Courier/Models/Profiles/Lists/ListSubscribeResponse.cs @@ -16,12 +16,12 @@ public required ApiEnum Status { get { - return JsonModel.GetNotNullClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>( "status" ); } - init { JsonModel.Set(this._rawData, "status", value); } + init { this._rawData.Set("status", value); } } /// @@ -37,14 +37,14 @@ public ListSubscribeResponse(ListSubscribeResponse listSubscribeResponse) public ListSubscribeResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ListSubscribeResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Profiles/ProfileCreateParams.cs b/src/Courier/Models/Profiles/ProfileCreateParams.cs index 31b650ce..aa0402ac 100644 --- a/src/Courier/Models/Profiles/ProfileCreateParams.cs +++ b/src/Courier/Models/Profiles/ProfileCreateParams.cs @@ -15,7 +15,7 @@ namespace Courier.Models.Profiles; /// public sealed record class ProfileCreateParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -27,12 +27,18 @@ public required IReadOnlyDictionary Profile { get { - return JsonModel.GetNotNullClass>( - this.RawBodyData, + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass>( "profile" ); } - init { JsonModel.Set(this._rawBodyData, "profile", value); } + init + { + this._rawBodyData.Set>( + "profile", + FrozenDictionary.ToFrozenDictionary(value) + ); + } } public ProfileCreateParams() { } @@ -42,7 +48,7 @@ public ProfileCreateParams(ProfileCreateParams profileCreateParams) { this.UserID = profileCreateParams.UserID; - this._rawBodyData = [.. profileCreateParams._rawBodyData]; + this._rawBodyData = new(profileCreateParams._rawBodyData); } public ProfileCreateParams( @@ -51,9 +57,9 @@ public ProfileCreateParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -64,9 +70,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -97,7 +103,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Profiles/ProfileCreateResponse.cs b/src/Courier/Models/Profiles/ProfileCreateResponse.cs index 0ad85f39..2793bb67 100644 --- a/src/Courier/Models/Profiles/ProfileCreateResponse.cs +++ b/src/Courier/Models/Profiles/ProfileCreateResponse.cs @@ -14,8 +14,12 @@ public sealed record class ProfileCreateResponse : JsonModel { public required ApiEnum Status { - get { return JsonModel.GetNotNullClass>(this.RawData, "status"); } - init { JsonModel.Set(this._rawData, "status", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("status"); + } + init { this._rawData.Set("status", value); } } /// @@ -31,14 +35,14 @@ public ProfileCreateResponse(ProfileCreateResponse profileCreateResponse) public ProfileCreateResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ProfileCreateResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Profiles/ProfileDeleteParams.cs b/src/Courier/Models/Profiles/ProfileDeleteParams.cs index f0cef4bd..73292e4d 100644 --- a/src/Courier/Models/Profiles/ProfileDeleteParams.cs +++ b/src/Courier/Models/Profiles/ProfileDeleteParams.cs @@ -28,8 +28,8 @@ public ProfileDeleteParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Profiles/ProfileReplaceParams.cs b/src/Courier/Models/Profiles/ProfileReplaceParams.cs index c86ff2c1..4aab1962 100644 --- a/src/Courier/Models/Profiles/ProfileReplaceParams.cs +++ b/src/Courier/Models/Profiles/ProfileReplaceParams.cs @@ -18,7 +18,7 @@ namespace Courier.Models.Profiles; /// public sealed record class ProfileReplaceParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -30,12 +30,18 @@ public required IReadOnlyDictionary Profile { get { - return JsonModel.GetNotNullClass>( - this.RawBodyData, + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass>( "profile" ); } - init { JsonModel.Set(this._rawBodyData, "profile", value); } + init + { + this._rawBodyData.Set>( + "profile", + FrozenDictionary.ToFrozenDictionary(value) + ); + } } public ProfileReplaceParams() { } @@ -45,7 +51,7 @@ public ProfileReplaceParams(ProfileReplaceParams profileReplaceParams) { this.UserID = profileReplaceParams.UserID; - this._rawBodyData = [.. profileReplaceParams._rawBodyData]; + this._rawBodyData = new(profileReplaceParams._rawBodyData); } public ProfileReplaceParams( @@ -54,9 +60,9 @@ public ProfileReplaceParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -67,9 +73,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -100,7 +106,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Profiles/ProfileReplaceResponse.cs b/src/Courier/Models/Profiles/ProfileReplaceResponse.cs index 1d3e7ea9..79c38ab7 100644 --- a/src/Courier/Models/Profiles/ProfileReplaceResponse.cs +++ b/src/Courier/Models/Profiles/ProfileReplaceResponse.cs @@ -16,12 +16,12 @@ public required ApiEnum Status { get { - return JsonModel.GetNotNullClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>( "status" ); } - init { JsonModel.Set(this._rawData, "status", value); } + init { this._rawData.Set("status", value); } } /// @@ -37,14 +37,14 @@ public ProfileReplaceResponse(ProfileReplaceResponse profileReplaceResponse) public ProfileReplaceResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ProfileReplaceResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Profiles/ProfileRetrieveParams.cs b/src/Courier/Models/Profiles/ProfileRetrieveParams.cs index 5e22da24..5c428891 100644 --- a/src/Courier/Models/Profiles/ProfileRetrieveParams.cs +++ b/src/Courier/Models/Profiles/ProfileRetrieveParams.cs @@ -28,8 +28,8 @@ public ProfileRetrieveParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Profiles/ProfileRetrieveResponse.cs b/src/Courier/Models/Profiles/ProfileRetrieveResponse.cs index 2e352181..1fbe1e4b 100644 --- a/src/Courier/Models/Profiles/ProfileRetrieveResponse.cs +++ b/src/Courier/Models/Profiles/ProfileRetrieveResponse.cs @@ -14,21 +14,26 @@ public required IReadOnlyDictionary Profile { get { - return JsonModel.GetNotNullClass>( - this.RawData, - "profile" + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("profile"); + } + init + { + this._rawData.Set>( + "profile", + FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "profile", value); } } public RecipientPreferences? Preferences { get { - return JsonModel.GetNullableClass(this.RawData, "preferences"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass("preferences"); } - init { JsonModel.Set(this._rawData, "preferences", value); } + init { this._rawData.Set("preferences", value); } } /// @@ -45,14 +50,14 @@ public ProfileRetrieveResponse(ProfileRetrieveResponse profileRetrieveResponse) public ProfileRetrieveResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ProfileRetrieveResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Profiles/ProfileUpdateParams.cs b/src/Courier/Models/Profiles/ProfileUpdateParams.cs index e3fa8fe3..1b2906a8 100644 --- a/src/Courier/Models/Profiles/ProfileUpdateParams.cs +++ b/src/Courier/Models/Profiles/ProfileUpdateParams.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Net.Http; using System.Text; @@ -15,7 +16,7 @@ namespace Courier.Models.Profiles; /// public sealed record class ProfileUpdateParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -28,8 +29,18 @@ public IReadOnlyDictionary RawBodyData /// public required IReadOnlyList Patch { - get { return JsonModel.GetNotNullClass>(this.RawBodyData, "patch"); } - init { JsonModel.Set(this._rawBodyData, "patch", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullStruct>("patch"); + } + init + { + this._rawBodyData.Set>( + "patch", + ImmutableArray.ToImmutableArray(value) + ); + } } public ProfileUpdateParams() { } @@ -39,7 +50,7 @@ public ProfileUpdateParams(ProfileUpdateParams profileUpdateParams) { this.UserID = profileUpdateParams.UserID; - this._rawBodyData = [.. profileUpdateParams._rawBodyData]; + this._rawBodyData = new(profileUpdateParams._rawBodyData); } public ProfileUpdateParams( @@ -48,9 +59,9 @@ public ProfileUpdateParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -61,9 +72,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -94,7 +105,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); @@ -118,8 +129,12 @@ public sealed record class Patch : JsonModel /// public required string Op { - get { return JsonModel.GetNotNullClass(this.RawData, "op"); } - init { JsonModel.Set(this._rawData, "op", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("op"); + } + init { this._rawData.Set("op", value); } } /// @@ -127,8 +142,12 @@ public required string Op /// public required string Path { - get { return JsonModel.GetNotNullClass(this.RawData, "path"); } - init { JsonModel.Set(this._rawData, "path", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("path"); + } + init { this._rawData.Set("path", value); } } /// @@ -136,8 +155,12 @@ public required string Path /// public required string Value { - get { return JsonModel.GetNotNullClass(this.RawData, "value"); } - init { JsonModel.Set(this._rawData, "value", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("value"); + } + init { this._rawData.Set("value", value); } } /// @@ -155,14 +178,14 @@ public Patch(Patch patch) public Patch(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Patch(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Profiles/SubscribeToListsRequestItem.cs b/src/Courier/Models/Profiles/SubscribeToListsRequestItem.cs index 2141df44..55bda81d 100644 --- a/src/Courier/Models/Profiles/SubscribeToListsRequestItem.cs +++ b/src/Courier/Models/Profiles/SubscribeToListsRequestItem.cs @@ -14,17 +14,22 @@ public sealed record class SubscribeToListsRequestItem : JsonModel { public required string ListID { - get { return JsonModel.GetNotNullClass(this.RawData, "listId"); } - init { JsonModel.Set(this._rawData, "listId", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("listId"); + } + init { this._rawData.Set("listId", value); } } public RecipientPreferences? Preferences { get { - return JsonModel.GetNullableClass(this.RawData, "preferences"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass("preferences"); } - init { JsonModel.Set(this._rawData, "preferences", value); } + init { this._rawData.Set("preferences", value); } } /// @@ -41,14 +46,14 @@ public SubscribeToListsRequestItem(SubscribeToListsRequestItem subscribeToListsR public SubscribeToListsRequestItem(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SubscribeToListsRequestItem(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/RecipientPreferences.cs b/src/Courier/Models/RecipientPreferences.cs index 511a8be3..8a0586d2 100644 --- a/src/Courier/Models/RecipientPreferences.cs +++ b/src/Courier/Models/RecipientPreferences.cs @@ -14,24 +14,36 @@ public IReadOnlyDictionary? Categories { get { - return JsonModel.GetNullableClass>( - this.RawData, - "categories" + this._rawData.Freeze(); + return this._rawData.GetNullableClass< + FrozenDictionary + >("categories"); + } + init + { + this._rawData.Set?>( + "categories", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "categories", value); } } public IReadOnlyDictionary? Notifications { get { - return JsonModel.GetNullableClass>( - this.RawData, - "notifications" + this._rawData.Freeze(); + return this._rawData.GetNullableClass< + FrozenDictionary + >("notifications"); + } + init + { + this._rawData.Set?>( + "notifications", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "notifications", value); } } /// @@ -60,14 +72,14 @@ public RecipientPreferences(RecipientPreferences recipientPreferences) public RecipientPreferences(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] RecipientPreferences(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Requests/RequestArchiveParams.cs b/src/Courier/Models/Requests/RequestArchiveParams.cs index 5fa4ac18..3390b22d 100644 --- a/src/Courier/Models/Requests/RequestArchiveParams.cs +++ b/src/Courier/Models/Requests/RequestArchiveParams.cs @@ -28,8 +28,8 @@ public RequestArchiveParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Rule.cs b/src/Courier/Models/Rule.cs index d6a4f92a..767bf7c7 100644 --- a/src/Courier/Models/Rule.cs +++ b/src/Courier/Models/Rule.cs @@ -12,14 +12,22 @@ public sealed record class Rule : JsonModel { public required string Until { - get { return JsonModel.GetNotNullClass(this.RawData, "until"); } - init { JsonModel.Set(this._rawData, "until", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("until"); + } + init { this._rawData.Set("until", value); } } public string? Start { - get { return JsonModel.GetNullableClass(this.RawData, "start"); } - init { JsonModel.Set(this._rawData, "start", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("start"); + } + init { this._rawData.Set("start", value); } } /// @@ -36,14 +44,14 @@ public Rule(Rule rule) public Rule(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Rule(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Send/SendMessageParams.cs b/src/Courier/Models/Send/SendMessageParams.cs index 3c3db23c..0af82bfc 100644 --- a/src/Courier/Models/Send/SendMessageParams.cs +++ b/src/Courier/Models/Send/SendMessageParams.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Net.Http; using System.Text; @@ -16,7 +17,7 @@ namespace Courier.Models.Send; /// public sealed record class SendMessageParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -28,8 +29,12 @@ public IReadOnlyDictionary RawBodyData /// public required Message Message { - get { return JsonModel.GetNotNullClass(this.RawBodyData, "message"); } - init { JsonModel.Set(this._rawBodyData, "message", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass("message"); + } + init { this._rawBodyData.Set("message", value); } } public SendMessageParams() { } @@ -37,7 +42,7 @@ public SendMessageParams() { } public SendMessageParams(SendMessageParams sendMessageParams) : base(sendMessageParams) { - this._rawBodyData = [.. sendMessageParams._rawBodyData]; + this._rawBodyData = new(sendMessageParams._rawBodyData); } public SendMessageParams( @@ -46,9 +51,9 @@ public SendMessageParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -59,9 +64,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -90,7 +95,7 @@ IReadOnlyDictionary rawBodyData internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); @@ -115,8 +120,12 @@ public sealed record class Message : JsonModel { public string? BrandID { - get { return JsonModel.GetNullableClass(this.RawData, "brand_id"); } - init { JsonModel.Set(this._rawData, "brand_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("brand_id"); + } + init { this._rawData.Set("brand_id", value); } } /// @@ -127,12 +136,18 @@ public IReadOnlyDictionary? Channels { get { - return JsonModel.GetNullableClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNullableClass>( "channels" ); } - init { JsonModel.Set(this._rawData, "channels", value); } + init + { + this._rawData.Set?>( + "channels", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); + } } /// @@ -140,7 +155,11 @@ public IReadOnlyDictionary? Channels /// public Content? Content { - get { return JsonModel.GetNullableClass(this.RawData, "content"); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("content"); + } init { if (value == null) @@ -148,68 +167,94 @@ public Content? Content return; } - JsonModel.Set(this._rawData, "content", value); + this._rawData.Set("content", value); } } public MessageContext? Context { - get { return JsonModel.GetNullableClass(this.RawData, "context"); } - init { JsonModel.Set(this._rawData, "context", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("context"); + } + init { this._rawData.Set("context", value); } } public IReadOnlyDictionary? Data { get { - return JsonModel.GetNullableClass>( - this.RawData, - "data" + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("data"); + } + init + { + this._rawData.Set?>( + "data", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "data", value); } } public Delay? Delay { - get { return JsonModel.GetNullableClass(this.RawData, "delay"); } - init { JsonModel.Set(this._rawData, "delay", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("delay"); + } + init { this._rawData.Set("delay", value); } } public Expiry? Expiry { - get { return JsonModel.GetNullableClass(this.RawData, "expiry"); } - init { JsonModel.Set(this._rawData, "expiry", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("expiry"); + } + init { this._rawData.Set("expiry", value); } } public MessageMetadata? Metadata { - get { return JsonModel.GetNullableClass(this.RawData, "metadata"); } - init { JsonModel.Set(this._rawData, "metadata", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("metadata"); + } + init { this._rawData.Set("metadata", value); } } public global::Courier.Models.Send.Preferences? Preferences { get { - return JsonModel.GetNullableClass( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNullableClass( "preferences" ); } - init { JsonModel.Set(this._rawData, "preferences", value); } + init { this._rawData.Set("preferences", value); } } public IReadOnlyDictionary? Providers { get { - return JsonModel.GetNullableClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNullableClass>( "providers" ); } - init { JsonModel.Set(this._rawData, "providers", value); } + init + { + this._rawData.Set?>( + "providers", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); + } } /// @@ -217,20 +262,32 @@ public IReadOnlyDictionary? Providers /// public Routing? Routing { - get { return JsonModel.GetNullableClass(this.RawData, "routing"); } - init { JsonModel.Set(this._rawData, "routing", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("routing"); + } + init { this._rawData.Set("routing", value); } } public string? Template { - get { return JsonModel.GetNullableClass(this.RawData, "template"); } - init { JsonModel.Set(this._rawData, "template", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("template"); + } + init { this._rawData.Set("template", value); } } public Timeout? Timeout { - get { return JsonModel.GetNullableClass(this.RawData, "timeout"); } - init { JsonModel.Set(this._rawData, "timeout", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("timeout"); + } + init { this._rawData.Set("timeout", value); } } /// @@ -238,8 +295,12 @@ public Timeout? Timeout /// public To? To { - get { return JsonModel.GetNullableClass(this.RawData, "to"); } - init { JsonModel.Set(this._rawData, "to", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("to"); + } + init { this._rawData.Set("to", value); } } /// @@ -280,14 +341,14 @@ public Message(Message message) public Message(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Message(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -313,8 +374,12 @@ public sealed record class ChannelsItem : JsonModel /// public string? BrandID { - get { return JsonModel.GetNullableClass(this.RawData, "brand_id"); } - init { JsonModel.Set(this._rawData, "brand_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("brand_id"); + } + init { this._rawData.Set("brand_id", value); } } /// @@ -322,14 +387,22 @@ public string? BrandID /// public string? If { - get { return JsonModel.GetNullableClass(this.RawData, "if"); } - init { JsonModel.Set(this._rawData, "if", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("if"); + } + init { this._rawData.Set("if", value); } } public Metadata? Metadata { - get { return JsonModel.GetNullableClass(this.RawData, "metadata"); } - init { JsonModel.Set(this._rawData, "metadata", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("metadata"); + } + init { this._rawData.Set("metadata", value); } } /// @@ -339,12 +412,18 @@ public IReadOnlyDictionary? Override { get { - return JsonModel.GetNullableClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNullableClass>( "override" ); } - init { JsonModel.Set(this._rawData, "override", value); } + init + { + this._rawData.Set?>( + "override", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); + } } /// @@ -352,8 +431,18 @@ public IReadOnlyDictionary? Override /// public IReadOnlyList? Providers { - get { return JsonModel.GetNullableClass>(this.RawData, "providers"); } - init { JsonModel.Set(this._rawData, "providers", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("providers"); + } + init + { + this._rawData.Set?>( + "providers", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -363,18 +452,20 @@ public ApiEnum? RoutingMethod { get { - return JsonModel.GetNullableClass>( - this.RawData, - "routing_method" - ); + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("routing_method"); } - init { JsonModel.Set(this._rawData, "routing_method", value); } + init { this._rawData.Set("routing_method", value); } } public Timeouts? Timeouts { - get { return JsonModel.GetNullableClass(this.RawData, "timeouts"); } - init { JsonModel.Set(this._rawData, "timeouts", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("timeouts"); + } + init { this._rawData.Set("timeouts", value); } } /// @@ -396,14 +487,14 @@ public ChannelsItem(ChannelsItem channelsItem) public ChannelsItem(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ChannelsItem(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -426,8 +517,12 @@ public sealed record class Metadata : JsonModel { public Utm? Utm { - get { return JsonModel.GetNullableClass(this.RawData, "utm"); } - init { JsonModel.Set(this._rawData, "utm", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("utm"); + } + init { this._rawData.Set("utm", value); } } /// @@ -443,14 +538,14 @@ public Metadata(Metadata metadata) public Metadata(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Metadata(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -520,14 +615,22 @@ public sealed record class Timeouts : JsonModel { public long? Channel { - get { return JsonModel.GetNullableStruct(this.RawData, "channel"); } - init { JsonModel.Set(this._rawData, "channel", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("channel"); + } + init { this._rawData.Set("channel", value); } } public long? Provider { - get { return JsonModel.GetNullableStruct(this.RawData, "provider"); } - init { JsonModel.Set(this._rawData, "provider", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("provider"); + } + init { this._rawData.Set("provider", value); } } /// @@ -544,14 +647,14 @@ public Timeouts(Timeouts timeouts) public Timeouts(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Timeouts(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -581,7 +684,13 @@ public record class Content : ModelBase public JsonElement Json { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } + get + { + return this._element ??= JsonSerializer.SerializeToElement( + this.Value, + ModelBase.SerializerOptions + ); + } } public Content(ElementalContentSugar value, JsonElement? element = null) @@ -809,8 +918,12 @@ public sealed record class Delay : JsonModel /// public long? Duration { - get { return JsonModel.GetNullableStruct(this.RawData, "duration"); } - init { JsonModel.Set(this._rawData, "duration", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("duration"); + } + init { this._rawData.Set("duration", value); } } /// @@ -819,8 +932,12 @@ public long? Duration /// public string? Timezone { - get { return JsonModel.GetNullableClass(this.RawData, "timezone"); } - init { JsonModel.Set(this._rawData, "timezone", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("timezone"); + } + init { this._rawData.Set("timezone", value); } } /// @@ -828,8 +945,12 @@ public string? Timezone /// public string? Until { - get { return JsonModel.GetNullableClass(this.RawData, "until"); } - init { JsonModel.Set(this._rawData, "until", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("until"); + } + init { this._rawData.Set("until", value); } } /// @@ -847,14 +968,14 @@ public Delay(Delay delay) public Delay(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Delay(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -880,8 +1001,12 @@ public sealed record class Expiry : JsonModel /// public required ExpiresIn ExpiresIn { - get { return JsonModel.GetNotNullClass(this.RawData, "expires_in"); } - init { JsonModel.Set(this._rawData, "expires_in", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("expires_in"); + } + init { this._rawData.Set("expires_in", value); } } /// @@ -889,8 +1014,12 @@ public required ExpiresIn ExpiresIn /// public string? ExpiresAt { - get { return JsonModel.GetNullableClass(this.RawData, "expires_at"); } - init { JsonModel.Set(this._rawData, "expires_at", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("expires_at"); + } + init { this._rawData.Set("expires_at", value); } } /// @@ -907,14 +1036,14 @@ public Expiry(Expiry expiry) public Expiry(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Expiry(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -951,7 +1080,13 @@ public record class ExpiresIn : ModelBase public JsonElement Json { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } + get + { + return this._element ??= JsonSerializer.SerializeToElement( + this.Value, + ModelBase.SerializerOptions + ); + } } public ExpiresIn(string value, JsonElement? element = null) @@ -1168,26 +1303,48 @@ public sealed record class MessageMetadata : JsonModel { public string? Event { - get { return JsonModel.GetNullableClass(this.RawData, "event"); } - init { JsonModel.Set(this._rawData, "event", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("event"); + } + init { this._rawData.Set("event", value); } } public IReadOnlyList? Tags { - get { return JsonModel.GetNullableClass>(this.RawData, "tags"); } - init { JsonModel.Set(this._rawData, "tags", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("tags"); + } + init + { + this._rawData.Set?>( + "tags", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } public string? TraceID { - get { return JsonModel.GetNullableClass(this.RawData, "trace_id"); } - init { JsonModel.Set(this._rawData, "trace_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("trace_id"); + } + init { this._rawData.Set("trace_id", value); } } public Utm? Utm { - get { return JsonModel.GetNullableClass(this.RawData, "utm"); } - init { JsonModel.Set(this._rawData, "utm", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("utm"); + } + init { this._rawData.Set("utm", value); } } /// @@ -1206,14 +1363,14 @@ public MessageMetadata(MessageMetadata messageMetadata) public MessageMetadata(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] MessageMetadata(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -1244,8 +1401,12 @@ public sealed record class Preferences : JsonModel /// public required string SubscriptionTopicID { - get { return JsonModel.GetNotNullClass(this.RawData, "subscription_topic_id"); } - init { JsonModel.Set(this._rawData, "subscription_topic_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("subscription_topic_id"); + } + init { this._rawData.Set("subscription_topic_id", value); } } /// @@ -1261,14 +1422,14 @@ public Preferences(global::Courier.Models.Send.Preferences preferences) public Preferences(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Preferences(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -1304,14 +1465,22 @@ public sealed record class ProvidersItem : JsonModel /// public string? If { - get { return JsonModel.GetNullableClass(this.RawData, "if"); } - init { JsonModel.Set(this._rawData, "if", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("if"); + } + init { this._rawData.Set("if", value); } } public ProvidersItemMetadata? Metadata { - get { return JsonModel.GetNullableClass(this.RawData, "metadata"); } - init { JsonModel.Set(this._rawData, "metadata", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("metadata"); + } + init { this._rawData.Set("metadata", value); } } /// @@ -1321,18 +1490,28 @@ public IReadOnlyDictionary? Override { get { - return JsonModel.GetNullableClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNullableClass>( "override" ); } - init { JsonModel.Set(this._rawData, "override", value); } + init + { + this._rawData.Set?>( + "override", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); + } } public long? Timeouts { - get { return JsonModel.GetNullableStruct(this.RawData, "timeouts"); } - init { JsonModel.Set(this._rawData, "timeouts", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("timeouts"); + } + init { this._rawData.Set("timeouts", value); } } /// @@ -1351,14 +1530,14 @@ public ProvidersItem(ProvidersItem providersItem) public ProvidersItem(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ProvidersItem(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -1381,8 +1560,12 @@ public sealed record class ProvidersItemMetadata : JsonModel { public Utm? Utm { - get { return JsonModel.GetNullableClass(this.RawData, "utm"); } - init { JsonModel.Set(this._rawData, "utm", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("utm"); + } + init { this._rawData.Set("utm", value); } } /// @@ -1398,14 +1581,14 @@ public ProvidersItemMetadata(ProvidersItemMetadata providersItemMetadata) public ProvidersItemMetadata(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] ProvidersItemMetadata(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -1439,21 +1622,30 @@ public required IReadOnlyList Channels { get { - return JsonModel.GetNotNullClass>(this.RawData, "channels"); + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>( + "channels" + ); + } + init + { + this._rawData.Set>( + "channels", + ImmutableArray.ToImmutableArray(value) + ); } - init { JsonModel.Set(this._rawData, "channels", value); } } public required ApiEnum Method { get { - return JsonModel.GetNotNullClass>( - this.RawData, - "method" - ); + this._rawData.Freeze(); + return this._rawData.GetNotNullClass< + ApiEnum + >("method"); } - init { JsonModel.Set(this._rawData, "method", value); } + init { this._rawData.Set("method", value); } } /// @@ -1473,14 +1665,14 @@ public Routing(Routing routing) public Routing(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Routing(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -1549,39 +1741,62 @@ public IReadOnlyDictionary? Channel { get { - return JsonModel.GetNullableClass>(this.RawData, "channel"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("channel"); + } + init + { + this._rawData.Set?>( + "channel", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); } - init { JsonModel.Set(this._rawData, "channel", value); } } public ApiEnum? Criteria { get { - return JsonModel.GetNullableClass>(this.RawData, "criteria"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("criteria"); } - init { JsonModel.Set(this._rawData, "criteria", value); } + init { this._rawData.Set("criteria", value); } } public long? Escalation { - get { return JsonModel.GetNullableStruct(this.RawData, "escalation"); } - init { JsonModel.Set(this._rawData, "escalation", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("escalation"); + } + init { this._rawData.Set("escalation", value); } } public long? Message { - get { return JsonModel.GetNullableStruct(this.RawData, "message"); } - init { JsonModel.Set(this._rawData, "message", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("message"); + } + init { this._rawData.Set("message", value); } } public IReadOnlyDictionary? Provider { get { - return JsonModel.GetNullableClass>(this.RawData, "provider"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("provider"); + } + init + { + this._rawData.Set?>( + "provider", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); } - init { JsonModel.Set(this._rawData, "provider", value); } } /// @@ -1601,14 +1816,14 @@ public Timeout(Timeout timeout) public Timeout(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Timeout(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -1684,7 +1899,13 @@ public record class To : ModelBase public JsonElement Json { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } + get + { + return this._element ??= JsonSerializer.SerializeToElement( + this.Value, + ModelBase.SerializerOptions + ); + } } public string? ListID diff --git a/src/Courier/Models/Send/SendMessageResponse.cs b/src/Courier/Models/Send/SendMessageResponse.cs index a4645a23..d5acf25b 100644 --- a/src/Courier/Models/Send/SendMessageResponse.cs +++ b/src/Courier/Models/Send/SendMessageResponse.cs @@ -18,8 +18,12 @@ public sealed record class SendMessageResponse : JsonModel /// public required string RequestID { - get { return JsonModel.GetNotNullClass(this.RawData, "requestId"); } - init { JsonModel.Set(this._rawData, "requestId", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("requestId"); + } + init { this._rawData.Set("requestId", value); } } /// @@ -35,14 +39,14 @@ public SendMessageResponse(SendMessageResponse sendMessageResponse) public SendMessageResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SendMessageResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/SendDirectMessage.cs b/src/Courier/Models/SendDirectMessage.cs index 47225128..8eea09fc 100644 --- a/src/Courier/Models/SendDirectMessage.cs +++ b/src/Courier/Models/SendDirectMessage.cs @@ -12,8 +12,12 @@ public sealed record class SendDirectMessage : JsonModel { public required string UserID { - get { return JsonModel.GetNotNullClass(this.RawData, "user_id"); } - init { JsonModel.Set(this._rawData, "user_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("user_id"); + } + init { this._rawData.Set("user_id", value); } } /// @@ -29,14 +33,14 @@ public SendDirectMessage(SendDirectMessage sendDirectMessage) public SendDirectMessage(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SendDirectMessage(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/SendToChannel.cs b/src/Courier/Models/SendToChannel.cs index 7e4ab227..025847c9 100644 --- a/src/Courier/Models/SendToChannel.cs +++ b/src/Courier/Models/SendToChannel.cs @@ -12,8 +12,12 @@ public sealed record class SendToChannel : JsonModel { public required string ChannelID { - get { return JsonModel.GetNotNullClass(this.RawData, "channel_id"); } - init { JsonModel.Set(this._rawData, "channel_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("channel_id"); + } + init { this._rawData.Set("channel_id", value); } } /// @@ -29,14 +33,14 @@ public SendToChannel(SendToChannel sendToChannel) public SendToChannel(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SendToChannel(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/SendToMsTeamsChannelID.cs b/src/Courier/Models/SendToMsTeamsChannelID.cs index b43c6ebc..36ad47f3 100644 --- a/src/Courier/Models/SendToMsTeamsChannelID.cs +++ b/src/Courier/Models/SendToMsTeamsChannelID.cs @@ -12,20 +12,32 @@ public sealed record class SendToMsTeamsChannelID : JsonModel { public required string ChannelID { - get { return JsonModel.GetNotNullClass(this.RawData, "channel_id"); } - init { JsonModel.Set(this._rawData, "channel_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("channel_id"); + } + init { this._rawData.Set("channel_id", value); } } public required string ServiceUrl { - get { return JsonModel.GetNotNullClass(this.RawData, "service_url"); } - init { JsonModel.Set(this._rawData, "service_url", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("service_url"); + } + init { this._rawData.Set("service_url", value); } } public required string TenantID { - get { return JsonModel.GetNotNullClass(this.RawData, "tenant_id"); } - init { JsonModel.Set(this._rawData, "tenant_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("tenant_id"); + } + init { this._rawData.Set("tenant_id", value); } } /// @@ -43,14 +55,14 @@ public SendToMsTeamsChannelID(SendToMsTeamsChannelID sendToMsTeamsChannelID) public SendToMsTeamsChannelID(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SendToMsTeamsChannelID(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/SendToMsTeamsChannelName.cs b/src/Courier/Models/SendToMsTeamsChannelName.cs index 94e0e167..555c2ff6 100644 --- a/src/Courier/Models/SendToMsTeamsChannelName.cs +++ b/src/Courier/Models/SendToMsTeamsChannelName.cs @@ -14,26 +14,42 @@ public sealed record class SendToMsTeamsChannelName : JsonModel { public required string ChannelName { - get { return JsonModel.GetNotNullClass(this.RawData, "channel_name"); } - init { JsonModel.Set(this._rawData, "channel_name", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("channel_name"); + } + init { this._rawData.Set("channel_name", value); } } public required string ServiceUrl { - get { return JsonModel.GetNotNullClass(this.RawData, "service_url"); } - init { JsonModel.Set(this._rawData, "service_url", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("service_url"); + } + init { this._rawData.Set("service_url", value); } } public required string TeamID { - get { return JsonModel.GetNotNullClass(this.RawData, "team_id"); } - init { JsonModel.Set(this._rawData, "team_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("team_id"); + } + init { this._rawData.Set("team_id", value); } } public required string TenantID { - get { return JsonModel.GetNotNullClass(this.RawData, "tenant_id"); } - init { JsonModel.Set(this._rawData, "tenant_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("tenant_id"); + } + init { this._rawData.Set("tenant_id", value); } } /// @@ -52,14 +68,14 @@ public SendToMsTeamsChannelName(SendToMsTeamsChannelName sendToMsTeamsChannelNam public SendToMsTeamsChannelName(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SendToMsTeamsChannelName(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/SendToMsTeamsConversationID.cs b/src/Courier/Models/SendToMsTeamsConversationID.cs index 09afe754..f91a154f 100644 --- a/src/Courier/Models/SendToMsTeamsConversationID.cs +++ b/src/Courier/Models/SendToMsTeamsConversationID.cs @@ -14,20 +14,32 @@ public sealed record class SendToMsTeamsConversationID : JsonModel { public required string ConversationID { - get { return JsonModel.GetNotNullClass(this.RawData, "conversation_id"); } - init { JsonModel.Set(this._rawData, "conversation_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("conversation_id"); + } + init { this._rawData.Set("conversation_id", value); } } public required string ServiceUrl { - get { return JsonModel.GetNotNullClass(this.RawData, "service_url"); } - init { JsonModel.Set(this._rawData, "service_url", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("service_url"); + } + init { this._rawData.Set("service_url", value); } } public required string TenantID { - get { return JsonModel.GetNotNullClass(this.RawData, "tenant_id"); } - init { JsonModel.Set(this._rawData, "tenant_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("tenant_id"); + } + init { this._rawData.Set("tenant_id", value); } } /// @@ -45,14 +57,14 @@ public SendToMsTeamsConversationID(SendToMsTeamsConversationID sendToMsTeamsConv public SendToMsTeamsConversationID(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SendToMsTeamsConversationID(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/SendToMsTeamsEmail.cs b/src/Courier/Models/SendToMsTeamsEmail.cs index 39d897aa..4b125b5d 100644 --- a/src/Courier/Models/SendToMsTeamsEmail.cs +++ b/src/Courier/Models/SendToMsTeamsEmail.cs @@ -12,20 +12,32 @@ public sealed record class SendToMsTeamsEmail : JsonModel { public required string Email { - get { return JsonModel.GetNotNullClass(this.RawData, "email"); } - init { JsonModel.Set(this._rawData, "email", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("email"); + } + init { this._rawData.Set("email", value); } } public required string ServiceUrl { - get { return JsonModel.GetNotNullClass(this.RawData, "service_url"); } - init { JsonModel.Set(this._rawData, "service_url", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("service_url"); + } + init { this._rawData.Set("service_url", value); } } public required string TenantID { - get { return JsonModel.GetNotNullClass(this.RawData, "tenant_id"); } - init { JsonModel.Set(this._rawData, "tenant_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("tenant_id"); + } + init { this._rawData.Set("tenant_id", value); } } /// @@ -43,14 +55,14 @@ public SendToMsTeamsEmail(SendToMsTeamsEmail sendToMsTeamsEmail) public SendToMsTeamsEmail(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SendToMsTeamsEmail(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/SendToMsTeamsUserID.cs b/src/Courier/Models/SendToMsTeamsUserID.cs index 222e3f78..7aac983c 100644 --- a/src/Courier/Models/SendToMsTeamsUserID.cs +++ b/src/Courier/Models/SendToMsTeamsUserID.cs @@ -12,20 +12,32 @@ public sealed record class SendToMsTeamsUserID : JsonModel { public required string ServiceUrl { - get { return JsonModel.GetNotNullClass(this.RawData, "service_url"); } - init { JsonModel.Set(this._rawData, "service_url", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("service_url"); + } + init { this._rawData.Set("service_url", value); } } public required string TenantID { - get { return JsonModel.GetNotNullClass(this.RawData, "tenant_id"); } - init { JsonModel.Set(this._rawData, "tenant_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("tenant_id"); + } + init { this._rawData.Set("tenant_id", value); } } public required string UserID { - get { return JsonModel.GetNotNullClass(this.RawData, "user_id"); } - init { JsonModel.Set(this._rawData, "user_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("user_id"); + } + init { this._rawData.Set("user_id", value); } } /// @@ -43,14 +55,14 @@ public SendToMsTeamsUserID(SendToMsTeamsUserID sendToMsTeamsUserID) public SendToMsTeamsUserID(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SendToMsTeamsUserID(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/SendToSlackChannel.cs b/src/Courier/Models/SendToSlackChannel.cs index 97fc3067..4637686f 100644 --- a/src/Courier/Models/SendToSlackChannel.cs +++ b/src/Courier/Models/SendToSlackChannel.cs @@ -12,14 +12,22 @@ public sealed record class SendToSlackChannel : JsonModel { public required string AccessToken { - get { return JsonModel.GetNotNullClass(this.RawData, "access_token"); } - init { JsonModel.Set(this._rawData, "access_token", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("access_token"); + } + init { this._rawData.Set("access_token", value); } } public required string Channel { - get { return JsonModel.GetNotNullClass(this.RawData, "channel"); } - init { JsonModel.Set(this._rawData, "channel", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("channel"); + } + init { this._rawData.Set("channel", value); } } /// @@ -36,14 +44,14 @@ public SendToSlackChannel(SendToSlackChannel sendToSlackChannel) public SendToSlackChannel(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SendToSlackChannel(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/SendToSlackEmail.cs b/src/Courier/Models/SendToSlackEmail.cs index 1bea6c98..9751a6df 100644 --- a/src/Courier/Models/SendToSlackEmail.cs +++ b/src/Courier/Models/SendToSlackEmail.cs @@ -12,14 +12,22 @@ public sealed record class SendToSlackEmail : JsonModel { public required string AccessToken { - get { return JsonModel.GetNotNullClass(this.RawData, "access_token"); } - init { JsonModel.Set(this._rawData, "access_token", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("access_token"); + } + init { this._rawData.Set("access_token", value); } } public required string Email { - get { return JsonModel.GetNotNullClass(this.RawData, "email"); } - init { JsonModel.Set(this._rawData, "email", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("email"); + } + init { this._rawData.Set("email", value); } } /// @@ -36,14 +44,14 @@ public SendToSlackEmail(SendToSlackEmail sendToSlackEmail) public SendToSlackEmail(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SendToSlackEmail(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/SendToSlackUserID.cs b/src/Courier/Models/SendToSlackUserID.cs index c02f928e..26a644b1 100644 --- a/src/Courier/Models/SendToSlackUserID.cs +++ b/src/Courier/Models/SendToSlackUserID.cs @@ -12,14 +12,22 @@ public sealed record class SendToSlackUserID : JsonModel { public required string AccessToken { - get { return JsonModel.GetNotNullClass(this.RawData, "access_token"); } - init { JsonModel.Set(this._rawData, "access_token", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("access_token"); + } + init { this._rawData.Set("access_token", value); } } public required string UserID { - get { return JsonModel.GetNotNullClass(this.RawData, "user_id"); } - init { JsonModel.Set(this._rawData, "user_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("user_id"); + } + init { this._rawData.Set("user_id", value); } } /// @@ -36,14 +44,14 @@ public SendToSlackUserID(SendToSlackUserID sendToSlackUserID) public SendToSlackUserID(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SendToSlackUserID(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Slack.cs b/src/Courier/Models/Slack.cs index 7667dfeb..04253830 100644 --- a/src/Courier/Models/Slack.cs +++ b/src/Courier/Models/Slack.cs @@ -16,7 +16,13 @@ public record class Slack : ModelBase public JsonElement Json { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } + get + { + return this._element ??= JsonSerializer.SerializeToElement( + this.Value, + ModelBase.SerializerOptions + ); + } } public string AccessToken diff --git a/src/Courier/Models/SlackBaseProperties.cs b/src/Courier/Models/SlackBaseProperties.cs index 3520356f..967ac179 100644 --- a/src/Courier/Models/SlackBaseProperties.cs +++ b/src/Courier/Models/SlackBaseProperties.cs @@ -12,8 +12,12 @@ public sealed record class SlackBaseProperties : JsonModel { public required string AccessToken { - get { return JsonModel.GetNotNullClass(this.RawData, "access_token"); } - init { JsonModel.Set(this._rawData, "access_token", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("access_token"); + } + init { this._rawData.Set("access_token", value); } } /// @@ -29,14 +33,14 @@ public SlackBaseProperties(SlackBaseProperties slackBaseProperties) public SlackBaseProperties(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SlackBaseProperties(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/SlackRecipient.cs b/src/Courier/Models/SlackRecipient.cs index 08244e82..d6607d55 100644 --- a/src/Courier/Models/SlackRecipient.cs +++ b/src/Courier/Models/SlackRecipient.cs @@ -15,8 +15,12 @@ public sealed record class SlackRecipient : JsonModel { public required Slack Slack { - get { return JsonModel.GetNotNullClass(this.RawData, "slack"); } - init { JsonModel.Set(this._rawData, "slack", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("slack"); + } + init { this._rawData.Set("slack", value); } } /// @@ -32,14 +36,14 @@ public SlackRecipient(SlackRecipient slackRecipient) public SlackRecipient(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SlackRecipient(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Tenants/BaseTemplateTenantAssociation.cs b/src/Courier/Models/Tenants/BaseTemplateTenantAssociation.cs index 4f1bf230..5383512f 100644 --- a/src/Courier/Models/Tenants/BaseTemplateTenantAssociation.cs +++ b/src/Courier/Models/Tenants/BaseTemplateTenantAssociation.cs @@ -17,8 +17,12 @@ public sealed record class BaseTemplateTenantAssociation : JsonModel /// public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } /// @@ -26,8 +30,12 @@ public required string ID /// public required string CreatedAt { - get { return JsonModel.GetNotNullClass(this.RawData, "created_at"); } - init { JsonModel.Set(this._rawData, "created_at", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("created_at"); + } + init { this._rawData.Set("created_at", value); } } /// @@ -35,8 +43,12 @@ public required string CreatedAt /// public required string PublishedAt { - get { return JsonModel.GetNotNullClass(this.RawData, "published_at"); } - init { JsonModel.Set(this._rawData, "published_at", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("published_at"); + } + init { this._rawData.Set("published_at", value); } } /// @@ -44,8 +56,12 @@ public required string PublishedAt /// public required string UpdatedAt { - get { return JsonModel.GetNotNullClass(this.RawData, "updated_at"); } - init { JsonModel.Set(this._rawData, "updated_at", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("updated_at"); + } + init { this._rawData.Set("updated_at", value); } } /// @@ -53,8 +69,12 @@ public required string UpdatedAt /// public required string Version { - get { return JsonModel.GetNotNullClass(this.RawData, "version"); } - init { JsonModel.Set(this._rawData, "version", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("version"); + } + init { this._rawData.Set("version", value); } } /// @@ -76,14 +96,14 @@ BaseTemplateTenantAssociation baseTemplateTenantAssociation public BaseTemplateTenantAssociation(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] BaseTemplateTenantAssociation(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Tenants/DefaultPreferences.cs b/src/Courier/Models/Tenants/DefaultPreferences.cs index da19a559..b38e40b4 100644 --- a/src/Courier/Models/Tenants/DefaultPreferences.cs +++ b/src/Courier/Models/Tenants/DefaultPreferences.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -12,8 +13,18 @@ public sealed record class DefaultPreferences : JsonModel { public IReadOnlyList? Items { - get { return JsonModel.GetNullableClass>(this.RawData, "items"); } - init { JsonModel.Set(this._rawData, "items", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("items"); + } + init + { + this._rawData.Set?>( + "items", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -32,14 +43,14 @@ public DefaultPreferences(DefaultPreferences defaultPreferences) public DefaultPreferences(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] DefaultPreferences(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -64,8 +75,12 @@ public sealed record class Item : JsonModel { public required ApiEnum Status { - get { return JsonModel.GetNotNullClass>(this.RawData, "status"); } - init { JsonModel.Set(this._rawData, "status", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("status"); + } + init { this._rawData.Set("status", value); } } /// @@ -75,12 +90,18 @@ public IReadOnlyList>? CustomRouting { get { - return JsonModel.GetNullableClass>>( - this.RawData, - "custom_routing" + this._rawData.Freeze(); + return this._rawData.GetNullableStruct< + ImmutableArray> + >("custom_routing"); + } + init + { + this._rawData.Set>?>( + "custom_routing", + value == null ? null : ImmutableArray.ToImmutableArray(value) ); } - init { JsonModel.Set(this._rawData, "custom_routing", value); } } /// @@ -89,8 +110,12 @@ public IReadOnlyList>? CustomRouting /// public bool? HasCustomRouting { - get { return JsonModel.GetNullableStruct(this.RawData, "has_custom_routing"); } - init { JsonModel.Set(this._rawData, "has_custom_routing", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("has_custom_routing"); + } + init { this._rawData.Set("has_custom_routing", value); } } /// @@ -98,8 +123,12 @@ public bool? HasCustomRouting /// public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } public static implicit operator SubscriptionTopicNew(Item item) => @@ -129,14 +158,14 @@ public Item(Item item) public Item(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Item(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -167,8 +196,12 @@ public sealed record class IntersectionMember1 : JsonModel /// public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } /// @@ -186,14 +219,14 @@ public IntersectionMember1( public IntersectionMember1(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] IntersectionMember1(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Tenants/Preferences/Items/ItemDeleteParams.cs b/src/Courier/Models/Tenants/Preferences/Items/ItemDeleteParams.cs index 6e2a89a3..aa0d3661 100644 --- a/src/Courier/Models/Tenants/Preferences/Items/ItemDeleteParams.cs +++ b/src/Courier/Models/Tenants/Preferences/Items/ItemDeleteParams.cs @@ -31,8 +31,8 @@ public ItemDeleteParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -42,8 +42,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Tenants/Preferences/Items/ItemUpdateParams.cs b/src/Courier/Models/Tenants/Preferences/Items/ItemUpdateParams.cs index 213a3caf..38ef5f7c 100644 --- a/src/Courier/Models/Tenants/Preferences/Items/ItemUpdateParams.cs +++ b/src/Courier/Models/Tenants/Preferences/Items/ItemUpdateParams.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Net.Http; using System.Text; @@ -16,7 +17,7 @@ namespace Courier.Models.Tenants.Preferences.Items; /// public sealed record class ItemUpdateParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -30,11 +31,12 @@ public IReadOnlyDictionary RawBodyData { get { - return JsonModel.GetNotNullClass< + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass< ApiEnum - >(this.RawBodyData, "status"); + >("status"); } - init { JsonModel.Set(this._rawBodyData, "status", value); } + init { this._rawBodyData.Set("status", value); } } /// @@ -44,12 +46,18 @@ public IReadOnlyList>? CustomRouting { get { - return JsonModel.GetNullableClass>>( - this.RawBodyData, - "custom_routing" + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableStruct< + ImmutableArray> + >("custom_routing"); + } + init + { + this._rawBodyData.Set>?>( + "custom_routing", + value == null ? null : ImmutableArray.ToImmutableArray(value) ); } - init { JsonModel.Set(this._rawBodyData, "custom_routing", value); } } /// @@ -58,8 +66,12 @@ public IReadOnlyList>? CustomRouting /// public bool? HasCustomRouting { - get { return JsonModel.GetNullableStruct(this.RawBodyData, "has_custom_routing"); } - init { JsonModel.Set(this._rawBodyData, "has_custom_routing", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableStruct("has_custom_routing"); + } + init { this._rawBodyData.Set("has_custom_routing", value); } } public ItemUpdateParams() { } @@ -70,7 +82,7 @@ public ItemUpdateParams(ItemUpdateParams itemUpdateParams) this.TenantID = itemUpdateParams.TenantID; this.TopicID = itemUpdateParams.TopicID; - this._rawBodyData = [.. itemUpdateParams._rawBodyData]; + this._rawBodyData = new(itemUpdateParams._rawBodyData); } public ItemUpdateParams( @@ -79,9 +91,9 @@ public ItemUpdateParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -92,9 +104,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -130,7 +142,7 @@ IReadOnlyDictionary rawBodyData internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Tenants/SubscriptionTopicNew.cs b/src/Courier/Models/Tenants/SubscriptionTopicNew.cs index d56fe1e1..2c8863b8 100644 --- a/src/Courier/Models/Tenants/SubscriptionTopicNew.cs +++ b/src/Courier/Models/Tenants/SubscriptionTopicNew.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -14,8 +15,12 @@ public sealed record class SubscriptionTopicNew : JsonModel { public required ApiEnum Status { - get { return JsonModel.GetNotNullClass>(this.RawData, "status"); } - init { JsonModel.Set(this._rawData, "status", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("status"); + } + init { this._rawData.Set("status", value); } } /// @@ -25,12 +30,18 @@ public IReadOnlyList>? CustomRouting { get { - return JsonModel.GetNullableClass>>( - this.RawData, - "custom_routing" + this._rawData.Freeze(); + return this._rawData.GetNullableStruct< + ImmutableArray> + >("custom_routing"); + } + init + { + this._rawData.Set>?>( + "custom_routing", + value == null ? null : ImmutableArray.ToImmutableArray(value) ); } - init { JsonModel.Set(this._rawData, "custom_routing", value); } } /// @@ -39,8 +50,12 @@ public IReadOnlyList>? CustomRouting /// public bool? HasCustomRouting { - get { return JsonModel.GetNullableStruct(this.RawData, "has_custom_routing"); } - init { JsonModel.Set(this._rawData, "has_custom_routing", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("has_custom_routing"); + } + init { this._rawData.Set("has_custom_routing", value); } } /// @@ -61,14 +76,14 @@ public SubscriptionTopicNew(SubscriptionTopicNew subscriptionTopicNew) public SubscriptionTopicNew(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] SubscriptionTopicNew(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Tenants/Templates/TemplateListParams.cs b/src/Courier/Models/Tenants/Templates/TemplateListParams.cs index ab8de8f5..ef764a8d 100644 --- a/src/Courier/Models/Tenants/Templates/TemplateListParams.cs +++ b/src/Courier/Models/Tenants/Templates/TemplateListParams.cs @@ -20,8 +20,12 @@ public sealed record class TemplateListParams : ParamsBase /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawQueryData, "cursor"); } - init { JsonModel.Set(this._rawQueryData, "cursor", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("cursor"); + } + init { this._rawQueryData.Set("cursor", value); } } /// @@ -29,8 +33,12 @@ public string? Cursor /// public long? Limit { - get { return JsonModel.GetNullableStruct(this.RawQueryData, "limit"); } - init { JsonModel.Set(this._rawQueryData, "limit", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableStruct("limit"); + } + init { this._rawQueryData.Set("limit", value); } } public TemplateListParams() { } @@ -46,8 +54,8 @@ public TemplateListParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -57,8 +65,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Tenants/Templates/TemplateListResponse.cs b/src/Courier/Models/Tenants/Templates/TemplateListResponse.cs index df2fc3eb..32ee4779 100644 --- a/src/Courier/Models/Tenants/Templates/TemplateListResponse.cs +++ b/src/Courier/Models/Tenants/Templates/TemplateListResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -17,8 +18,12 @@ public sealed record class TemplateListResponse : JsonModel /// public required bool HasMore { - get { return JsonModel.GetNotNullStruct(this.RawData, "has_more"); } - init { JsonModel.Set(this._rawData, "has_more", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("has_more"); + } + init { this._rawData.Set("has_more", value); } } /// @@ -28,11 +33,12 @@ public required bool HasMore { get { - return JsonModel.GetNotNullClass< + this._rawData.Freeze(); + return this._rawData.GetNotNullClass< ApiEnum - >(this.RawData, "type"); + >("type"); } - init { JsonModel.Set(this._rawData, "type", value); } + init { this._rawData.Set("type", value); } } /// @@ -40,8 +46,12 @@ public required bool HasMore /// public required string Url { - get { return JsonModel.GetNotNullClass(this.RawData, "url"); } - init { JsonModel.Set(this._rawData, "url", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("url"); + } + init { this._rawData.Set("url", value); } } /// @@ -50,20 +60,30 @@ public required string Url /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawData, "cursor"); } - init { JsonModel.Set(this._rawData, "cursor", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("cursor"); + } + init { this._rawData.Set("cursor", value); } } public IReadOnlyList? Items { get { - return JsonModel.GetNullableClass>( - this.RawData, - "items" + this._rawData.Freeze(); + return this._rawData.GetNullableStruct< + ImmutableArray + >("items"); + } + init + { + this._rawData.Set?>( + "items", + value == null ? null : ImmutableArray.ToImmutableArray(value) ); } - init { JsonModel.Set(this._rawData, "items", value); } } /// @@ -72,8 +92,12 @@ public string? Cursor /// public string? NextUrl { - get { return JsonModel.GetNullableClass(this.RawData, "next_url"); } - init { JsonModel.Set(this._rawData, "next_url", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("next_url"); + } + init { this._rawData.Set("next_url", value); } } /// @@ -97,14 +121,14 @@ public TemplateListResponse(TemplateListResponse templateListResponse) public TemplateListResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] TemplateListResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -182,8 +206,12 @@ public sealed record class Item : JsonModel /// public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } /// @@ -191,8 +219,12 @@ public required string ID /// public required string CreatedAt { - get { return JsonModel.GetNotNullClass(this.RawData, "created_at"); } - init { JsonModel.Set(this._rawData, "created_at", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("created_at"); + } + init { this._rawData.Set("created_at", value); } } /// @@ -200,8 +232,12 @@ public required string CreatedAt /// public required string PublishedAt { - get { return JsonModel.GetNotNullClass(this.RawData, "published_at"); } - init { JsonModel.Set(this._rawData, "published_at", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("published_at"); + } + init { this._rawData.Set("published_at", value); } } /// @@ -209,8 +245,12 @@ public required string PublishedAt /// public required string UpdatedAt { - get { return JsonModel.GetNotNullClass(this.RawData, "updated_at"); } - init { JsonModel.Set(this._rawData, "updated_at", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("updated_at"); + } + init { this._rawData.Set("updated_at", value); } } /// @@ -218,8 +258,12 @@ public required string UpdatedAt /// public required string Version { - get { return JsonModel.GetNotNullClass(this.RawData, "version"); } - init { JsonModel.Set(this._rawData, "version", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("version"); + } + init { this._rawData.Set("version", value); } } /// @@ -227,8 +271,12 @@ public required string Version /// public required Data Data { - get { return JsonModel.GetNotNullClass(this.RawData, "data"); } - init { JsonModel.Set(this._rawData, "data", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("data"); + } + init { this._rawData.Set("data", value); } } public static implicit operator BaseTemplateTenantAssociation( @@ -261,14 +309,14 @@ public Item(global::Courier.Models.Tenants.Templates.Item item) public Item(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Item(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -302,8 +350,12 @@ public sealed record class IntersectionMember1 : JsonModel /// public required Data Data { - get { return JsonModel.GetNotNullClass(this.RawData, "data"); } - init { JsonModel.Set(this._rawData, "data", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("data"); + } + init { this._rawData.Set("data", value); } } /// @@ -321,14 +373,14 @@ public IntersectionMember1( public IntersectionMember1(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] IntersectionMember1(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -365,8 +417,12 @@ public sealed record class Data : JsonModel { public required MessageRouting Routing { - get { return JsonModel.GetNotNullClass(this.RawData, "routing"); } - init { JsonModel.Set(this._rawData, "routing", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("routing"); + } + init { this._rawData.Set("routing", value); } } /// @@ -382,14 +438,14 @@ public Data(Data data) public Data(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Data(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Tenants/Templates/TemplateRetrieveParams.cs b/src/Courier/Models/Tenants/Templates/TemplateRetrieveParams.cs index f3891c2e..10c98d99 100644 --- a/src/Courier/Models/Tenants/Templates/TemplateRetrieveParams.cs +++ b/src/Courier/Models/Tenants/Templates/TemplateRetrieveParams.cs @@ -31,8 +31,8 @@ public TemplateRetrieveParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -42,8 +42,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Tenants/Tenant.cs b/src/Courier/Models/Tenants/Tenant.cs index 6efa402a..7e026453 100644 --- a/src/Courier/Models/Tenants/Tenant.cs +++ b/src/Courier/Models/Tenants/Tenant.cs @@ -15,8 +15,12 @@ public sealed record class Tenant : JsonModel /// public required string ID { - get { return JsonModel.GetNotNullClass(this.RawData, "id"); } - init { JsonModel.Set(this._rawData, "id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("id"); + } + init { this._rawData.Set("id", value); } } /// @@ -24,8 +28,12 @@ public required string ID /// public required string Name { - get { return JsonModel.GetNotNullClass(this.RawData, "name"); } - init { JsonModel.Set(this._rawData, "name", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("name"); + } + init { this._rawData.Set("name", value); } } /// @@ -33,8 +41,12 @@ public required string Name /// public string? BrandID { - get { return JsonModel.GetNullableClass(this.RawData, "brand_id"); } - init { JsonModel.Set(this._rawData, "brand_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("brand_id"); + } + init { this._rawData.Set("brand_id", value); } } /// @@ -45,12 +57,10 @@ public DefaultPreferences? DefaultPreferences { get { - return JsonModel.GetNullableClass( - this.RawData, - "default_preferences" - ); + this._rawData.Freeze(); + return this._rawData.GetNullableClass("default_preferences"); } - init { JsonModel.Set(this._rawData, "default_preferences", value); } + init { this._rawData.Set("default_preferences", value); } } /// @@ -58,8 +68,12 @@ public DefaultPreferences? DefaultPreferences /// public string? ParentTenantID { - get { return JsonModel.GetNullableClass(this.RawData, "parent_tenant_id"); } - init { JsonModel.Set(this._rawData, "parent_tenant_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("parent_tenant_id"); + } + init { this._rawData.Set("parent_tenant_id", value); } } /// @@ -69,12 +83,18 @@ public IReadOnlyDictionary? Properties { get { - return JsonModel.GetNullableClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNullableClass>( "properties" ); } - init { JsonModel.Set(this._rawData, "properties", value); } + init + { + this._rawData.Set?>( + "properties", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); + } } /// @@ -84,12 +104,18 @@ public IReadOnlyDictionary? UserProfile { get { - return JsonModel.GetNullableClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNullableClass>( "user_profile" ); } - init { JsonModel.Set(this._rawData, "user_profile", value); } + init + { + this._rawData.Set?>( + "user_profile", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); + } } /// @@ -111,14 +137,14 @@ public Tenant(Tenant tenant) public Tenant(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Tenant(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Tenants/TenantAssociation.cs b/src/Courier/Models/Tenants/TenantAssociation.cs index 8468ebfd..1bbe49b9 100644 --- a/src/Courier/Models/Tenants/TenantAssociation.cs +++ b/src/Courier/Models/Tenants/TenantAssociation.cs @@ -17,8 +17,12 @@ public sealed record class TenantAssociation : JsonModel /// public required string TenantID { - get { return JsonModel.GetNotNullClass(this.RawData, "tenant_id"); } - init { JsonModel.Set(this._rawData, "tenant_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("tenant_id"); + } + init { this._rawData.Set("tenant_id", value); } } /// @@ -28,24 +32,28 @@ public IReadOnlyDictionary? Profile { get { - return JsonModel.GetNullableClass>( - this.RawData, - "profile" + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("profile"); + } + init + { + this._rawData.Set?>( + "profile", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "profile", value); } } public ApiEnum? Type { get { - return JsonModel.GetNullableClass>( - this.RawData, - "type" - ); + this._rawData.Freeze(); + return this._rawData.GetNullableClass< + ApiEnum + >("type"); } - init { JsonModel.Set(this._rawData, "type", value); } + init { this._rawData.Set("type", value); } } /// @@ -53,8 +61,12 @@ public IReadOnlyDictionary? Profile /// public string? UserID { - get { return JsonModel.GetNullableClass(this.RawData, "user_id"); } - init { JsonModel.Set(this._rawData, "user_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("user_id"); + } + init { this._rawData.Set("user_id", value); } } /// @@ -73,14 +85,14 @@ public TenantAssociation(TenantAssociation tenantAssociation) public TenantAssociation(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] TenantAssociation(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Tenants/TenantDeleteParams.cs b/src/Courier/Models/Tenants/TenantDeleteParams.cs index 9a5bbc54..94b31520 100644 --- a/src/Courier/Models/Tenants/TenantDeleteParams.cs +++ b/src/Courier/Models/Tenants/TenantDeleteParams.cs @@ -28,8 +28,8 @@ public TenantDeleteParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Tenants/TenantListParams.cs b/src/Courier/Models/Tenants/TenantListParams.cs index 71eaa910..1f9a5fa4 100644 --- a/src/Courier/Models/Tenants/TenantListParams.cs +++ b/src/Courier/Models/Tenants/TenantListParams.cs @@ -18,8 +18,12 @@ public sealed record class TenantListParams : ParamsBase /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawQueryData, "cursor"); } - init { JsonModel.Set(this._rawQueryData, "cursor", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("cursor"); + } + init { this._rawQueryData.Set("cursor", value); } } /// @@ -27,8 +31,12 @@ public string? Cursor /// public long? Limit { - get { return JsonModel.GetNullableStruct(this.RawQueryData, "limit"); } - init { JsonModel.Set(this._rawQueryData, "limit", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableStruct("limit"); + } + init { this._rawQueryData.Set("limit", value); } } /// @@ -36,8 +44,12 @@ public long? Limit /// public string? ParentTenantID { - get { return JsonModel.GetNullableClass(this.RawQueryData, "parent_tenant_id"); } - init { JsonModel.Set(this._rawQueryData, "parent_tenant_id", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("parent_tenant_id"); + } + init { this._rawQueryData.Set("parent_tenant_id", value); } } public TenantListParams() { } @@ -50,8 +62,8 @@ public TenantListParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -61,8 +73,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Tenants/TenantListResponse.cs b/src/Courier/Models/Tenants/TenantListResponse.cs index 1d7ed723..7230db5d 100644 --- a/src/Courier/Models/Tenants/TenantListResponse.cs +++ b/src/Courier/Models/Tenants/TenantListResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -17,8 +18,12 @@ public sealed record class TenantListResponse : JsonModel /// public required bool HasMore { - get { return JsonModel.GetNotNullStruct(this.RawData, "has_more"); } - init { JsonModel.Set(this._rawData, "has_more", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("has_more"); + } + init { this._rawData.Set("has_more", value); } } /// @@ -26,8 +31,18 @@ public required bool HasMore /// public required IReadOnlyList Items { - get { return JsonModel.GetNotNullClass>(this.RawData, "items"); } - init { JsonModel.Set(this._rawData, "items", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("items"); + } + init + { + this._rawData.Set>( + "items", + ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -37,12 +52,10 @@ public required ApiEnum Type { get { - return JsonModel.GetNotNullClass>( - this.RawData, - "type" - ); + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("type"); } - init { JsonModel.Set(this._rawData, "type", value); } + init { this._rawData.Set("type", value); } } /// @@ -50,8 +63,12 @@ public required ApiEnum Type /// public required string Url { - get { return JsonModel.GetNotNullClass(this.RawData, "url"); } - init { JsonModel.Set(this._rawData, "url", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("url"); + } + init { this._rawData.Set("url", value); } } /// @@ -60,8 +77,12 @@ public required string Url /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawData, "cursor"); } - init { JsonModel.Set(this._rawData, "cursor", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("cursor"); + } + init { this._rawData.Set("cursor", value); } } /// @@ -70,8 +91,12 @@ public string? Cursor /// public string? NextUrl { - get { return JsonModel.GetNullableClass(this.RawData, "next_url"); } - init { JsonModel.Set(this._rawData, "next_url", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("next_url"); + } + init { this._rawData.Set("next_url", value); } } /// @@ -95,14 +120,14 @@ public TenantListResponse(TenantListResponse tenantListResponse) public TenantListResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] TenantListResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Tenants/TenantListUsersParams.cs b/src/Courier/Models/Tenants/TenantListUsersParams.cs index ba06be08..2c373399 100644 --- a/src/Courier/Models/Tenants/TenantListUsersParams.cs +++ b/src/Courier/Models/Tenants/TenantListUsersParams.cs @@ -20,8 +20,12 @@ public sealed record class TenantListUsersParams : ParamsBase /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawQueryData, "cursor"); } - init { JsonModel.Set(this._rawQueryData, "cursor", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("cursor"); + } + init { this._rawQueryData.Set("cursor", value); } } /// @@ -29,8 +33,12 @@ public string? Cursor /// public long? Limit { - get { return JsonModel.GetNullableStruct(this.RawQueryData, "limit"); } - init { JsonModel.Set(this._rawQueryData, "limit", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableStruct("limit"); + } + init { this._rawQueryData.Set("limit", value); } } public TenantListUsersParams() { } @@ -46,8 +54,8 @@ public TenantListUsersParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -57,8 +65,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Tenants/TenantListUsersResponse.cs b/src/Courier/Models/Tenants/TenantListUsersResponse.cs index 07e4d1f2..08bf9b30 100644 --- a/src/Courier/Models/Tenants/TenantListUsersResponse.cs +++ b/src/Courier/Models/Tenants/TenantListUsersResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -17,8 +18,12 @@ public sealed record class TenantListUsersResponse : JsonModel /// public required bool HasMore { - get { return JsonModel.GetNotNullStruct(this.RawData, "has_more"); } - init { JsonModel.Set(this._rawData, "has_more", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("has_more"); + } + init { this._rawData.Set("has_more", value); } } /// @@ -28,12 +33,12 @@ public required ApiEnum Type { get { - return JsonModel.GetNotNullClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>( "type" ); } - init { JsonModel.Set(this._rawData, "type", value); } + init { this._rawData.Set("type", value); } } /// @@ -41,8 +46,12 @@ public required ApiEnum Type /// public required string Url { - get { return JsonModel.GetNotNullClass(this.RawData, "url"); } - init { JsonModel.Set(this._rawData, "url", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("url"); + } + init { this._rawData.Set("url", value); } } /// @@ -51,14 +60,28 @@ public required string Url /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawData, "cursor"); } - init { JsonModel.Set(this._rawData, "cursor", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("cursor"); + } + init { this._rawData.Set("cursor", value); } } public IReadOnlyList? Items { - get { return JsonModel.GetNullableClass>(this.RawData, "items"); } - init { JsonModel.Set(this._rawData, "items", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>("items"); + } + init + { + this._rawData.Set?>( + "items", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -67,8 +90,12 @@ public IReadOnlyList? Items /// public string? NextUrl { - get { return JsonModel.GetNullableClass(this.RawData, "next_url"); } - init { JsonModel.Set(this._rawData, "next_url", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("next_url"); + } + init { this._rawData.Set("next_url", value); } } /// @@ -92,14 +119,14 @@ public TenantListUsersResponse(TenantListUsersResponse tenantListUsersResponse) public TenantListUsersResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] TenantListUsersResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Tenants/TenantRetrieveParams.cs b/src/Courier/Models/Tenants/TenantRetrieveParams.cs index 3a5609da..3045e147 100644 --- a/src/Courier/Models/Tenants/TenantRetrieveParams.cs +++ b/src/Courier/Models/Tenants/TenantRetrieveParams.cs @@ -28,8 +28,8 @@ public TenantRetrieveParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Tenants/TenantUpdateParams.cs b/src/Courier/Models/Tenants/TenantUpdateParams.cs index d7ac819b..6361f0fc 100644 --- a/src/Courier/Models/Tenants/TenantUpdateParams.cs +++ b/src/Courier/Models/Tenants/TenantUpdateParams.cs @@ -14,7 +14,7 @@ namespace Courier.Models.Tenants; /// public sealed record class TenantUpdateParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -27,8 +27,12 @@ public IReadOnlyDictionary RawBodyData /// public required string Name { - get { return JsonModel.GetNotNullClass(this.RawBodyData, "name"); } - init { JsonModel.Set(this._rawBodyData, "name", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass("name"); + } + init { this._rawBodyData.Set("name", value); } } /// @@ -36,8 +40,12 @@ public required string Name /// public string? BrandID { - get { return JsonModel.GetNullableClass(this.RawBodyData, "brand_id"); } - init { JsonModel.Set(this._rawBodyData, "brand_id", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("brand_id"); + } + init { this._rawBodyData.Set("brand_id", value); } } /// @@ -48,12 +56,10 @@ public DefaultPreferences? DefaultPreferences { get { - return JsonModel.GetNullableClass( - this.RawBodyData, - "default_preferences" - ); + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("default_preferences"); } - init { JsonModel.Set(this._rawBodyData, "default_preferences", value); } + init { this._rawBodyData.Set("default_preferences", value); } } /// @@ -61,8 +67,12 @@ public DefaultPreferences? DefaultPreferences /// public string? ParentTenantID { - get { return JsonModel.GetNullableClass(this.RawBodyData, "parent_tenant_id"); } - init { JsonModel.Set(this._rawBodyData, "parent_tenant_id", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("parent_tenant_id"); + } + init { this._rawBodyData.Set("parent_tenant_id", value); } } /// @@ -72,12 +82,18 @@ public IReadOnlyDictionary? Properties { get { - return JsonModel.GetNullableClass>( - this.RawBodyData, + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass>( "properties" ); } - init { JsonModel.Set(this._rawBodyData, "properties", value); } + init + { + this._rawBodyData.Set?>( + "properties", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); + } } /// @@ -87,12 +103,18 @@ public IReadOnlyDictionary? UserProfile { get { - return JsonModel.GetNullableClass>( - this.RawBodyData, + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass>( "user_profile" ); } - init { JsonModel.Set(this._rawBodyData, "user_profile", value); } + init + { + this._rawBodyData.Set?>( + "user_profile", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); + } } public TenantUpdateParams() { } @@ -102,7 +124,7 @@ public TenantUpdateParams(TenantUpdateParams tenantUpdateParams) { this.TenantID = tenantUpdateParams.TenantID; - this._rawBodyData = [.. tenantUpdateParams._rawBodyData]; + this._rawBodyData = new(tenantUpdateParams._rawBodyData); } public TenantUpdateParams( @@ -111,9 +133,9 @@ public TenantUpdateParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -124,9 +146,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -157,7 +179,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Token.cs b/src/Courier/Models/Token.cs index a9392823..5b34a474 100644 --- a/src/Courier/Models/Token.cs +++ b/src/Courier/Models/Token.cs @@ -12,8 +12,12 @@ public sealed record class Token : JsonModel { public required string TokenValue { - get { return JsonModel.GetNotNullClass(this.RawData, "token"); } - init { JsonModel.Set(this._rawData, "token", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("token"); + } + init { this._rawData.Set("token", value); } } /// @@ -29,14 +33,14 @@ public Token(Token token) public Token(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Token(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Translations/TranslationRetrieveParams.cs b/src/Courier/Models/Translations/TranslationRetrieveParams.cs index 68fb2a75..8a635b38 100644 --- a/src/Courier/Models/Translations/TranslationRetrieveParams.cs +++ b/src/Courier/Models/Translations/TranslationRetrieveParams.cs @@ -31,8 +31,8 @@ public TranslationRetrieveParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -42,8 +42,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Translations/TranslationUpdateParams.cs b/src/Courier/Models/Translations/TranslationUpdateParams.cs index b5b6cedc..a6eddd40 100644 --- a/src/Courier/Models/Translations/TranslationUpdateParams.cs +++ b/src/Courier/Models/Translations/TranslationUpdateParams.cs @@ -14,7 +14,7 @@ namespace Courier.Models.Translations; /// public sealed record class TranslationUpdateParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -26,8 +26,12 @@ public IReadOnlyDictionary RawBodyData public required string Body { - get { return JsonModel.GetNotNullClass(this.RawBodyData, "body"); } - init { JsonModel.Set(this._rawBodyData, "body", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass("body"); + } + init { this._rawBodyData.Set("body", value); } } public TranslationUpdateParams() { } @@ -38,7 +42,7 @@ public TranslationUpdateParams(TranslationUpdateParams translationUpdateParams) this.Domain = translationUpdateParams.Domain; this.Locale = translationUpdateParams.Locale; - this._rawBodyData = [.. translationUpdateParams._rawBodyData]; + this._rawBodyData = new(translationUpdateParams._rawBodyData); } public TranslationUpdateParams( @@ -47,9 +51,9 @@ public TranslationUpdateParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -60,9 +64,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -94,7 +98,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/UserProfile.cs b/src/Courier/Models/UserProfile.cs index 6400ca01..cc957b33 100644 --- a/src/Courier/Models/UserProfile.cs +++ b/src/Courier/Models/UserProfile.cs @@ -12,26 +12,42 @@ public sealed record class UserProfile : JsonModel { public Address? Address { - get { return JsonModel.GetNullableClass
(this.RawData, "address"); } - init { JsonModel.Set(this._rawData, "address", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass
("address"); + } + init { this._rawData.Set("address", value); } } public AirshipProfile? Airship { - get { return JsonModel.GetNullableClass(this.RawData, "airship"); } - init { JsonModel.Set(this._rawData, "airship", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("airship"); + } + init { this._rawData.Set("airship", value); } } public string? Apn { - get { return JsonModel.GetNullableClass(this.RawData, "apn"); } - init { JsonModel.Set(this._rawData, "apn", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("apn"); + } + init { this._rawData.Set("apn", value); } } public string? Birthdate { - get { return JsonModel.GetNullableClass(this.RawData, "birthdate"); } - init { JsonModel.Set(this._rawData, "birthdate", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("birthdate"); + } + init { this._rawData.Set("birthdate", value); } } /// @@ -42,174 +58,276 @@ public IReadOnlyDictionary? Custom { get { - return JsonModel.GetNullableClass>( - this.RawData, - "custom" + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("custom"); + } + init + { + this._rawData.Set?>( + "custom", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "custom", value); } } public Discord? Discord { - get { return JsonModel.GetNullableClass(this.RawData, "discord"); } - init { JsonModel.Set(this._rawData, "discord", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("discord"); + } + init { this._rawData.Set("discord", value); } } public string? Email { - get { return JsonModel.GetNullableClass(this.RawData, "email"); } - init { JsonModel.Set(this._rawData, "email", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("email"); + } + init { this._rawData.Set("email", value); } } public bool? EmailVerified { - get { return JsonModel.GetNullableStruct(this.RawData, "email_verified"); } - init { JsonModel.Set(this._rawData, "email_verified", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("email_verified"); + } + init { this._rawData.Set("email_verified", value); } } public Expo? Expo { - get { return JsonModel.GetNullableClass(this.RawData, "expo"); } - init { JsonModel.Set(this._rawData, "expo", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("expo"); + } + init { this._rawData.Set("expo", value); } } public string? FacebookPsid { - get { return JsonModel.GetNullableClass(this.RawData, "facebookPSID"); } - init { JsonModel.Set(this._rawData, "facebookPSID", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("facebookPSID"); + } + init { this._rawData.Set("facebookPSID", value); } } public string? FamilyName { - get { return JsonModel.GetNullableClass(this.RawData, "family_name"); } - init { JsonModel.Set(this._rawData, "family_name", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("family_name"); + } + init { this._rawData.Set("family_name", value); } } public UserProfileFirebaseToken? FirebaseToken { get { - return JsonModel.GetNullableClass( - this.RawData, - "firebaseToken" - ); + this._rawData.Freeze(); + return this._rawData.GetNullableClass("firebaseToken"); } - init { JsonModel.Set(this._rawData, "firebaseToken", value); } + init { this._rawData.Set("firebaseToken", value); } } public string? Gender { - get { return JsonModel.GetNullableClass(this.RawData, "gender"); } - init { JsonModel.Set(this._rawData, "gender", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("gender"); + } + init { this._rawData.Set("gender", value); } } public string? GivenName { - get { return JsonModel.GetNullableClass(this.RawData, "given_name"); } - init { JsonModel.Set(this._rawData, "given_name", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("given_name"); + } + init { this._rawData.Set("given_name", value); } } public Intercom? Intercom { - get { return JsonModel.GetNullableClass(this.RawData, "intercom"); } - init { JsonModel.Set(this._rawData, "intercom", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("intercom"); + } + init { this._rawData.Set("intercom", value); } } public string? Locale { - get { return JsonModel.GetNullableClass(this.RawData, "locale"); } - init { JsonModel.Set(this._rawData, "locale", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("locale"); + } + init { this._rawData.Set("locale", value); } } public string? MiddleName { - get { return JsonModel.GetNullableClass(this.RawData, "middle_name"); } - init { JsonModel.Set(this._rawData, "middle_name", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("middle_name"); + } + init { this._rawData.Set("middle_name", value); } } public MsTeams? MsTeams { - get { return JsonModel.GetNullableClass(this.RawData, "ms_teams"); } - init { JsonModel.Set(this._rawData, "ms_teams", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("ms_teams"); + } + init { this._rawData.Set("ms_teams", value); } } public string? Name { - get { return JsonModel.GetNullableClass(this.RawData, "name"); } - init { JsonModel.Set(this._rawData, "name", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("name"); + } + init { this._rawData.Set("name", value); } } public string? Nickname { - get { return JsonModel.GetNullableClass(this.RawData, "nickname"); } - init { JsonModel.Set(this._rawData, "nickname", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("nickname"); + } + init { this._rawData.Set("nickname", value); } } public string? PhoneNumber { - get { return JsonModel.GetNullableClass(this.RawData, "phone_number"); } - init { JsonModel.Set(this._rawData, "phone_number", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("phone_number"); + } + init { this._rawData.Set("phone_number", value); } } public bool? PhoneNumberVerified { - get { return JsonModel.GetNullableStruct(this.RawData, "phone_number_verified"); } - init { JsonModel.Set(this._rawData, "phone_number_verified", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("phone_number_verified"); + } + init { this._rawData.Set("phone_number_verified", value); } } public string? Picture { - get { return JsonModel.GetNullableClass(this.RawData, "picture"); } - init { JsonModel.Set(this._rawData, "picture", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("picture"); + } + init { this._rawData.Set("picture", value); } } public string? PreferredName { - get { return JsonModel.GetNullableClass(this.RawData, "preferred_name"); } - init { JsonModel.Set(this._rawData, "preferred_name", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("preferred_name"); + } + init { this._rawData.Set("preferred_name", value); } } public string? Profile { - get { return JsonModel.GetNullableClass(this.RawData, "profile"); } - init { JsonModel.Set(this._rawData, "profile", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("profile"); + } + init { this._rawData.Set("profile", value); } } public Slack? Slack { - get { return JsonModel.GetNullableClass(this.RawData, "slack"); } - init { JsonModel.Set(this._rawData, "slack", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("slack"); + } + init { this._rawData.Set("slack", value); } } public string? Sub { - get { return JsonModel.GetNullableClass(this.RawData, "sub"); } - init { JsonModel.Set(this._rawData, "sub", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("sub"); + } + init { this._rawData.Set("sub", value); } } public string? TargetArn { - get { return JsonModel.GetNullableClass(this.RawData, "target_arn"); } - init { JsonModel.Set(this._rawData, "target_arn", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("target_arn"); + } + init { this._rawData.Set("target_arn", value); } } public string? UpdatedAt { - get { return JsonModel.GetNullableClass(this.RawData, "updated_at"); } - init { JsonModel.Set(this._rawData, "updated_at", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("updated_at"); + } + init { this._rawData.Set("updated_at", value); } } public string? Website { - get { return JsonModel.GetNullableClass(this.RawData, "website"); } - init { JsonModel.Set(this._rawData, "website", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("website"); + } + init { this._rawData.Set("website", value); } } public string? Zoneinfo { - get { return JsonModel.GetNullableClass(this.RawData, "zoneinfo"); } - init { JsonModel.Set(this._rawData, "zoneinfo", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("zoneinfo"); + } + init { this._rawData.Set("zoneinfo", value); } } /// @@ -255,14 +373,14 @@ public UserProfile(UserProfile userProfile) public UserProfile(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] UserProfile(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -285,38 +403,62 @@ public sealed record class Address : JsonModel { public required string Country { - get { return JsonModel.GetNotNullClass(this.RawData, "country"); } - init { JsonModel.Set(this._rawData, "country", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("country"); + } + init { this._rawData.Set("country", value); } } public required string Formatted { - get { return JsonModel.GetNotNullClass(this.RawData, "formatted"); } - init { JsonModel.Set(this._rawData, "formatted", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("formatted"); + } + init { this._rawData.Set("formatted", value); } } public required string Locality { - get { return JsonModel.GetNotNullClass(this.RawData, "locality"); } - init { JsonModel.Set(this._rawData, "locality", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("locality"); + } + init { this._rawData.Set("locality", value); } } public required string PostalCode { - get { return JsonModel.GetNotNullClass(this.RawData, "postal_code"); } - init { JsonModel.Set(this._rawData, "postal_code", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("postal_code"); + } + init { this._rawData.Set("postal_code", value); } } public required string Region { - get { return JsonModel.GetNotNullClass(this.RawData, "region"); } - init { JsonModel.Set(this._rawData, "region", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("region"); + } + init { this._rawData.Set("region", value); } } public required string StreetAddress { - get { return JsonModel.GetNotNullClass(this.RawData, "street_address"); } - init { JsonModel.Set(this._rawData, "street_address", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("street_address"); + } + init { this._rawData.Set("street_address", value); } } /// @@ -337,14 +479,14 @@ public Address(Address address) public Address(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Address(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/UserProfileFirebaseToken.cs b/src/Courier/Models/UserProfileFirebaseToken.cs index e9fa985c..65fe517e 100644 --- a/src/Courier/Models/UserProfileFirebaseToken.cs +++ b/src/Courier/Models/UserProfileFirebaseToken.cs @@ -18,7 +18,13 @@ public record class UserProfileFirebaseToken : ModelBase public JsonElement Json { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } + get + { + return this._element ??= JsonSerializer.SerializeToElement( + this.Value, + ModelBase.SerializerOptions + ); + } } public UserProfileFirebaseToken(string value, JsonElement? element = null) diff --git a/src/Courier/Models/UserRecipient.cs b/src/Courier/Models/UserRecipient.cs index f8d7b3d6..dc5249c6 100644 --- a/src/Courier/Models/UserRecipient.cs +++ b/src/Courier/Models/UserRecipient.cs @@ -15,8 +15,12 @@ public sealed record class UserRecipient : JsonModel /// public string? AccountID { - get { return JsonModel.GetNullableClass(this.RawData, "account_id"); } - init { JsonModel.Set(this._rawData, "account_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("account_id"); + } + init { this._rawData.Set("account_id", value); } } /// @@ -24,20 +28,28 @@ public string? AccountID /// public MessageContext? Context { - get { return JsonModel.GetNullableClass(this.RawData, "context"); } - init { JsonModel.Set(this._rawData, "context", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("context"); + } + init { this._rawData.Set("context", value); } } public IReadOnlyDictionary? Data { get { - return JsonModel.GetNullableClass>( - this.RawData, - "data" + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("data"); + } + init + { + this._rawData.Set?>( + "data", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) ); } - init { JsonModel.Set(this._rawData, "data", value); } } /// @@ -45,8 +57,12 @@ public IReadOnlyDictionary? Data /// public string? Email { - get { return JsonModel.GetNullableClass(this.RawData, "email"); } - init { JsonModel.Set(this._rawData, "email", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("email"); + } + init { this._rawData.Set("email", value); } } /// @@ -54,8 +70,12 @@ public string? Email /// public string? ListID { - get { return JsonModel.GetNullableClass(this.RawData, "list_id"); } - init { JsonModel.Set(this._rawData, "list_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("list_id"); + } + init { this._rawData.Set("list_id", value); } } /// @@ -63,8 +83,12 @@ public string? ListID /// public string? Locale { - get { return JsonModel.GetNullableClass(this.RawData, "locale"); } - init { JsonModel.Set(this._rawData, "locale", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("locale"); + } + init { this._rawData.Set("locale", value); } } /// @@ -72,14 +96,22 @@ public string? Locale /// public string? PhoneNumber { - get { return JsonModel.GetNullableClass(this.RawData, "phone_number"); } - init { JsonModel.Set(this._rawData, "phone_number", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("phone_number"); + } + init { this._rawData.Set("phone_number", value); } } public Preferences? Preferences { - get { return JsonModel.GetNullableClass(this.RawData, "preferences"); } - init { JsonModel.Set(this._rawData, "preferences", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("preferences"); + } + init { this._rawData.Set("preferences", value); } } /// @@ -87,8 +119,12 @@ public Preferences? Preferences /// public string? TenantID { - get { return JsonModel.GetNullableClass(this.RawData, "tenant_id"); } - init { JsonModel.Set(this._rawData, "tenant_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("tenant_id"); + } + init { this._rawData.Set("tenant_id", value); } } /// @@ -97,8 +133,12 @@ public string? TenantID /// public string? UserID { - get { return JsonModel.GetNullableClass(this.RawData, "user_id"); } - init { JsonModel.Set(this._rawData, "user_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("user_id"); + } + init { this._rawData.Set("user_id", value); } } /// @@ -123,14 +163,14 @@ public UserRecipient(UserRecipient userRecipient) public UserRecipient(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] UserRecipient(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -155,30 +195,46 @@ public required IReadOnlyDictionary Notifications { get { - return JsonModel.GetNotNullClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>( "notifications" ); } - init { JsonModel.Set(this._rawData, "notifications", value); } + init + { + this._rawData.Set>( + "notifications", + FrozenDictionary.ToFrozenDictionary(value) + ); + } } public IReadOnlyDictionary? Categories { get { - return JsonModel.GetNullableClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNullableClass>( "categories" ); } - init { JsonModel.Set(this._rawData, "categories", value); } + init + { + this._rawData.Set?>( + "categories", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); + } } public string? TemplateID { - get { return JsonModel.GetNullableClass(this.RawData, "templateId"); } - init { JsonModel.Set(this._rawData, "templateId", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("templateId"); + } + init { this._rawData.Set("templateId", value); } } /// @@ -205,14 +261,14 @@ public Preferences(Preferences preferences) public Preferences(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Preferences(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -223,7 +279,7 @@ public static Preferences FromRawUnchecked(IReadOnlyDictionary notifications) + public Preferences(IReadOnlyDictionary notifications) : this() { this.Notifications = notifications; diff --git a/src/Courier/Models/Users/Preferences/PreferenceRetrieveParams.cs b/src/Courier/Models/Users/Preferences/PreferenceRetrieveParams.cs index 1bb8b45b..87ce00c1 100644 --- a/src/Courier/Models/Users/Preferences/PreferenceRetrieveParams.cs +++ b/src/Courier/Models/Users/Preferences/PreferenceRetrieveParams.cs @@ -20,8 +20,12 @@ public sealed record class PreferenceRetrieveParams : ParamsBase ///
public string? TenantID { - get { return JsonModel.GetNullableClass(this.RawQueryData, "tenant_id"); } - init { JsonModel.Set(this._rawQueryData, "tenant_id", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("tenant_id"); + } + init { this._rawQueryData.Set("tenant_id", value); } } public PreferenceRetrieveParams() { } @@ -37,8 +41,8 @@ public PreferenceRetrieveParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -48,8 +52,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Preferences/PreferenceRetrieveResponse.cs b/src/Courier/Models/Users/Preferences/PreferenceRetrieveResponse.cs index 04de0f4b..be95d6be 100644 --- a/src/Courier/Models/Users/Preferences/PreferenceRetrieveResponse.cs +++ b/src/Courier/Models/Users/Preferences/PreferenceRetrieveResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -17,8 +18,18 @@ public sealed record class PreferenceRetrieveResponse : JsonModel ///
public required IReadOnlyList Items { - get { return JsonModel.GetNotNullClass>(this.RawData, "items"); } - init { JsonModel.Set(this._rawData, "items", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("items"); + } + init + { + this._rawData.Set>( + "items", + ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -26,8 +37,12 @@ public required IReadOnlyList Items /// public required Paging Paging { - get { return JsonModel.GetNotNullClass(this.RawData, "paging"); } - init { JsonModel.Set(this._rawData, "paging", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("paging"); + } + init { this._rawData.Set("paging", value); } } /// @@ -47,14 +62,14 @@ public PreferenceRetrieveResponse(PreferenceRetrieveResponse preferenceRetrieveR public PreferenceRetrieveResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] PreferenceRetrieveResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Preferences/PreferenceRetrieveTopicParams.cs b/src/Courier/Models/Users/Preferences/PreferenceRetrieveTopicParams.cs index 0272911b..d4b82919 100644 --- a/src/Courier/Models/Users/Preferences/PreferenceRetrieveTopicParams.cs +++ b/src/Courier/Models/Users/Preferences/PreferenceRetrieveTopicParams.cs @@ -22,8 +22,12 @@ public sealed record class PreferenceRetrieveTopicParams : ParamsBase /// public string? TenantID { - get { return JsonModel.GetNullableClass(this.RawQueryData, "tenant_id"); } - init { JsonModel.Set(this._rawQueryData, "tenant_id", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("tenant_id"); + } + init { this._rawQueryData.Set("tenant_id", value); } } public PreferenceRetrieveTopicParams() { } @@ -42,8 +46,8 @@ public PreferenceRetrieveTopicParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -53,8 +57,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Preferences/PreferenceRetrieveTopicResponse.cs b/src/Courier/Models/Users/Preferences/PreferenceRetrieveTopicResponse.cs index da1ce2f0..a9a63c6e 100644 --- a/src/Courier/Models/Users/Preferences/PreferenceRetrieveTopicResponse.cs +++ b/src/Courier/Models/Users/Preferences/PreferenceRetrieveTopicResponse.cs @@ -17,8 +17,12 @@ public sealed record class PreferenceRetrieveTopicResponse : JsonModel { public required TopicPreference Topic { - get { return JsonModel.GetNotNullClass(this.RawData, "topic"); } - init { JsonModel.Set(this._rawData, "topic", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("topic"); + } + init { this._rawData.Set("topic", value); } } /// @@ -36,14 +40,14 @@ PreferenceRetrieveTopicResponse preferenceRetrieveTopicResponse public PreferenceRetrieveTopicResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] PreferenceRetrieveTopicResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Preferences/PreferenceUpdateOrCreateTopicParams.cs b/src/Courier/Models/Users/Preferences/PreferenceUpdateOrCreateTopicParams.cs index e7a1d0e1..542060eb 100644 --- a/src/Courier/Models/Users/Preferences/PreferenceUpdateOrCreateTopicParams.cs +++ b/src/Courier/Models/Users/Preferences/PreferenceUpdateOrCreateTopicParams.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Net.Http; using System.Text; @@ -15,7 +16,7 @@ namespace Courier.Models.Users.Preferences; /// public sealed record class PreferenceUpdateOrCreateTopicParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -27,8 +28,12 @@ public IReadOnlyDictionary RawBodyData public required Topic Topic { - get { return JsonModel.GetNotNullClass(this.RawBodyData, "topic"); } - init { JsonModel.Set(this._rawBodyData, "topic", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass("topic"); + } + init { this._rawBodyData.Set("topic", value); } } /// @@ -36,8 +41,12 @@ public required Topic Topic /// public string? TenantID { - get { return JsonModel.GetNullableClass(this.RawQueryData, "tenant_id"); } - init { JsonModel.Set(this._rawQueryData, "tenant_id", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("tenant_id"); + } + init { this._rawQueryData.Set("tenant_id", value); } } public PreferenceUpdateOrCreateTopicParams() { } @@ -50,7 +59,7 @@ PreferenceUpdateOrCreateTopicParams preferenceUpdateOrCreateTopicParams this.UserID = preferenceUpdateOrCreateTopicParams.UserID; this.TopicID = preferenceUpdateOrCreateTopicParams.TopicID; - this._rawBodyData = [.. preferenceUpdateOrCreateTopicParams._rawBodyData]; + this._rawBodyData = new(preferenceUpdateOrCreateTopicParams._rawBodyData); } public PreferenceUpdateOrCreateTopicParams( @@ -59,9 +68,9 @@ public PreferenceUpdateOrCreateTopicParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -72,9 +81,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -106,7 +115,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); @@ -129,12 +138,10 @@ public required ApiEnum Status { get { - return JsonModel.GetNotNullClass>( - this.RawData, - "status" - ); + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("status"); } - init { JsonModel.Set(this._rawData, "status", value); } + init { this._rawData.Set("status", value); } } /// @@ -144,18 +151,28 @@ public IReadOnlyList>? CustomRouting { get { - return JsonModel.GetNullableClass>>( - this.RawData, - "custom_routing" + this._rawData.Freeze(); + return this._rawData.GetNullableStruct< + ImmutableArray> + >("custom_routing"); + } + init + { + this._rawData.Set>?>( + "custom_routing", + value == null ? null : ImmutableArray.ToImmutableArray(value) ); } - init { JsonModel.Set(this._rawData, "custom_routing", value); } } public bool? HasCustomRouting { - get { return JsonModel.GetNullableStruct(this.RawData, "has_custom_routing"); } - init { JsonModel.Set(this._rawData, "has_custom_routing", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("has_custom_routing"); + } + init { this._rawData.Set("has_custom_routing", value); } } /// @@ -176,14 +193,14 @@ public Topic(Topic topic) public Topic(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Topic(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Preferences/PreferenceUpdateOrCreateTopicResponse.cs b/src/Courier/Models/Users/Preferences/PreferenceUpdateOrCreateTopicResponse.cs index eeda85ed..907f0ea8 100644 --- a/src/Courier/Models/Users/Preferences/PreferenceUpdateOrCreateTopicResponse.cs +++ b/src/Courier/Models/Users/Preferences/PreferenceUpdateOrCreateTopicResponse.cs @@ -17,8 +17,12 @@ public sealed record class PreferenceUpdateOrCreateTopicResponse : JsonModel { public required string Message { - get { return JsonModel.GetNotNullClass(this.RawData, "message"); } - init { JsonModel.Set(this._rawData, "message", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("message"); + } + init { this._rawData.Set("message", value); } } /// @@ -36,14 +40,14 @@ PreferenceUpdateOrCreateTopicResponse preferenceUpdateOrCreateTopicResponse public PreferenceUpdateOrCreateTopicResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] PreferenceUpdateOrCreateTopicResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Preferences/TopicPreference.cs b/src/Courier/Models/Users/Preferences/TopicPreference.cs index bc13c49a..33b90353 100644 --- a/src/Courier/Models/Users/Preferences/TopicPreference.cs +++ b/src/Courier/Models/Users/Preferences/TopicPreference.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -14,36 +15,42 @@ public required ApiEnum DefaultStatus { get { - return JsonModel.GetNotNullClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>( "default_status" ); } - init { JsonModel.Set(this._rawData, "default_status", value); } + init { this._rawData.Set("default_status", value); } } public required ApiEnum Status { get { - return JsonModel.GetNotNullClass>( - this.RawData, - "status" - ); + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("status"); } - init { JsonModel.Set(this._rawData, "status", value); } + init { this._rawData.Set("status", value); } } public required string TopicID { - get { return JsonModel.GetNotNullClass(this.RawData, "topic_id"); } - init { JsonModel.Set(this._rawData, "topic_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("topic_id"); + } + init { this._rawData.Set("topic_id", value); } } public required string TopicName { - get { return JsonModel.GetNotNullClass(this.RawData, "topic_name"); } - init { JsonModel.Set(this._rawData, "topic_name", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("topic_name"); + } + init { this._rawData.Set("topic_name", value); } } /// @@ -53,18 +60,28 @@ public IReadOnlyList>? CustomRouting { get { - return JsonModel.GetNullableClass>>( - this.RawData, - "custom_routing" + this._rawData.Freeze(); + return this._rawData.GetNullableStruct< + ImmutableArray> + >("custom_routing"); + } + init + { + this._rawData.Set>?>( + "custom_routing", + value == null ? null : ImmutableArray.ToImmutableArray(value) ); } - init { JsonModel.Set(this._rawData, "custom_routing", value); } } public bool? HasCustomRouting { - get { return JsonModel.GetNullableStruct(this.RawData, "has_custom_routing"); } - init { JsonModel.Set(this._rawData, "has_custom_routing", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("has_custom_routing"); + } + init { this._rawData.Set("has_custom_routing", value); } } /// @@ -88,14 +105,14 @@ public TopicPreference(TopicPreference topicPreference) public TopicPreference(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] TopicPreference(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Tenants/TenantAddMultipleParams.cs b/src/Courier/Models/Users/Tenants/TenantAddMultipleParams.cs index a22d0f77..89979726 100644 --- a/src/Courier/Models/Users/Tenants/TenantAddMultipleParams.cs +++ b/src/Courier/Models/Users/Tenants/TenantAddMultipleParams.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Net.Http; using System.Text; @@ -17,7 +18,7 @@ namespace Courier.Models.Users.Tenants; /// public sealed record class TenantAddMultipleParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -29,9 +30,16 @@ public required IReadOnlyList Tenants { get { - return JsonModel.GetNotNullClass>(this.RawBodyData, "tenants"); + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullStruct>("tenants"); + } + init + { + this._rawBodyData.Set>( + "tenants", + ImmutableArray.ToImmutableArray(value) + ); } - init { JsonModel.Set(this._rawBodyData, "tenants", value); } } public TenantAddMultipleParams() { } @@ -41,7 +49,7 @@ public TenantAddMultipleParams(TenantAddMultipleParams tenantAddMultipleParams) { this.UserID = tenantAddMultipleParams.UserID; - this._rawBodyData = [.. tenantAddMultipleParams._rawBodyData]; + this._rawBodyData = new(tenantAddMultipleParams._rawBodyData); } public TenantAddMultipleParams( @@ -50,9 +58,9 @@ public TenantAddMultipleParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -63,9 +71,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -97,7 +105,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Users/Tenants/TenantAddSingleParams.cs b/src/Courier/Models/Users/Tenants/TenantAddSingleParams.cs index 90ab7048..908f4170 100644 --- a/src/Courier/Models/Users/Tenants/TenantAddSingleParams.cs +++ b/src/Courier/Models/Users/Tenants/TenantAddSingleParams.cs @@ -17,7 +17,7 @@ namespace Courier.Models.Users.Tenants; /// public sealed record class TenantAddSingleParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -31,12 +31,18 @@ public IReadOnlyDictionary? Profile { get { - return JsonModel.GetNullableClass>( - this.RawBodyData, + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass>( "profile" ); } - init { JsonModel.Set(this._rawBodyData, "profile", value); } + init + { + this._rawBodyData.Set?>( + "profile", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); + } } public TenantAddSingleParams() { } @@ -47,7 +53,7 @@ public TenantAddSingleParams(TenantAddSingleParams tenantAddSingleParams) this.UserID = tenantAddSingleParams.UserID; this.TenantID = tenantAddSingleParams.TenantID; - this._rawBodyData = [.. tenantAddSingleParams._rawBodyData]; + this._rawBodyData = new(tenantAddSingleParams._rawBodyData); } public TenantAddSingleParams( @@ -56,9 +62,9 @@ public TenantAddSingleParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -69,9 +75,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -103,7 +109,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); diff --git a/src/Courier/Models/Users/Tenants/TenantListParams.cs b/src/Courier/Models/Users/Tenants/TenantListParams.cs index 181ab404..d17f6e6c 100644 --- a/src/Courier/Models/Users/Tenants/TenantListParams.cs +++ b/src/Courier/Models/Users/Tenants/TenantListParams.cs @@ -20,8 +20,12 @@ public sealed record class TenantListParams : ParamsBase /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawQueryData, "cursor"); } - init { JsonModel.Set(this._rawQueryData, "cursor", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableClass("cursor"); + } + init { this._rawQueryData.Set("cursor", value); } } /// @@ -29,8 +33,12 @@ public string? Cursor /// public long? Limit { - get { return JsonModel.GetNullableStruct(this.RawQueryData, "limit"); } - init { JsonModel.Set(this._rawQueryData, "limit", value); } + get + { + this._rawQueryData.Freeze(); + return this._rawQueryData.GetNullableStruct("limit"); + } + init { this._rawQueryData.Set("limit", value); } } public TenantListParams() { } @@ -46,8 +54,8 @@ public TenantListParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -57,8 +65,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Tenants/TenantListResponse.cs b/src/Courier/Models/Users/Tenants/TenantListResponse.cs index 93df5e58..109e081e 100644 --- a/src/Courier/Models/Users/Tenants/TenantListResponse.cs +++ b/src/Courier/Models/Users/Tenants/TenantListResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -18,8 +19,12 @@ public sealed record class TenantListResponse : JsonModel /// public required bool HasMore { - get { return JsonModel.GetNotNullStruct(this.RawData, "has_more"); } - init { JsonModel.Set(this._rawData, "has_more", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct("has_more"); + } + init { this._rawData.Set("has_more", value); } } /// @@ -29,11 +34,12 @@ public required bool HasMore { get { - return JsonModel.GetNotNullClass< + this._rawData.Freeze(); + return this._rawData.GetNotNullClass< ApiEnum - >(this.RawData, "type"); + >("type"); } - init { JsonModel.Set(this._rawData, "type", value); } + init { this._rawData.Set("type", value); } } /// @@ -41,8 +47,12 @@ public required bool HasMore /// public required string Url { - get { return JsonModel.GetNotNullClass(this.RawData, "url"); } - init { JsonModel.Set(this._rawData, "url", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("url"); + } + init { this._rawData.Set("url", value); } } /// @@ -51,20 +61,30 @@ public required string Url /// public string? Cursor { - get { return JsonModel.GetNullableClass(this.RawData, "cursor"); } - init { JsonModel.Set(this._rawData, "cursor", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("cursor"); + } + init { this._rawData.Set("cursor", value); } } public IReadOnlyList? Items { get { - return JsonModel.GetNullableClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNullableStruct>( "items" ); } - init { JsonModel.Set(this._rawData, "items", value); } + init + { + this._rawData.Set?>( + "items", + value == null ? null : ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -73,8 +93,12 @@ public string? Cursor /// public string? NextUrl { - get { return JsonModel.GetNullableClass(this.RawData, "next_url"); } - init { JsonModel.Set(this._rawData, "next_url", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("next_url"); + } + init { this._rawData.Set("next_url", value); } } /// @@ -98,14 +122,14 @@ public TenantListResponse(TenantListResponse tenantListResponse) public TenantListResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] TenantListResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Tenants/TenantRemoveAllParams.cs b/src/Courier/Models/Users/Tenants/TenantRemoveAllParams.cs index 2671290b..d3dd80d2 100644 --- a/src/Courier/Models/Users/Tenants/TenantRemoveAllParams.cs +++ b/src/Courier/Models/Users/Tenants/TenantRemoveAllParams.cs @@ -28,8 +28,8 @@ public TenantRemoveAllParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Tenants/TenantRemoveSingleParams.cs b/src/Courier/Models/Users/Tenants/TenantRemoveSingleParams.cs index e3cb9983..3f485c54 100644 --- a/src/Courier/Models/Users/Tenants/TenantRemoveSingleParams.cs +++ b/src/Courier/Models/Users/Tenants/TenantRemoveSingleParams.cs @@ -31,8 +31,8 @@ public TenantRemoveSingleParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -42,8 +42,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Tokens/TokenAddMultipleParams.cs b/src/Courier/Models/Users/Tokens/TokenAddMultipleParams.cs index d94d0d7d..7a4834ca 100644 --- a/src/Courier/Models/Users/Tokens/TokenAddMultipleParams.cs +++ b/src/Courier/Models/Users/Tokens/TokenAddMultipleParams.cs @@ -28,8 +28,8 @@ public TokenAddMultipleParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Tokens/TokenAddSingleParams.cs b/src/Courier/Models/Users/Tokens/TokenAddSingleParams.cs index 582970e7..a55fde97 100644 --- a/src/Courier/Models/Users/Tokens/TokenAddSingleParams.cs +++ b/src/Courier/Models/Users/Tokens/TokenAddSingleParams.cs @@ -16,7 +16,7 @@ namespace Courier.Models.Users.Tokens; /// public sealed record class TokenAddSingleParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -31,20 +31,22 @@ public IReadOnlyDictionary RawBodyData /// public required string TokenValue { - get { return JsonModel.GetNotNullClass(this.RawBodyData, "token"); } - init { JsonModel.Set(this._rawBodyData, "token", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass("token"); + } + init { this._rawBodyData.Set("token", value); } } public required ApiEnum ProviderKey { get { - return JsonModel.GetNotNullClass>( - this.RawBodyData, - "provider_key" - ); + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullClass>("provider_key"); } - init { JsonModel.Set(this._rawBodyData, "provider_key", value); } + init { this._rawBodyData.Set("provider_key", value); } } /// @@ -52,8 +54,12 @@ public required ApiEnum ProviderKey /// public Device? Device { - get { return JsonModel.GetNullableClass(this.RawBodyData, "device"); } - init { JsonModel.Set(this._rawBodyData, "device", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("device"); + } + init { this._rawBodyData.Set("device", value); } } /// @@ -62,8 +68,12 @@ public Device? Device /// public ExpiryDate? ExpiryDate { - get { return JsonModel.GetNullableClass(this.RawBodyData, "expiry_date"); } - init { JsonModel.Set(this._rawBodyData, "expiry_date", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("expiry_date"); + } + init { this._rawBodyData.Set("expiry_date", value); } } /// @@ -71,7 +81,11 @@ public ExpiryDate? ExpiryDate /// public JsonElement? Properties { - get { return JsonModel.GetNullableStruct(this.RawBodyData, "properties"); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableStruct("properties"); + } init { if (value == null) @@ -79,7 +93,7 @@ public JsonElement? Properties return; } - JsonModel.Set(this._rawBodyData, "properties", value); + this._rawBodyData.Set("properties", value); } } @@ -88,8 +102,12 @@ public JsonElement? Properties /// public Tracking? Tracking { - get { return JsonModel.GetNullableClass(this.RawBodyData, "tracking"); } - init { JsonModel.Set(this._rawBodyData, "tracking", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNullableClass("tracking"); + } + init { this._rawBodyData.Set("tracking", value); } } public TokenAddSingleParams() { } @@ -100,7 +118,7 @@ public TokenAddSingleParams(TokenAddSingleParams tokenAddSingleParams) this.UserID = tokenAddSingleParams.UserID; this.Token = tokenAddSingleParams.Token; - this._rawBodyData = [.. tokenAddSingleParams._rawBodyData]; + this._rawBodyData = new(tokenAddSingleParams._rawBodyData); } public TokenAddSingleParams( @@ -109,9 +127,9 @@ public TokenAddSingleParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -122,9 +140,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -156,7 +174,7 @@ IReadOnlyDictionary rawBodyData internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); @@ -233,8 +251,12 @@ public sealed record class Device : JsonModel /// public string? AdID { - get { return JsonModel.GetNullableClass(this.RawData, "ad_id"); } - init { JsonModel.Set(this._rawData, "ad_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("ad_id"); + } + init { this._rawData.Set("ad_id", value); } } /// @@ -242,8 +264,12 @@ public string? AdID /// public string? AppID { - get { return JsonModel.GetNullableClass(this.RawData, "app_id"); } - init { JsonModel.Set(this._rawData, "app_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("app_id"); + } + init { this._rawData.Set("app_id", value); } } /// @@ -251,8 +277,12 @@ public string? AppID /// public string? DeviceID { - get { return JsonModel.GetNullableClass(this.RawData, "device_id"); } - init { JsonModel.Set(this._rawData, "device_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("device_id"); + } + init { this._rawData.Set("device_id", value); } } /// @@ -260,8 +290,12 @@ public string? DeviceID /// public string? Manufacturer { - get { return JsonModel.GetNullableClass(this.RawData, "manufacturer"); } - init { JsonModel.Set(this._rawData, "manufacturer", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("manufacturer"); + } + init { this._rawData.Set("manufacturer", value); } } /// @@ -269,8 +303,12 @@ public string? Manufacturer /// public string? Model { - get { return JsonModel.GetNullableClass(this.RawData, "model"); } - init { JsonModel.Set(this._rawData, "model", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("model"); + } + init { this._rawData.Set("model", value); } } /// @@ -278,8 +316,12 @@ public string? Model /// public string? Platform { - get { return JsonModel.GetNullableClass(this.RawData, "platform"); } - init { JsonModel.Set(this._rawData, "platform", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("platform"); + } + init { this._rawData.Set("platform", value); } } /// @@ -300,14 +342,14 @@ public Device(Device device) public Device(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Device(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -338,7 +380,13 @@ public record class ExpiryDate : ModelBase public JsonElement Json { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } + get + { + return this._element ??= JsonSerializer.SerializeToElement( + this.Value, + ModelBase.SerializerOptions + ); + } } public ExpiryDate(string value, JsonElement? element = null) @@ -561,8 +609,12 @@ public sealed record class Tracking : JsonModel /// public string? IP { - get { return JsonModel.GetNullableClass(this.RawData, "ip"); } - init { JsonModel.Set(this._rawData, "ip", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("ip"); + } + init { this._rawData.Set("ip", value); } } /// @@ -570,8 +622,12 @@ public string? IP /// public string? Lat { - get { return JsonModel.GetNullableClass(this.RawData, "lat"); } - init { JsonModel.Set(this._rawData, "lat", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("lat"); + } + init { this._rawData.Set("lat", value); } } /// @@ -579,8 +635,12 @@ public string? Lat /// public string? Long { - get { return JsonModel.GetNullableClass(this.RawData, "long"); } - init { JsonModel.Set(this._rawData, "long", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("long"); + } + init { this._rawData.Set("long", value); } } /// @@ -588,8 +648,12 @@ public string? Long /// public string? OsVersion { - get { return JsonModel.GetNullableClass(this.RawData, "os_version"); } - init { JsonModel.Set(this._rawData, "os_version", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("os_version"); + } + init { this._rawData.Set("os_version", value); } } /// @@ -608,14 +672,14 @@ public Tracking(Tracking tracking) public Tracking(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Tracking(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Tokens/TokenDeleteParams.cs b/src/Courier/Models/Users/Tokens/TokenDeleteParams.cs index 62e6ee05..d9a2bbbb 100644 --- a/src/Courier/Models/Users/Tokens/TokenDeleteParams.cs +++ b/src/Courier/Models/Users/Tokens/TokenDeleteParams.cs @@ -31,8 +31,8 @@ public TokenDeleteParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -42,8 +42,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Tokens/TokenListParams.cs b/src/Courier/Models/Users/Tokens/TokenListParams.cs index dcad34a6..fdd11776 100644 --- a/src/Courier/Models/Users/Tokens/TokenListParams.cs +++ b/src/Courier/Models/Users/Tokens/TokenListParams.cs @@ -28,8 +28,8 @@ public TokenListParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -39,8 +39,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Tokens/TokenListResponse.cs b/src/Courier/Models/Users/Tokens/TokenListResponse.cs index 309ed15e..5831efa4 100644 --- a/src/Courier/Models/Users/Tokens/TokenListResponse.cs +++ b/src/Courier/Models/Users/Tokens/TokenListResponse.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -15,8 +16,18 @@ public sealed record class TokenListResponse : JsonModel { public required IReadOnlyList Tokens { - get { return JsonModel.GetNotNullClass>(this.RawData, "tokens"); } - init { JsonModel.Set(this._rawData, "tokens", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullStruct>("tokens"); + } + init + { + this._rawData.Set>( + "tokens", + ImmutableArray.ToImmutableArray(value) + ); + } } /// @@ -35,14 +46,14 @@ public TokenListResponse(TokenListResponse tokenListResponse) public TokenListResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] TokenListResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -55,7 +66,7 @@ IReadOnlyDictionary rawData } [SetsRequiredMembers] - public TokenListResponse(List tokens) + public TokenListResponse(IReadOnlyList tokens) : this() { this.Tokens = tokens; diff --git a/src/Courier/Models/Users/Tokens/TokenRetrieveParams.cs b/src/Courier/Models/Users/Tokens/TokenRetrieveParams.cs index f860757f..96435f25 100644 --- a/src/Courier/Models/Users/Tokens/TokenRetrieveParams.cs +++ b/src/Courier/Models/Users/Tokens/TokenRetrieveParams.cs @@ -31,8 +31,8 @@ public TokenRetrieveParams( IReadOnlyDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning disable CS8618 @@ -42,8 +42,8 @@ IReadOnlyDictionary rawQueryData FrozenDictionary rawQueryData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Tokens/TokenRetrieveResponse.cs b/src/Courier/Models/Users/Tokens/TokenRetrieveResponse.cs index 1bae320c..01c74c7d 100644 --- a/src/Courier/Models/Users/Tokens/TokenRetrieveResponse.cs +++ b/src/Courier/Models/Users/Tokens/TokenRetrieveResponse.cs @@ -17,20 +17,24 @@ public sealed record class TokenRetrieveResponse : JsonModel /// public required string Token { - get { return JsonModel.GetNotNullClass(this.RawData, "token"); } - init { JsonModel.Set(this._rawData, "token", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("token"); + } + init { this._rawData.Set("token", value); } } public required ApiEnum ProviderKey { get { - return JsonModel.GetNotNullClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>( "provider_key" ); } - init { JsonModel.Set(this._rawData, "provider_key", value); } + init { this._rawData.Set("provider_key", value); } } /// @@ -38,8 +42,12 @@ public required ApiEnum ProviderKey /// public UserTokenDevice? Device { - get { return JsonModel.GetNullableClass(this.RawData, "device"); } - init { JsonModel.Set(this._rawData, "device", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("device"); + } + init { this._rawData.Set("device", value); } } /// @@ -48,8 +56,12 @@ public UserTokenDevice? Device /// public UserTokenExpiryDate? ExpiryDate { - get { return JsonModel.GetNullableClass(this.RawData, "expiry_date"); } - init { JsonModel.Set(this._rawData, "expiry_date", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("expiry_date"); + } + init { this._rawData.Set("expiry_date", value); } } /// @@ -57,7 +69,11 @@ public UserTokenExpiryDate? ExpiryDate /// public JsonElement? Properties { - get { return JsonModel.GetNullableStruct(this.RawData, "properties"); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("properties"); + } init { if (value == null) @@ -65,7 +81,7 @@ public JsonElement? Properties return; } - JsonModel.Set(this._rawData, "properties", value); + this._rawData.Set("properties", value); } } @@ -74,14 +90,22 @@ public JsonElement? Properties /// public UserTokenTracking? Tracking { - get { return JsonModel.GetNullableClass(this.RawData, "tracking"); } - init { JsonModel.Set(this._rawData, "tracking", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("tracking"); + } + init { this._rawData.Set("tracking", value); } } public ApiEnum? Status { - get { return JsonModel.GetNullableClass>(this.RawData, "status"); } - init { JsonModel.Set(this._rawData, "status", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("status"); + } + init { this._rawData.Set("status", value); } } /// @@ -89,8 +113,12 @@ public ApiEnum? Status /// public string? StatusReason { - get { return JsonModel.GetNullableClass(this.RawData, "status_reason"); } - init { JsonModel.Set(this._rawData, "status_reason", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("status_reason"); + } + init { this._rawData.Set("status_reason", value); } } public static implicit operator UserToken(TokenRetrieveResponse tokenRetrieveResponse) => @@ -124,14 +152,14 @@ public TokenRetrieveResponse(TokenRetrieveResponse tokenRetrieveResponse) public TokenRetrieveResponse(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] TokenRetrieveResponse(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -162,8 +190,12 @@ public sealed record class IntersectionMember1 : JsonModel { public ApiEnum? Status { - get { return JsonModel.GetNullableClass>(this.RawData, "status"); } - init { JsonModel.Set(this._rawData, "status", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("status"); + } + init { this._rawData.Set("status", value); } } /// @@ -171,8 +203,12 @@ public ApiEnum? Status /// public string? StatusReason { - get { return JsonModel.GetNullableClass(this.RawData, "status_reason"); } - init { JsonModel.Set(this._rawData, "status_reason", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("status_reason"); + } + init { this._rawData.Set("status_reason", value); } } /// @@ -191,14 +227,14 @@ public IntersectionMember1( public IntersectionMember1(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] IntersectionMember1(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Tokens/TokenUpdateParams.cs b/src/Courier/Models/Users/Tokens/TokenUpdateParams.cs index 5b726b9b..7506700e 100644 --- a/src/Courier/Models/Users/Tokens/TokenUpdateParams.cs +++ b/src/Courier/Models/Users/Tokens/TokenUpdateParams.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Frozen; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Net.Http; using System.Text; @@ -15,7 +16,7 @@ namespace Courier.Models.Users.Tokens; /// public sealed record class TokenUpdateParams : ParamsBase { - readonly FreezableDictionary _rawBodyData = []; + readonly JsonDictionary _rawBodyData = new(); public IReadOnlyDictionary RawBodyData { get { return this._rawBodyData.Freeze(); } @@ -27,8 +28,18 @@ public IReadOnlyDictionary RawBodyData public required IReadOnlyList Patch { - get { return JsonModel.GetNotNullClass>(this.RawBodyData, "patch"); } - init { JsonModel.Set(this._rawBodyData, "patch", value); } + get + { + this._rawBodyData.Freeze(); + return this._rawBodyData.GetNotNullStruct>("patch"); + } + init + { + this._rawBodyData.Set>( + "patch", + ImmutableArray.ToImmutableArray(value) + ); + } } public TokenUpdateParams() { } @@ -39,7 +50,7 @@ public TokenUpdateParams(TokenUpdateParams tokenUpdateParams) this.UserID = tokenUpdateParams.UserID; this.Token = tokenUpdateParams.Token; - this._rawBodyData = [.. tokenUpdateParams._rawBodyData]; + this._rawBodyData = new(tokenUpdateParams._rawBodyData); } public TokenUpdateParams( @@ -48,9 +59,9 @@ public TokenUpdateParams( IReadOnlyDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning disable CS8618 @@ -61,9 +72,9 @@ IReadOnlyDictionary rawBodyData FrozenDictionary rawBodyData ) { - this._rawHeaderData = [.. rawHeaderData]; - this._rawQueryData = [.. rawQueryData]; - this._rawBodyData = [.. rawBodyData]; + this._rawHeaderData = new(rawHeaderData); + this._rawQueryData = new(rawQueryData); + this._rawBodyData = new(rawBodyData); } #pragma warning restore CS8618 @@ -95,7 +106,7 @@ public override Uri Url(ClientOptions options) internal override HttpContent? BodyContent() { return new StringContent( - JsonSerializer.Serialize(this.RawBodyData), + JsonSerializer.Serialize(this.RawBodyData, ModelBase.SerializerOptions), Encoding.UTF8, "application/json" ); @@ -119,8 +130,12 @@ public sealed record class Patch : JsonModel /// public required string Op { - get { return JsonModel.GetNotNullClass(this.RawData, "op"); } - init { JsonModel.Set(this._rawData, "op", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("op"); + } + init { this._rawData.Set("op", value); } } /// @@ -128,8 +143,12 @@ public required string Op /// public required string Path { - get { return JsonModel.GetNotNullClass(this.RawData, "path"); } - init { JsonModel.Set(this._rawData, "path", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("path"); + } + init { this._rawData.Set("path", value); } } /// @@ -137,8 +156,12 @@ public required string Path /// public string? Value { - get { return JsonModel.GetNullableClass(this.RawData, "value"); } - init { JsonModel.Set(this._rawData, "value", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("value"); + } + init { this._rawData.Set("value", value); } } /// @@ -156,14 +179,14 @@ public Patch(Patch patch) public Patch(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Patch(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Users/Tokens/UserToken.cs b/src/Courier/Models/Users/Tokens/UserToken.cs index b86fefce..a192f89c 100644 --- a/src/Courier/Models/Users/Tokens/UserToken.cs +++ b/src/Courier/Models/Users/Tokens/UserToken.cs @@ -17,20 +17,24 @@ public sealed record class UserToken : JsonModel /// public required string Token { - get { return JsonModel.GetNotNullClass(this.RawData, "token"); } - init { JsonModel.Set(this._rawData, "token", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("token"); + } + init { this._rawData.Set("token", value); } } public required ApiEnum ProviderKey { get { - return JsonModel.GetNotNullClass>( - this.RawData, + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>( "provider_key" ); } - init { JsonModel.Set(this._rawData, "provider_key", value); } + init { this._rawData.Set("provider_key", value); } } /// @@ -38,8 +42,12 @@ public required ApiEnum ProviderKey /// public UserTokenDevice? Device { - get { return JsonModel.GetNullableClass(this.RawData, "device"); } - init { JsonModel.Set(this._rawData, "device", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("device"); + } + init { this._rawData.Set("device", value); } } /// @@ -48,8 +56,12 @@ public UserTokenDevice? Device /// public UserTokenExpiryDate? ExpiryDate { - get { return JsonModel.GetNullableClass(this.RawData, "expiry_date"); } - init { JsonModel.Set(this._rawData, "expiry_date", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("expiry_date"); + } + init { this._rawData.Set("expiry_date", value); } } /// @@ -57,7 +69,11 @@ public UserTokenExpiryDate? ExpiryDate /// public JsonElement? Properties { - get { return JsonModel.GetNullableStruct(this.RawData, "properties"); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableStruct("properties"); + } init { if (value == null) @@ -65,7 +81,7 @@ public JsonElement? Properties return; } - JsonModel.Set(this._rawData, "properties", value); + this._rawData.Set("properties", value); } } @@ -74,8 +90,12 @@ public JsonElement? Properties /// public UserTokenTracking? Tracking { - get { return JsonModel.GetNullableClass(this.RawData, "tracking"); } - init { JsonModel.Set(this._rawData, "tracking", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("tracking"); + } + init { this._rawData.Set("tracking", value); } } /// @@ -96,14 +116,14 @@ public UserToken(UserToken userToken) public UserToken(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] UserToken(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -182,8 +202,12 @@ public sealed record class UserTokenDevice : JsonModel /// public string? AdID { - get { return JsonModel.GetNullableClass(this.RawData, "ad_id"); } - init { JsonModel.Set(this._rawData, "ad_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("ad_id"); + } + init { this._rawData.Set("ad_id", value); } } /// @@ -191,8 +215,12 @@ public string? AdID /// public string? AppID { - get { return JsonModel.GetNullableClass(this.RawData, "app_id"); } - init { JsonModel.Set(this._rawData, "app_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("app_id"); + } + init { this._rawData.Set("app_id", value); } } /// @@ -200,8 +228,12 @@ public string? AppID /// public string? DeviceID { - get { return JsonModel.GetNullableClass(this.RawData, "device_id"); } - init { JsonModel.Set(this._rawData, "device_id", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("device_id"); + } + init { this._rawData.Set("device_id", value); } } /// @@ -209,8 +241,12 @@ public string? DeviceID /// public string? Manufacturer { - get { return JsonModel.GetNullableClass(this.RawData, "manufacturer"); } - init { JsonModel.Set(this._rawData, "manufacturer", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("manufacturer"); + } + init { this._rawData.Set("manufacturer", value); } } /// @@ -218,8 +254,12 @@ public string? Manufacturer /// public string? Model { - get { return JsonModel.GetNullableClass(this.RawData, "model"); } - init { JsonModel.Set(this._rawData, "model", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("model"); + } + init { this._rawData.Set("model", value); } } /// @@ -227,8 +267,12 @@ public string? Model /// public string? Platform { - get { return JsonModel.GetNullableClass(this.RawData, "platform"); } - init { JsonModel.Set(this._rawData, "platform", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("platform"); + } + init { this._rawData.Set("platform", value); } } /// @@ -249,14 +293,14 @@ public UserTokenDevice(UserTokenDevice userTokenDevice) public UserTokenDevice(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] UserTokenDevice(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 @@ -287,7 +331,13 @@ public record class UserTokenExpiryDate : ModelBase public JsonElement Json { - get { return this._element ??= JsonSerializer.SerializeToElement(this.Value); } + get + { + return this._element ??= JsonSerializer.SerializeToElement( + this.Value, + ModelBase.SerializerOptions + ); + } } public UserTokenExpiryDate(string value, JsonElement? element = null) @@ -512,8 +562,12 @@ public sealed record class UserTokenTracking : JsonModel /// public string? IP { - get { return JsonModel.GetNullableClass(this.RawData, "ip"); } - init { JsonModel.Set(this._rawData, "ip", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("ip"); + } + init { this._rawData.Set("ip", value); } } /// @@ -521,8 +575,12 @@ public string? IP /// public string? Lat { - get { return JsonModel.GetNullableClass(this.RawData, "lat"); } - init { JsonModel.Set(this._rawData, "lat", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("lat"); + } + init { this._rawData.Set("lat", value); } } /// @@ -530,8 +588,12 @@ public string? Lat /// public string? Long { - get { return JsonModel.GetNullableClass(this.RawData, "long"); } - init { JsonModel.Set(this._rawData, "long", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("long"); + } + init { this._rawData.Set("long", value); } } /// @@ -539,8 +601,12 @@ public string? Long /// public string? OsVersion { - get { return JsonModel.GetNullableClass(this.RawData, "os_version"); } - init { JsonModel.Set(this._rawData, "os_version", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("os_version"); + } + init { this._rawData.Set("os_version", value); } } /// @@ -559,14 +625,14 @@ public UserTokenTracking(UserTokenTracking userTokenTracking) public UserTokenTracking(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] UserTokenTracking(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/Utm.cs b/src/Courier/Models/Utm.cs index f27f7440..fb104e51 100644 --- a/src/Courier/Models/Utm.cs +++ b/src/Courier/Models/Utm.cs @@ -12,32 +12,52 @@ public sealed record class Utm : JsonModel { public string? Campaign { - get { return JsonModel.GetNullableClass(this.RawData, "campaign"); } - init { JsonModel.Set(this._rawData, "campaign", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("campaign"); + } + init { this._rawData.Set("campaign", value); } } public string? Content { - get { return JsonModel.GetNullableClass(this.RawData, "content"); } - init { JsonModel.Set(this._rawData, "content", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("content"); + } + init { this._rawData.Set("content", value); } } public string? Medium { - get { return JsonModel.GetNullableClass(this.RawData, "medium"); } - init { JsonModel.Set(this._rawData, "medium", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("medium"); + } + init { this._rawData.Set("medium", value); } } public string? Source { - get { return JsonModel.GetNullableClass(this.RawData, "source"); } - init { JsonModel.Set(this._rawData, "source", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("source"); + } + init { this._rawData.Set("source", value); } } public string? Term { - get { return JsonModel.GetNullableClass(this.RawData, "term"); } - init { JsonModel.Set(this._rawData, "term", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("term"); + } + init { this._rawData.Set("term", value); } } /// @@ -57,14 +77,14 @@ public Utm(Utm utm) public Utm(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] Utm(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/WebhookAuthentication.cs b/src/Courier/Models/WebhookAuthentication.cs index e5111125..087bec21 100644 --- a/src/Courier/Models/WebhookAuthentication.cs +++ b/src/Courier/Models/WebhookAuthentication.cs @@ -17,12 +17,10 @@ public required ApiEnum Mode { get { - return JsonModel.GetNotNullClass>( - this.RawData, - "mode" - ); + this._rawData.Freeze(); + return this._rawData.GetNotNullClass>("mode"); } - init { JsonModel.Set(this._rawData, "mode", value); } + init { this._rawData.Set("mode", value); } } /// @@ -30,8 +28,12 @@ public required ApiEnum Mode /// public string? Token { - get { return JsonModel.GetNullableClass(this.RawData, "token"); } - init { JsonModel.Set(this._rawData, "token", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("token"); + } + init { this._rawData.Set("token", value); } } /// @@ -39,8 +41,12 @@ public string? Token /// public string? Password { - get { return JsonModel.GetNullableClass(this.RawData, "password"); } - init { JsonModel.Set(this._rawData, "password", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("password"); + } + init { this._rawData.Set("password", value); } } /// @@ -48,8 +54,12 @@ public string? Password /// public string? Username { - get { return JsonModel.GetNullableClass(this.RawData, "username"); } - init { JsonModel.Set(this._rawData, "username", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNullableClass("username"); + } + init { this._rawData.Set("username", value); } } /// @@ -68,14 +78,14 @@ public WebhookAuthentication(WebhookAuthentication webhookAuthentication) public WebhookAuthentication(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] WebhookAuthentication(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/WebhookProfile.cs b/src/Courier/Models/WebhookProfile.cs index 1a60424b..a7dd895f 100644 --- a/src/Courier/Models/WebhookProfile.cs +++ b/src/Courier/Models/WebhookProfile.cs @@ -15,8 +15,12 @@ public sealed record class WebhookProfile : JsonModel /// public required string Url { - get { return JsonModel.GetNotNullClass(this.RawData, "url"); } - init { JsonModel.Set(this._rawData, "url", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("url"); + } + init { this._rawData.Set("url", value); } } /// @@ -26,12 +30,10 @@ public WebhookAuthentication? Authentication { get { - return JsonModel.GetNullableClass( - this.RawData, - "authentication" - ); + this._rawData.Freeze(); + return this._rawData.GetNullableClass("authentication"); } - init { JsonModel.Set(this._rawData, "authentication", value); } + init { this._rawData.Set("authentication", value); } } /// @@ -41,9 +43,16 @@ public IReadOnlyDictionary? Headers { get { - return JsonModel.GetNullableClass>(this.RawData, "headers"); + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("headers"); + } + init + { + this._rawData.Set?>( + "headers", + value == null ? null : FrozenDictionary.ToFrozenDictionary(value) + ); } - init { JsonModel.Set(this._rawData, "headers", value); } } /// @@ -53,12 +62,10 @@ public ApiEnum? Method { get { - return JsonModel.GetNullableClass>( - this.RawData, - "method" - ); + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("method"); } - init { JsonModel.Set(this._rawData, "method", value); } + init { this._rawData.Set("method", value); } } /// @@ -69,12 +76,10 @@ public ApiEnum? Profile { get { - return JsonModel.GetNullableClass>( - this.RawData, - "profile" - ); + this._rawData.Freeze(); + return this._rawData.GetNullableClass>("profile"); } - init { JsonModel.Set(this._rawData, "profile", value); } + init { this._rawData.Set("profile", value); } } /// @@ -94,14 +99,14 @@ public WebhookProfile(WebhookProfile webhookProfile) public WebhookProfile(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] WebhookProfile(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Models/WebhookRecipient.cs b/src/Courier/Models/WebhookRecipient.cs index 8d0ebfd6..4004dc41 100644 --- a/src/Courier/Models/WebhookRecipient.cs +++ b/src/Courier/Models/WebhookRecipient.cs @@ -15,8 +15,12 @@ public sealed record class WebhookRecipient : JsonModel { public required WebhookProfile Webhook { - get { return JsonModel.GetNotNullClass(this.RawData, "webhook"); } - init { JsonModel.Set(this._rawData, "webhook", value); } + get + { + this._rawData.Freeze(); + return this._rawData.GetNotNullClass("webhook"); + } + init { this._rawData.Set("webhook", value); } } /// @@ -32,14 +36,14 @@ public WebhookRecipient(WebhookRecipient webhookRecipient) public WebhookRecipient(IReadOnlyDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning disable CS8618 [SetsRequiredMembers] WebhookRecipient(FrozenDictionary rawData) { - this._rawData = [.. rawData]; + this._rawData = new(rawData); } #pragma warning restore CS8618 diff --git a/src/Courier/Services/AudienceService.cs b/src/Courier/Services/AudienceService.cs index a5735509..c917085e 100644 --- a/src/Courier/Services/AudienceService.cs +++ b/src/Courier/Services/AudienceService.cs @@ -95,15 +95,12 @@ public async Task List( } /// - public async Task Delete( + public Task Delete( AudienceDeleteParams parameters, CancellationToken cancellationToken = default ) { - using var response = await this - .WithRawResponse.Delete(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Delete(parameters, cancellationToken); } /// diff --git a/src/Courier/Services/BrandService.cs b/src/Courier/Services/BrandService.cs index 222668b4..aca8441e 100644 --- a/src/Courier/Services/BrandService.cs +++ b/src/Courier/Services/BrandService.cs @@ -105,15 +105,9 @@ public async Task List( } /// - public async Task Delete( - BrandDeleteParams parameters, - CancellationToken cancellationToken = default - ) + public Task Delete(BrandDeleteParams parameters, CancellationToken cancellationToken = default) { - using var response = await this - .WithRawResponse.Delete(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Delete(parameters, cancellationToken); } /// diff --git a/src/Courier/Services/BulkService.cs b/src/Courier/Services/BulkService.cs index 466abac4..22d8f4ef 100644 --- a/src/Courier/Services/BulkService.cs +++ b/src/Courier/Services/BulkService.cs @@ -35,15 +35,12 @@ public BulkService(ICourierClient client) } /// - public async Task AddUsers( + public Task AddUsers( BulkAddUsersParams parameters, CancellationToken cancellationToken = default ) { - using var response = await this - .WithRawResponse.AddUsers(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.AddUsers(parameters, cancellationToken); } /// @@ -118,15 +115,9 @@ public Task RetrieveJob( } /// - public async Task RunJob( - BulkRunJobParams parameters, - CancellationToken cancellationToken = default - ) + public Task RunJob(BulkRunJobParams parameters, CancellationToken cancellationToken = default) { - using var response = await this - .WithRawResponse.RunJob(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.RunJob(parameters, cancellationToken); } /// diff --git a/src/Courier/Services/ListService.cs b/src/Courier/Services/ListService.cs index 17756246..c8a188b1 100644 --- a/src/Courier/Services/ListService.cs +++ b/src/Courier/Services/ListService.cs @@ -67,15 +67,9 @@ public Task Retrieve( } /// - public async Task Update( - ListUpdateParams parameters, - CancellationToken cancellationToken = default - ) + public Task Update(ListUpdateParams parameters, CancellationToken cancellationToken = default) { - using var response = await this - .WithRawResponse.Update(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Update(parameters, cancellationToken); } /// @@ -102,15 +96,9 @@ public async Task List( } /// - public async Task Delete( - ListDeleteParams parameters, - CancellationToken cancellationToken = default - ) + public Task Delete(ListDeleteParams parameters, CancellationToken cancellationToken = default) { - using var response = await this - .WithRawResponse.Delete(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Delete(parameters, cancellationToken); } /// @@ -127,15 +115,9 @@ await this.Delete(parameters with { ListID = listID }, cancellationToken) } /// - public async Task Restore( - ListRestoreParams parameters, - CancellationToken cancellationToken = default - ) + public Task Restore(ListRestoreParams parameters, CancellationToken cancellationToken = default) { - using var response = await this - .WithRawResponse.Restore(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Restore(parameters, cancellationToken); } /// diff --git a/src/Courier/Services/Lists/SubscriptionService.cs b/src/Courier/Services/Lists/SubscriptionService.cs index f9928b89..77294801 100644 --- a/src/Courier/Services/Lists/SubscriptionService.cs +++ b/src/Courier/Services/Lists/SubscriptionService.cs @@ -61,15 +61,9 @@ public Task List( } /// - public async Task Add( - SubscriptionAddParams parameters, - CancellationToken cancellationToken = default - ) + public Task Add(SubscriptionAddParams parameters, CancellationToken cancellationToken = default) { - using var response = await this - .WithRawResponse.Add(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Add(parameters, cancellationToken); } /// @@ -84,15 +78,12 @@ await this.Add(parameters with { ListID = listID }, cancellationToken) } /// - public async Task Subscribe( + public Task Subscribe( SubscriptionSubscribeParams parameters, CancellationToken cancellationToken = default ) { - using var response = await this - .WithRawResponse.Subscribe(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Subscribe(parameters, cancellationToken); } /// @@ -107,15 +98,12 @@ await this.Subscribe(parameters with { ListID = listID }, cancellationToken) } /// - public async Task SubscribeUser( + public Task SubscribeUser( SubscriptionSubscribeUserParams parameters, CancellationToken cancellationToken = default ) { - using var response = await this - .WithRawResponse.SubscribeUser(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.SubscribeUser(parameters, cancellationToken); } /// @@ -130,15 +118,12 @@ await this.SubscribeUser(parameters with { UserID = userID }, cancellationToken) } /// - public async Task UnsubscribeUser( + public Task UnsubscribeUser( SubscriptionUnsubscribeUserParams parameters, CancellationToken cancellationToken = default ) { - using var response = await this - .WithRawResponse.UnsubscribeUser(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.UnsubscribeUser(parameters, cancellationToken); } /// diff --git a/src/Courier/Services/Notifications/CheckService.cs b/src/Courier/Services/Notifications/CheckService.cs index 89304d4d..4a3fc7cc 100644 --- a/src/Courier/Services/Notifications/CheckService.cs +++ b/src/Courier/Services/Notifications/CheckService.cs @@ -79,15 +79,9 @@ public Task List( } /// - public async Task Delete( - CheckDeleteParams parameters, - CancellationToken cancellationToken = default - ) + public Task Delete(CheckDeleteParams parameters, CancellationToken cancellationToken = default) { - using var response = await this - .WithRawResponse.Delete(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Delete(parameters, cancellationToken); } /// diff --git a/src/Courier/Services/ProfileService.cs b/src/Courier/Services/ProfileService.cs index 9a37a37b..61e1e1ce 100644 --- a/src/Courier/Services/ProfileService.cs +++ b/src/Courier/Services/ProfileService.cs @@ -89,15 +89,12 @@ public Task Retrieve( } /// - public async Task Update( + public Task Update( ProfileUpdateParams parameters, CancellationToken cancellationToken = default ) { - using var response = await this - .WithRawResponse.Update(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Update(parameters, cancellationToken); } /// @@ -112,15 +109,12 @@ await this.Update(parameters with { UserID = userID }, cancellationToken) } /// - public async Task Delete( + public Task Delete( ProfileDeleteParams parameters, CancellationToken cancellationToken = default ) { - using var response = await this - .WithRawResponse.Delete(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Delete(parameters, cancellationToken); } /// @@ -284,7 +278,7 @@ public Task Update( HttpRequest request = new() { - Method = CourierClient.PatchMethod, + Method = CourierClientWithRawResponse.PatchMethod, Params = parameters, }; return this._client.Execute(request, cancellationToken); diff --git a/src/Courier/Services/RequestService.cs b/src/Courier/Services/RequestService.cs index 8d4be37a..c5cc5eca 100644 --- a/src/Courier/Services/RequestService.cs +++ b/src/Courier/Services/RequestService.cs @@ -35,15 +35,12 @@ public RequestService(ICourierClient client) } /// - public async Task Archive( + public Task Archive( RequestArchiveParams parameters, CancellationToken cancellationToken = default ) { - using var response = await this - .WithRawResponse.Archive(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Archive(parameters, cancellationToken); } /// diff --git a/src/Courier/Services/TenantService.cs b/src/Courier/Services/TenantService.cs index 0bb931ae..9f7fc226 100644 --- a/src/Courier/Services/TenantService.cs +++ b/src/Courier/Services/TenantService.cs @@ -108,15 +108,9 @@ public async Task List( } /// - public async Task Delete( - TenantDeleteParams parameters, - CancellationToken cancellationToken = default - ) + public Task Delete(TenantDeleteParams parameters, CancellationToken cancellationToken = default) { - using var response = await this - .WithRawResponse.Delete(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Delete(parameters, cancellationToken); } /// diff --git a/src/Courier/Services/Tenants/Preferences/ItemService.cs b/src/Courier/Services/Tenants/Preferences/ItemService.cs index ee17a0cd..9e93aa58 100644 --- a/src/Courier/Services/Tenants/Preferences/ItemService.cs +++ b/src/Courier/Services/Tenants/Preferences/ItemService.cs @@ -35,15 +35,9 @@ public ItemService(ICourierClient client) } /// - public async Task Update( - ItemUpdateParams parameters, - CancellationToken cancellationToken = default - ) + public Task Update(ItemUpdateParams parameters, CancellationToken cancellationToken = default) { - using var response = await this - .WithRawResponse.Update(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Update(parameters, cancellationToken); } /// @@ -58,15 +52,9 @@ await this.Update(parameters with { TopicID = topicID }, cancellationToken) } /// - public async Task Delete( - ItemDeleteParams parameters, - CancellationToken cancellationToken = default - ) + public Task Delete(ItemDeleteParams parameters, CancellationToken cancellationToken = default) { - using var response = await this - .WithRawResponse.Delete(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Delete(parameters, cancellationToken); } /// diff --git a/src/Courier/Services/TranslationService.cs b/src/Courier/Services/TranslationService.cs index 68b42828..85dad8a5 100644 --- a/src/Courier/Services/TranslationService.cs +++ b/src/Courier/Services/TranslationService.cs @@ -57,15 +57,12 @@ public Task Retrieve( } /// - public async Task Update( + public Task Update( TranslationUpdateParams parameters, CancellationToken cancellationToken = default ) { - using var response = await this - .WithRawResponse.Update(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Update(parameters, cancellationToken); } /// diff --git a/src/Courier/Services/Users/TenantService.cs b/src/Courier/Services/Users/TenantService.cs index 82d48fc6..de4bdc42 100644 --- a/src/Courier/Services/Users/TenantService.cs +++ b/src/Courier/Services/Users/TenantService.cs @@ -63,15 +63,12 @@ public Task List( } /// - public async Task AddMultiple( + public Task AddMultiple( TenantAddMultipleParams parameters, CancellationToken cancellationToken = default ) { - using var response = await this - .WithRawResponse.AddMultiple(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.AddMultiple(parameters, cancellationToken); } /// @@ -86,15 +83,12 @@ await this.AddMultiple(parameters with { UserID = userID }, cancellationToken) } /// - public async Task AddSingle( + public Task AddSingle( TenantAddSingleParams parameters, CancellationToken cancellationToken = default ) { - using var response = await this - .WithRawResponse.AddSingle(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.AddSingle(parameters, cancellationToken); } /// @@ -109,15 +103,12 @@ await this.AddSingle(parameters with { TenantID = tenantID }, cancellationToken) } /// - public async Task RemoveAll( + public Task RemoveAll( TenantRemoveAllParams parameters, CancellationToken cancellationToken = default ) { - using var response = await this - .WithRawResponse.RemoveAll(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.RemoveAll(parameters, cancellationToken); } /// @@ -134,15 +125,12 @@ await this.RemoveAll(parameters with { UserID = userID }, cancellationToken) } /// - public async Task RemoveSingle( + public Task RemoveSingle( TenantRemoveSingleParams parameters, CancellationToken cancellationToken = default ) { - using var response = await this - .WithRawResponse.RemoveSingle(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.RemoveSingle(parameters, cancellationToken); } /// diff --git a/src/Courier/Services/Users/TokenService.cs b/src/Courier/Services/Users/TokenService.cs index 02fb795d..c7fcfecd 100644 --- a/src/Courier/Services/Users/TokenService.cs +++ b/src/Courier/Services/Users/TokenService.cs @@ -57,15 +57,9 @@ public Task Retrieve( } /// - public async Task Update( - TokenUpdateParams parameters, - CancellationToken cancellationToken = default - ) + public Task Update(TokenUpdateParams parameters, CancellationToken cancellationToken = default) { - using var response = await this - .WithRawResponse.Update(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Update(parameters, cancellationToken); } /// @@ -104,15 +98,9 @@ public Task List( } /// - public async Task Delete( - TokenDeleteParams parameters, - CancellationToken cancellationToken = default - ) + public Task Delete(TokenDeleteParams parameters, CancellationToken cancellationToken = default) { - using var response = await this - .WithRawResponse.Delete(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.Delete(parameters, cancellationToken); } /// @@ -127,15 +115,12 @@ await this.Delete(parameters with { Token = token }, cancellationToken) } /// - public async Task AddMultiple( + public Task AddMultiple( TokenAddMultipleParams parameters, CancellationToken cancellationToken = default ) { - using var response = await this - .WithRawResponse.AddMultiple(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.AddMultiple(parameters, cancellationToken); } /// @@ -152,15 +137,12 @@ await this.AddMultiple(parameters with { UserID = userID }, cancellationToken) } /// - public async Task AddSingle( + public Task AddSingle( TokenAddSingleParams parameters, CancellationToken cancellationToken = default ) { - using var response = await this - .WithRawResponse.AddSingle(parameters, cancellationToken) - .ConfigureAwait(false); - return await response.Deserialize(cancellationToken).ConfigureAwait(false); + return this.WithRawResponse.AddSingle(parameters, cancellationToken); } /// @@ -247,7 +229,7 @@ public Task Update( HttpRequest request = new() { - Method = CourierClient.PatchMethod, + Method = CourierClientWithRawResponse.PatchMethod, Params = parameters, }; return this._client.Execute(request, cancellationToken); diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 6540a8f0..047a7d66 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -4,7 +4,7 @@ Courier sdk;api;http;library Apache-2.0 - Copyright 2025 Courier + Copyright 2026 Courier https://www.courier.com/docs https://www.github.com/trycourier/courier-csharp git