From 08dc5fd5e54c16d36ec8ad5a02fe091701b3e52f Mon Sep 17 00:00:00 2001 From: m-nash <64171366+m-nash@users.noreply.github.com> Date: Thu, 27 Jun 2024 16:12:28 -0700 Subject: [PATCH] wip to refactor methodprovidercollection (#3686) contributes to https://github.com/microsoft/typespec/issues/3213 --- .../src/OutputTypes/ScmTypeFactory.cs | 32 +- .../Providers/ScmMethodProviderCollection.cs | 96 +++++ .../test/Mocks/MockTypeFactory.cs | 2 +- .../test/Mocks/MockTypeProvider.cs | 14 + .../ScmMethodProviderCollectionTests.cs} | 21 +- .../src/Configuration.cs | 9 + .../InvokeStaticPropertyExpression.cs | 25 ++ .../src/OutputTypes/CSharpType.cs | 11 + .../src/OutputTypes/TypeFactory.cs | 2 +- .../src/Providers/MethodProviderCollection.cs | 51 +-- .../test/Mocks/MockTypeFactory.cs | 2 +- .../test/OutputTypes/TypeFactoryTests.cs | 2 +- .../src/Generated/UnbrandedTypeSpecClient.cs | 348 ++++++++++++++++++ 13 files changed, 532 insertions(+), 83 deletions(-) create mode 100644 packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/src/Providers/ScmMethodProviderCollection.cs create mode 100644 packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/test/Mocks/MockTypeProvider.cs rename packages/http-client-csharp/generator/{Microsoft.Generator.CSharp/test/Providers/MethodProviderCollectionTests.cs => Microsoft.Generator.CSharp.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs} (83%) create mode 100644 packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/InvokeStaticPropertyExpression.cs diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/src/OutputTypes/ScmTypeFactory.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/src/OutputTypes/ScmTypeFactory.cs index 87f0123df1..65a0de09ec 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/src/OutputTypes/ScmTypeFactory.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/src/OutputTypes/ScmTypeFactory.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.Generator.CSharp.ClientModel.Providers; using Microsoft.Generator.CSharp.Input; using Microsoft.Generator.CSharp.Providers; @@ -18,36 +19,7 @@ public class ScmTypeFactory : TypeFactory /// /// The input operation to create methods for. /// The enclosing type of the operation. - public override MethodProviderCollection? CreateMethodProviders(InputOperation operation, TypeProvider enclosingType) - { - if (_operations.TryGetValue(operation, out var methods)) - { - return methods; - } - - methods = GetOperationKind(operation).ToString() switch - { - "Default" => MethodProviderCollection.DefaultCSharpMethodCollection(operation, enclosingType), - _ => null, - }; - - _operations.Add(operation, methods); - return methods; - } - - /// - /// Returns the of the given operation. - /// By default, the operation kind is . - /// - private static InputOperationKinds GetOperationKind(InputOperation operation) - { - return operation switch - { - { LongRunning: { } } => InputOperationKinds.LongRunning, - { Paging: { } } => InputOperationKinds.Paging, - _ => InputOperationKinds.Default, - }; - } + public override MethodProviderCollection CreateMethodProviders(InputOperation operation, TypeProvider enclosingType) => new ScmMethodProviderCollection(operation, enclosingType); public virtual CSharpType MatchConditionsType() { diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/src/Providers/ScmMethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/src/Providers/ScmMethodProviderCollection.cs new file mode 100644 index 0000000000..059fd29fcc --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/src/Providers/ScmMethodProviderCollection.cs @@ -0,0 +1,96 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using Microsoft.Generator.CSharp.Expressions; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Generator.CSharp.Input; +using Microsoft.Generator.CSharp.Providers; +using Microsoft.Generator.CSharp.Statements; +using static Microsoft.Generator.CSharp.Snippets.Snippet; +using Microsoft.Generator.CSharp.Snippets; + +namespace Microsoft.Generator.CSharp.ClientModel.Providers +{ + internal class ScmMethodProviderCollection : MethodProviderCollection + { + public ScmMethodProviderCollection(InputOperation operation, TypeProvider enclosingType) + : base(operation, enclosingType) + { + } + + protected override IReadOnlyList BuildMethods() + { + return + [ + // TO-DO: Add Protocol and Convenience methods https://github.com/Azure/autorest.csharp/issues/4585, https://github.com/Azure/autorest.csharp/issues/4586 + BuildCreateMessageMethod(_operation, _enclosingType), + BuildProtocolMethod(_operation, _enclosingType, false), + BuildProtocolMethod(_operation, _enclosingType, true) + ]; + } + private static MethodProvider BuildProtocolMethod(InputOperation operation, TypeProvider enclosingType, bool isAsync) + { + List methodParameters = new(); + foreach (InputParameter inputParam in operation.Parameters) + { + if (inputParam.Kind != InputOperationParameterKind.Method) + continue; + methodParameters.Add(ClientModelPlugin.Instance.TypeFactory.CreateCSharpParam(inputParam)); + } + + var methodModifier = MethodSignatureModifiers.Public | MethodSignatureModifiers.Virtual; + if (isAsync) + { + methodModifier |= MethodSignatureModifiers.Async; + } + var opName = operation.Name.ToCleanName(); + var methodSignature = new MethodSignature( + isAsync ? opName + "Async" : opName, + FormattableStringHelpers.FromString(operation.Description), + methodModifier, + GetResponseType(operation.Responses, isAsync), + null, + Parameters: [.. methodParameters, KnownParameters.CancellationTokenParameter]); + MethodBodyStatement[] methodBody = + [ + //UsingDeclare("message", typeof(RequestMess) + //using PipelineMessage message = CreateSayHiRequest(headParameter, queryParameter, optionalQuery, options); + isAsync ? new InvokeStaticPropertyExpression(typeof(Task), nameof(Task.CompletedTask), true).Terminate() : EmptyStatement + ]; + + return new MethodProvider(methodSignature, methodBody, enclosingType); + } + + private static CSharpType? GetResponseType(IReadOnlyList responses, bool isAsync) + { + var response = responses.FirstOrDefault(r => !r.IsErrorResponse); + if (response is null || response.BodyType is null) + return null; + var returnType = ClientModelPlugin.Instance.TypeFactory.CreateCSharpType(response.BodyType); + if (isAsync) + { + returnType = returnType.WrapInTask(); + } + return returnType; + } + + private static MethodProvider BuildCreateMessageMethod(InputOperation operation, TypeProvider enclosingType) + { + // TO-DO: properly build method https://github.com/Azure/autorest.csharp/issues/4583 + List methodParameters = new(); + foreach (var inputParam in operation.Parameters) + { + methodParameters.Add(ClientModelPlugin.Instance.TypeFactory.CreateCSharpParam(inputParam)); + } + + var methodModifier = MethodSignatureModifiers.Internal; + var methodSignatureName = $"Create{operation.Name.ToCleanName()}Request"; + var methodSignature = new MethodSignature(methodSignatureName, FormattableStringHelpers.FromString(operation.Description), methodModifier, null, null, Parameters: methodParameters); + var methodBody = Throw(New.NotImplementedException(Literal("Method not implemented."))); + + return new MethodProvider(methodSignature, methodBody, enclosingType); + } + } +} diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/test/Mocks/MockTypeFactory.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/test/Mocks/MockTypeFactory.cs index 3c94e672eb..84a6e9374b 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/test/Mocks/MockTypeFactory.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/test/Mocks/MockTypeFactory.cs @@ -10,7 +10,7 @@ namespace Microsoft.Generator.CSharp.ClientModel.Tests { internal class MockTypeFactory : ScmTypeFactory { - public override MethodProviderCollection? CreateMethodProviders(InputOperation operation, TypeProvider enclosingType) + public override MethodProviderCollection CreateMethodProviders(InputOperation operation, TypeProvider enclosingType) { throw new NotImplementedException(); } diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/test/Mocks/MockTypeProvider.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/test/Mocks/MockTypeProvider.cs new file mode 100644 index 0000000000..93fdd332fa --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/test/Mocks/MockTypeProvider.cs @@ -0,0 +1,14 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using Microsoft.Generator.CSharp.Providers; + +namespace Microsoft.Generator.CSharp.ClientModel.Tests +{ + internal class MockTypeProvider : TypeProvider + { + public override string RelativeFilePath => throw new NotImplementedException(); + public override string Name => throw new NotImplementedException(); + } +} diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Providers/MethodProviderCollectionTests.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs similarity index 83% rename from packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Providers/MethodProviderCollectionTests.cs rename to packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs index f9699a67e1..d535ec641d 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Providers/MethodProviderCollectionTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs @@ -5,18 +5,19 @@ using System.Collections.Generic; using System.IO; using System.Reflection; +using Microsoft.Generator.CSharp.ClientModel.Providers; using Microsoft.Generator.CSharp.Input; using Microsoft.Generator.CSharp.Providers; using Moq; using Moq.Protected; using NUnit.Framework; -namespace Microsoft.Generator.CSharp.Tests.Providers +namespace Microsoft.Generator.CSharp.ClientModel.Tests.Providers { - internal class MethodProviderCollectionTests + internal class ScmMethodProviderCollectionTests { #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. - private TypeFactory _typeFactory; + private ScmTypeFactory _typeFactory; #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. private readonly string _mocksFolder = "Mocks"; private FieldInfo? _mockPlugin; @@ -25,16 +26,17 @@ internal class MethodProviderCollectionTests public void Setup() { var mockParameter = new ParameterProvider("mockParam", $"mock description", typeof(bool), null); - var mockTypeFactory = new Mock() { }; + var mockTypeFactory = new Mock() { }; mockTypeFactory.Protected().Setup("CreateCSharpTypeCore", ItExpr.IsAny()).Returns(new CSharpType(typeof(bool))); mockTypeFactory.Setup(t => t.CreateCSharpParam(It.IsAny())).Returns(mockParameter); _typeFactory = mockTypeFactory.Object; var configFilePath = Path.Combine(AppContext.BaseDirectory, _mocksFolder); // initialize the mock singleton instance of the plugin - _mockPlugin = typeof(CodeModelPlugin).GetField("_instance", BindingFlags.Static | BindingFlags.NonPublic); - var mockGeneratorContext = new Mock(Configuration.Load(configFilePath)); - var mockPluginInstance = new Mock(mockGeneratorContext.Object) { }; + _mockPlugin = typeof(ClientModelPlugin).GetField("_instance", BindingFlags.Static | BindingFlags.NonPublic); + var mockConfiguration = new Mock() { }; + var mockGeneratorContext = new Mock(mockConfiguration.Object); + var mockPluginInstance = new Mock(mockGeneratorContext.Object) { }; mockPluginInstance.SetupGet(p => p.TypeFactory).Returns(_typeFactory); _mockPlugin?.SetValue(null, mockPluginInstance.Object); @@ -50,9 +52,9 @@ public void Teardown() [TestCaseSource(nameof(DefaultCSharpMethodCollectionTestCases))] public void TestDefaultCSharpMethodCollection(InputOperation inputOperation) { - var methodCollection = MethodProviderCollection.DefaultCSharpMethodCollection(inputOperation, new MockTypeProvider()); + var methodCollection = new ScmMethodProviderCollection(inputOperation, new MockTypeProvider()); Assert.IsNotNull(methodCollection); - Assert.AreEqual(1, methodCollection?.Count); + Assert.AreEqual(3, methodCollection.Count); var method = methodCollection![0]; var signature = method.Signature; @@ -93,5 +95,4 @@ public static IEnumerable DefaultCSharpMethodCollectionTestCases } } } - } diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Configuration.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Configuration.cs index f37483a489..284c495a39 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Configuration.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Configuration.cs @@ -15,6 +15,15 @@ public class Configuration { private const string ConfigurationFileName = "Configuration.json"; + // for mocking + protected Configuration() + { + OutputDirectory = null!; + AdditionalConfigOptions = null!; + LibraryName = null!; + Namespace = null!; + } + private Configuration( string outputPath, Dictionary additionalConfigOptions, diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/InvokeStaticPropertyExpression.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/InvokeStaticPropertyExpression.cs new file mode 100644 index 0000000000..e43ad47f54 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/InvokeStaticPropertyExpression.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Microsoft.Generator.CSharp.Statements; + +namespace Microsoft.Generator.CSharp.Expressions +{ + public sealed record InvokeStaticPropertyExpression(CSharpType? ContainingType, string PropertyName, bool CallAsAsync = false) : ValueExpression + { + internal override void Write(CodeWriter writer) + { + writer.AppendRawIf("await ", CallAsAsync); + if (ContainingType != null) + { + writer.Append($"{ContainingType}."); + } + + writer.AppendRaw(PropertyName); + writer.AppendRawIf(".ConfigureAwait(false)", CallAsAsync); + } + + private MethodBodyStatement? _terminated; + public MethodBodyStatement Terminate() => _terminated ??= new ExpressionStatement(this); + } +} diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/OutputTypes/CSharpType.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/OutputTypes/CSharpType.cs index 532191f4a1..d61a0e3cd2 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/OutputTypes/CSharpType.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/OutputTypes/CSharpType.cs @@ -7,6 +7,7 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Linq; +using System.Threading.Tasks; using Microsoft.Generator.CSharp.Providers; namespace Microsoft.Generator.CSharp @@ -608,5 +609,15 @@ public CSharpType MakeGenericType(IReadOnlyList arguments) return new CSharpType(Implementation, arguments, IsNullable); } } + + public CSharpType WrapInTask() + { + if (IsFrameworkType && FrameworkType == typeof(Task<>)) + { + return this; + } + + return new CSharpType(typeof(Task<>), this); + } } } diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/OutputTypes/TypeFactory.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/OutputTypes/TypeFactory.cs index d567e232a1..768d863d02 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/OutputTypes/TypeFactory.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/OutputTypes/TypeFactory.cs @@ -94,7 +94,7 @@ public CSharpType CreateCSharpType(InputType inputType) /// An instance of containing the chain of methods /// associated with the input operation, or null if no methods are constructed. /// - public abstract MethodProviderCollection? CreateMethodProviders(InputOperation operation, TypeProvider enclosingType); + public virtual MethodProviderCollection CreateMethodProviders(InputOperation operation, TypeProvider enclosingType) => new(operation, enclosingType); /// /// Factory method for retrieving the serialization format for a given input type. diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/MethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/MethodProviderCollection.cs index f90faf97ad..21c6f9b43a 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/MethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/MethodProviderCollection.cs @@ -3,68 +3,41 @@ using System.Collections; using System.Collections.Generic; -using System.Linq; using Microsoft.Generator.CSharp.Input; -using Microsoft.Generator.CSharp.Snippets; namespace Microsoft.Generator.CSharp.Providers { /// /// Represents an immutable collection of methods that are associated with an operation . /// - public sealed class MethodProviderCollection : IReadOnlyList + public class MethodProviderCollection : IReadOnlyList { - private readonly IReadOnlyList _cSharpMethods; + private IReadOnlyList? _cSharpMethods; + protected readonly InputOperation _operation; + protected readonly TypeProvider _enclosingType; - private MethodProviderCollection(IEnumerable? methods) + public MethodProviderCollection(InputOperation operation, TypeProvider enclosingType) { - _cSharpMethods = methods?.ToList() ?? []; + _operation = operation; + _enclosingType = enclosingType; } - /// - /// Builds a default for the given - /// with a single method that creates a message. - /// - /// The to convert. - /// The that will contain the methods. - public static MethodProviderCollection DefaultCSharpMethodCollection(InputOperation operation, TypeProvider enclosingType) - { - var createMessageMethod = BuildCreateMessageMethod(operation, enclosingType); - var cSharpMethods = new List() { createMessageMethod }; - // TO-DO: Add Protocol and Convenience methods https://github.com/Azure/autorest.csharp/issues/4585, https://github.com/Azure/autorest.csharp/issues/4586 - return new MethodProviderCollection(cSharpMethods); - } + protected virtual IReadOnlyList BuildMethods() => []; + public IReadOnlyList MethodProviders => _cSharpMethods ??= BuildMethods(); public MethodProvider this[int index] { - get { return _cSharpMethods[index]; } + get { return MethodProviders[index]; } } public int Count { - get { return _cSharpMethods.Count; } - } - - private static MethodProvider BuildCreateMessageMethod(InputOperation operation, TypeProvider enclosingType) - { - // TO-DO: properly build method https://github.com/Azure/autorest.csharp/issues/4583 - List methodParameters = new(); - foreach (var inputParam in operation.Parameters) - { - methodParameters.Add(CodeModelPlugin.Instance.TypeFactory.CreateCSharpParam(inputParam)); - } - - var methodModifier = MethodSignatureModifiers.Internal; - var methodSignatureName = $"Create{operation.Name.ToCleanName()}Request"; - var methodSignature = new MethodSignature(methodSignatureName, FormattableStringHelpers.FromString(operation.Description), methodModifier, null, null, Parameters: methodParameters); - var methodBody = Snippet.Throw(Snippet.New.NotImplementedException(Snippet.Literal("Method not implemented."))); - - return new MethodProvider(methodSignature, methodBody, enclosingType); + get { return MethodProviders.Count; } } public IEnumerator GetEnumerator() { - return _cSharpMethods.GetEnumerator(); + return MethodProviders.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Mocks/MockTypeFactory.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Mocks/MockTypeFactory.cs index 94fa2ae7fd..04c0a19b83 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Mocks/MockTypeFactory.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Mocks/MockTypeFactory.cs @@ -10,7 +10,7 @@ namespace Microsoft.Generator.CSharp.Tests { internal class MockTypeFactory : TypeFactory { - public override MethodProviderCollection? CreateMethodProviders(InputOperation operation, TypeProvider enclosingType) + public override MethodProviderCollection CreateMethodProviders(InputOperation operation, TypeProvider enclosingType) { throw new NotImplementedException(); } diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/OutputTypes/TypeFactoryTests.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/OutputTypes/TypeFactoryTests.cs index e0dc535e03..987a059486 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/OutputTypes/TypeFactoryTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/OutputTypes/TypeFactoryTests.cs @@ -63,7 +63,7 @@ public override ParameterProvider CreateCSharpParam(InputParameter parameter) throw new NotImplementedException(); } - public override MethodProviderCollection? CreateMethodProviders(InputOperation operation, TypeProvider enclosingType) + public override MethodProviderCollection CreateMethodProviders(InputOperation operation, TypeProvider enclosingType) { throw new NotImplementedException(); } diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Unbranded-TypeSpec/src/Generated/UnbrandedTypeSpecClient.cs b/packages/http-client-csharp/generator/TestProjects/Local/Unbranded-TypeSpec/src/Generated/UnbrandedTypeSpecClient.cs index 3ac4c09f9e..e35c2608f5 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Unbranded-TypeSpec/src/Generated/UnbrandedTypeSpecClient.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Unbranded-TypeSpec/src/Generated/UnbrandedTypeSpecClient.cs @@ -3,6 +3,8 @@ #nullable disable using System; +using System.Threading; +using System.Threading.Tasks; using UnbrandedTypeSpec.Models; namespace UnbrandedTypeSpec @@ -15,89 +17,435 @@ internal void CreateSayHiRequest(Uri unbrandedTypeSpecUrl, string headParameter, throw new NotImplementedException("Method not implemented."); } + /// Return hi. + /// + /// + /// + /// The cancellation token to use. + /// or is null. + public virtual void SayHi(string headParameter, string queryParameter, string optionalQuery, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(headParameter, nameof(headParameter)); + Argument.AssertNotNull(queryParameter, nameof(queryParameter)); + + } + + /// Return hi. + /// + /// + /// + /// The cancellation token to use. + /// or is null. + public virtual async void SayHiAsync(string headParameter, string queryParameter, string optionalQuery, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(headParameter, nameof(headParameter)); + Argument.AssertNotNull(queryParameter, nameof(queryParameter)); + + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreateHelloAgainRequest(Uri unbrandedTypeSpecUrl, string p1, string contentType, string p2, RoundTripModel action, string accept) { throw new NotImplementedException("Method not implemented."); } + /// Return hi again. + /// + /// + /// + /// The cancellation token to use. + /// , or is null. + public virtual void HelloAgain(string p1, string p2, RoundTripModel action, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(p1, nameof(p1)); + Argument.AssertNotNull(p2, nameof(p2)); + Argument.AssertNotNull(action, nameof(action)); + + } + + /// Return hi again. + /// + /// + /// + /// The cancellation token to use. + /// , or is null. + public virtual async void HelloAgainAsync(string p1, string p2, RoundTripModel action, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(p1, nameof(p1)); + Argument.AssertNotNull(p2, nameof(p2)); + Argument.AssertNotNull(action, nameof(action)); + + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreateNoContentTypeRequest(Uri unbrandedTypeSpecUrl, string p1, string p2, RoundTripModel action, string accept, string contentType) { throw new NotImplementedException("Method not implemented."); } + /// Return hi again. + /// + /// + /// + /// The cancellation token to use. + /// , or is null. + public virtual void NoContentType(string p1, string p2, RoundTripModel action, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(p1, nameof(p1)); + Argument.AssertNotNull(p2, nameof(p2)); + Argument.AssertNotNull(action, nameof(action)); + + } + + /// Return hi again. + /// + /// + /// + /// The cancellation token to use. + /// , or is null. + public virtual async void NoContentTypeAsync(string p1, string p2, RoundTripModel action, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(p1, nameof(p1)); + Argument.AssertNotNull(p2, nameof(p2)); + Argument.AssertNotNull(action, nameof(action)); + + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreateHelloDemo2Request(Uri unbrandedTypeSpecUrl, string accept) { throw new NotImplementedException("Method not implemented."); } + /// Return hi in demo2. + /// The cancellation token to use. + public virtual void HelloDemo2(CancellationToken cancellationToken = default) + { + } + + /// Return hi in demo2. + /// The cancellation token to use. + public virtual async void HelloDemo2Async(CancellationToken cancellationToken = default) + { + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreateCreateLiteralRequest(Uri unbrandedTypeSpecUrl, Thing body, string accept, string contentType) { throw new NotImplementedException("Method not implemented."); } + /// Create with literal value. + /// + /// The cancellation token to use. + /// is null. + public virtual void CreateLiteral(Thing body, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(body, nameof(body)); + + } + + /// Create with literal value. + /// + /// The cancellation token to use. + /// is null. + public virtual async void CreateLiteralAsync(Thing body, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(body, nameof(body)); + + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreateHelloLiteralRequest(Uri unbrandedTypeSpecUrl, string p1, int p2, bool p3, string accept) { throw new NotImplementedException("Method not implemented."); } + /// Send literal parameters. + /// The cancellation token to use. + public virtual void HelloLiteral(CancellationToken cancellationToken = default) + { + } + + /// Send literal parameters. + /// The cancellation token to use. + public virtual async void HelloLiteralAsync(CancellationToken cancellationToken = default) + { + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreateTopActionRequest(Uri unbrandedTypeSpecUrl, DateTimeOffset action, string accept) { throw new NotImplementedException("Method not implemented."); } + /// top level method. + /// + /// The cancellation token to use. + /// is null. + public virtual void TopAction(DateTimeOffset action, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(action, nameof(action)); + + } + + /// top level method. + /// + /// The cancellation token to use. + /// is null. + public virtual async void TopActionAsync(DateTimeOffset action, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(action, nameof(action)); + + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreateTopAction2Request(Uri unbrandedTypeSpecUrl, string accept) { throw new NotImplementedException("Method not implemented."); } + /// top level method2. + /// The cancellation token to use. + public virtual void TopAction2(CancellationToken cancellationToken = default) + { + } + + /// top level method2. + /// The cancellation token to use. + public virtual async void TopAction2Async(CancellationToken cancellationToken = default) + { + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreatePatchActionRequest(Uri unbrandedTypeSpecUrl, Thing body, string accept, string contentType) { throw new NotImplementedException("Method not implemented."); } + /// top level patch. + /// + /// The cancellation token to use. + /// is null. + public virtual void PatchAction(Thing body, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(body, nameof(body)); + + } + + /// top level patch. + /// + /// The cancellation token to use. + /// is null. + public virtual async void PatchActionAsync(Thing body, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(body, nameof(body)); + + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreateAnonymousBodyRequest(Uri unbrandedTypeSpecUrl, Thing Thing, string accept, string contentType) { throw new NotImplementedException("Method not implemented."); } + /// body parameter without body decorator. + /// A model with a few properties of literal types. + /// The cancellation token to use. + /// is null. + public virtual void AnonymousBody(Thing Thing, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(Thing, nameof(Thing)); + + } + + /// body parameter without body decorator. + /// A model with a few properties of literal types. + /// The cancellation token to use. + /// is null. + public virtual async void AnonymousBodyAsync(Thing Thing, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(Thing, nameof(Thing)); + + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreateFriendlyModelRequest(Uri unbrandedTypeSpecUrl, Friend Friend, string accept, string contentType) { throw new NotImplementedException("Method not implemented."); } + /// Model can have its friendly name. + /// this is not a friendly model but with a friendly name. + /// The cancellation token to use. + /// is null. + public virtual void FriendlyModel(Friend Friend, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(Friend, nameof(Friend)); + + } + + /// Model can have its friendly name. + /// this is not a friendly model but with a friendly name. + /// The cancellation token to use. + /// is null. + public virtual async void FriendlyModelAsync(Friend Friend, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(Friend, nameof(Friend)); + + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreateAddTimeHeaderRequest(Uri unbrandedTypeSpecUrl, DateTimeOffset repeatabilityFirstSent, string accept) { throw new NotImplementedException("Method not implemented."); } + /// addTimeHeader. + /// + /// The cancellation token to use. + public virtual void AddTimeHeader(DateTimeOffset repeatabilityFirstSent, CancellationToken cancellationToken = default) + { + } + + /// addTimeHeader. + /// + /// The cancellation token to use. + public virtual async void AddTimeHeaderAsync(DateTimeOffset repeatabilityFirstSent, CancellationToken cancellationToken = default) + { + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreateProjectedNameModelRequest(Uri unbrandedTypeSpecUrl, ProjectedModel ProjectedModel, string accept, string contentType) { throw new NotImplementedException("Method not implemented."); } + /// Model can have its projected name. + /// this is a model with a projected name. + /// The cancellation token to use. + /// is null. + public virtual void ProjectedNameModel(ProjectedModel ProjectedModel, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(ProjectedModel, nameof(ProjectedModel)); + + } + + /// Model can have its projected name. + /// this is a model with a projected name. + /// The cancellation token to use. + /// is null. + public virtual async void ProjectedNameModelAsync(ProjectedModel ProjectedModel, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(ProjectedModel, nameof(ProjectedModel)); + + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreateReturnsAnonymousModelRequest(Uri unbrandedTypeSpecUrl, string accept) { throw new NotImplementedException("Method not implemented."); } + /// return anonymous model. + /// The cancellation token to use. + public virtual void ReturnsAnonymousModel(CancellationToken cancellationToken = default) + { + } + + /// return anonymous model. + /// The cancellation token to use. + public virtual async void ReturnsAnonymousModelAsync(CancellationToken cancellationToken = default) + { + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreateGetUnknownValueRequest(Uri unbrandedTypeSpecUrl, string accept) { throw new NotImplementedException("Method not implemented."); } + /// get extensible enum. + /// The cancellation token to use. + public virtual void GetUnknownValue(CancellationToken cancellationToken = default) + { + } + + /// get extensible enum. + /// The cancellation token to use. + public virtual async void GetUnknownValueAsync(CancellationToken cancellationToken = default) + { + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreateInternalProtocolRequest(Uri unbrandedTypeSpecUrl, Thing body, string accept, string contentType) { throw new NotImplementedException("Method not implemented."); } + /// When set protocol false and convenient true, then the protocol method should be internal. + /// + /// The cancellation token to use. + /// is null. + public virtual void InternalProtocol(Thing body, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(body, nameof(body)); + + } + + /// When set protocol false and convenient true, then the protocol method should be internal. + /// + /// The cancellation token to use. + /// is null. + public virtual async void InternalProtocolAsync(Thing body, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(body, nameof(body)); + + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreateStillConvenientRequest(Uri unbrandedTypeSpecUrl, string accept) { throw new NotImplementedException("Method not implemented."); } + /// When set protocol false and convenient true, the convenient method should be generated even it has the same signature as protocol one. + /// The cancellation token to use. + public virtual void StillConvenient(CancellationToken cancellationToken = default) + { + } + + /// When set protocol false and convenient true, the convenient method should be generated even it has the same signature as protocol one. + /// The cancellation token to use. + public virtual async void StillConvenientAsync(CancellationToken cancellationToken = default) + { + await Task.CompletedTask.ConfigureAwait(false); + } + internal void CreateHeadAsBooleanRequest(Uri unbrandedTypeSpecUrl, string id, string accept) { throw new NotImplementedException("Method not implemented."); } + + /// head as boolean. + /// + /// The cancellation token to use. + /// is null. + public virtual void HeadAsBoolean(string id, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(id, nameof(id)); + + } + + /// head as boolean. + /// + /// The cancellation token to use. + /// is null. + public virtual async void HeadAsBooleanAsync(string id, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(id, nameof(id)); + + await Task.CompletedTask.ConfigureAwait(false); + } } }