Skip to content

Commit b537ee4

Browse files
authored
add case to support proxying a different type (Azure#49515)
1 parent c9e5df9 commit b537ee4

File tree

7 files changed

+55
-7
lines changed

7 files changed

+55
-7
lines changed

sdk/core/System.ClientModel/src/ModelReaderWriter/ModelReaderWriter.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,11 @@ private static BinaryData WritePersistableOrEnumerable<T>(T model, ModelReaderWr
123123
{
124124
return WritePersistable(iModel, options);
125125
}
126+
else if (model is IPersistableModel<object> objModel)
127+
{
128+
//used for the class proxy case since the proxy does not need to implement reading and writing for itself
129+
return WritePersistable(objModel, options);
130+
}
126131
else
127132
{
128133
var enumerable = model as IEnumerable ?? context.GetTypeBuilder(model!.GetType()).ToEnumerable(model);

sdk/core/System.ClientModel/tests/ModelReaderWriterTests/Models/BaseModelTests.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33

44
using NUnit.Framework;
55
using System.Linq;
6+
#if SOURCE_GENERATOR
7+
using System.ClientModel.SourceGeneration.Tests;
8+
#else
69
using System.ClientModel.Tests.Client.ModelReaderWriterTests.Models;
10+
#endif
711
using System.ClientModel.Primitives;
812

913
namespace System.ClientModel.Tests.ModelReaderWriterTests.Models
@@ -20,7 +24,11 @@ protected override BaseModel GetModelInstance()
2024

2125
protected override string WirePayload => "{\"kind\":\"X\",\"name\":\"xmodel\",\"xProperty\":100,\"extra\":\"stuff\"}";
2226

23-
protected override ModelReaderWriterContext Context => new TestClientModelReaderWriterContext();
27+
#if SOURCE_GENERATOR
28+
protected override ModelReaderWriterContext Context => BasicContext.Default;
29+
#else
30+
protected override ModelReaderWriterContext Context => TestClientModelReaderWriterContext.Default;
31+
#endif
2432

2533
protected override void CompareModels(BaseModel model, BaseModel model2, string format)
2634
{

sdk/core/System.ClientModel/tests/ModelReaderWriterTests/Models/UnknownBaseModelTests.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33

44
using NUnit.Framework;
55
using System.Linq;
6+
#if SOURCE_GENERATOR
7+
using System.ClientModel.SourceGeneration.Tests;
8+
#else
69
using System.ClientModel.Tests.Client.ModelReaderWriterTests.Models;
10+
#endif
711
using System.ClientModel.Primitives;
812

913
namespace System.ClientModel.Tests.ModelReaderWriterTests.Models
@@ -20,7 +24,11 @@ protected override BaseModel GetModelInstance()
2024

2125
protected override string WirePayload => "{\"kind\":\"Z\",\"name\":\"zmodel\",\"zProperty\":1.5,\"extra\":\"stuff\"}";
2226

27+
#if SOURCE_GENERATOR
28+
protected override ModelReaderWriterContext Context => BasicContext.Default;
29+
#else
2330
protected override ModelReaderWriterContext Context => new TestClientModelReaderWriterContext();
31+
#endif
2432

2533
protected override void CompareModels(BaseModel model, BaseModel model2, string format)
2634
{

sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelX.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
33

4-
using ClientModel.Tests.ClientShared;
54
using System.ClientModel.Primitives;
5+
#if !SOURCE_GENERATOR
6+
using System.ClientModel.Tests.ModelReaderWriterTests;
7+
#endif
68
using System.Collections.Generic;
79
using System.Linq;
810
using System.Text.Json;
11+
using ClientModel.Tests.ClientShared;
912

1013
#if SOURCE_GENERATOR
1114
namespace System.ClientModel.SourceGeneration.Tests
@@ -206,9 +209,19 @@ ModelX IJsonModel<ModelX>.Create(ref Utf8JsonReader reader, ModelReaderWriterOpt
206209

207210
BinaryData IPersistableModel<ModelX>.Write(ModelReaderWriterOptions options)
208211
{
209-
ModelReaderWriterHelper.ValidateFormat(this, options.Format);
212+
var format = options.Format == "W" ? ((IPersistableModel<ModelX>)this).GetFormatFromOptions(options) : options.Format;
210213

211-
return ModelReaderWriter.Write(this, options);
214+
switch (format)
215+
{
216+
case "J":
217+
#if SOURCE_GENERATOR
218+
return ModelReaderWriter.Write(this, options, BasicContext.Default);
219+
#else
220+
return ModelReaderWriter.Write(this, options, TestClientModelReaderWriterContext.Default);
221+
#endif
222+
default:
223+
throw new FormatException($"The model {nameof(ModelX)} does not support writing '{options.Format}' format.");
224+
}
212225
}
213226

214227
string IPersistableModel<ModelX>.GetFormatFromOptions(ModelReaderWriterOptions options) => "J";

sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/UnknownBaseModel.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,19 @@ BaseModel IJsonModel<BaseModel>.Create(ref Utf8JsonReader reader, ModelReaderWri
7070

7171
BinaryData IPersistableModel<BaseModel>.Write(ModelReaderWriterOptions options)
7272
{
73-
ModelReaderWriterHelper.ValidateFormat(this, options.Format);
73+
var format = options.Format == "W" ? ((IPersistableModel<BaseModel>)this).GetFormatFromOptions(options) : options.Format;
7474

75-
return ModelReaderWriter.Write(this, options);
75+
switch (format)
76+
{
77+
case "J":
78+
# if SOURCE_GENERATOR
79+
return ModelReaderWriter.Write(this, options, BasicContext.Default);
80+
#else
81+
return ModelReaderWriter.Write(this, options);
82+
#endif
83+
default:
84+
throw new FormatException($"The model {nameof(BaseModel)} does not support writing '{options.Format}' format.");
85+
}
7686
}
7787
}
7888
}

sdk/core/System.ClientModel/tests/client/ModelReaderWriter/TestClientModelReaderWriterContext.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
using System.ClientModel.Tests.Client.ModelReaderWriterTests.Models;
66
using System.ClientModel.Tests.Client.Models.ResourceManager.Compute;
77
using System.ClientModel.Tests.Client.Models.ResourceManager.Resources;
8-
using System.Diagnostics.CodeAnalysis;
98

109
namespace System.ClientModel.Tests.ModelReaderWriterTests
1110
{
1211
public class TestClientModelReaderWriterContext : ModelReaderWriterContext
1312
{
13+
private static TestClientModelReaderWriterContext? _default;
14+
public static TestClientModelReaderWriterContext Default => _default ??= new TestClientModelReaderWriterContext();
15+
1416
private AvailabilitySetData_Builder? _availabilitySetData_Builder;
1517
private BaseModel_Builder? _baseModel_Builder;
1618
private ModelAsStruct_Builder? _modelAsStruct_Builder;

sdk/core/System.ClientModel/tests/gen/System.ClientModel.SourceGeneration.Tests.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
<Compile Include="..\ModelReaderWriterTests\Models\AvailabilitySetDataTests.cs" LinkBase="SharedTests" />
3838
<Compile Include="..\ModelReaderWriterTests\Models\BaseModels\ListTests.cs" LinkBase="SharedTests\BaseModels" />
3939
<Compile Include="..\ModelReaderWriterTests\Models\BaseModels\ModelInstances.cs" LinkBase="SharedTests\BaseModels" />
40+
<Compile Include="..\ModelReaderWriterTests\Models\BaseModelTests.cs" LinkBase="SharedTests\BaseModels" />
41+
<Compile Include="..\ModelReaderWriterTests\Models\UnknownBaseModelTests.cs" LinkBase="SharedTests\BaseModels" />
4042
<Compile Include="..\ModelReaderWriterTests\Models\ModelJsonTests.cs" LinkBase="SharedTests" />
4143
<Compile Include="..\ModelReaderWriterTests\MrwModelTests.cs" LinkBase="SharedTests" />
4244
<Compile Include="..\ModelReaderWriterTests\MrwCollectionTests.cs" LinkBase="SharedTests" />

0 commit comments

Comments
 (0)