Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -81,21 +81,45 @@ protected override ScmMethodProvider[] BuildMethods()
{
var operation = serviceMethod.Operation;
var method = BuildCreateRequestMethod(serviceMethod);
methods.Add(method);
MethodCache[operation] = method;
method = VisitCreateRequestMethod(method, serviceMethod);

if (method != null)
{
methods.Add(method);
MethodCache[operation] = method;
}

// For paging operations with next link, also generate a CreateNextXXXRequest method
if (serviceMethod is InputPagingServiceMethod { PagingMetadata.NextLink: not null })
{
var nextMethod = BuildCreateRequestMethod(serviceMethod, isNextLinkRequest: true);
methods.Add(nextMethod);
NextMethodCache[operation] = nextMethod;
nextMethod = VisitCreateRequestMethod(nextMethod, serviceMethod);

if (nextMethod != null)
{
methods.Add(nextMethod);
NextMethodCache[operation] = nextMethod;
}
}
}

return [.. methods];
}

private ScmMethodProvider? VisitCreateRequestMethod(ScmMethodProvider method, InputServiceMethod serviceMethod)
{
ScmMethodProvider? result = method;
foreach (var visitor in ScmCodeModelGenerator.Instance.Visitors)
{
if (visitor is ScmLibraryVisitor scmVisitor)
{
result = scmVisitor.VisitCreateRequestMethod(serviceMethod, this, result);
}
}

return method;
}

private ScmMethodProvider BuildCreateRequestMethod(InputServiceMethod serviceMethod, bool isNextLinkRequest = false)
{
var options = ScmKnownParameters.RequestOptions;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ public abstract class ScmLibraryVisitor : LibraryVisitor
return methodProviderCollection;
}

protected internal virtual ScmMethodProvider? VisitCreateRequestMethod(
InputServiceMethod serviceMethod,
RestClientProvider enclosingType,
ScmMethodProvider? createRequestMethodProvider)
{
return createRequestMethodProvider;
}

protected internal virtual ClientProvider? Visit(InputClient client, ClientProvider? clientProvider)
{
return clientProvider;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,5 +67,45 @@ public void PreVisitsClients()

_mockVisitor.Protected().Verify<ClientProvider?>("Visit", Times.Once(), inputClient, ItExpr.IsAny<ClientProvider?>());
}

[Test]
public void PreVisitsCreateRequestMethods()
{
_mockGenerator.Object.AddVisitor(_mockVisitor.Object);

var inputOperation = InputFactory.Operation("testOperation", responses: [InputFactory.OperationResponse(bodytype: InputPrimitiveType.Any)]);
var inputServiceMethod = InputFactory.BasicServiceMethod("test", inputOperation);
var inputClient = InputFactory.Client("fooClient", methods: [inputServiceMethod]);
_mockInputLibrary.Setup(l => l.InputNamespace).Returns(InputFactory.Namespace(
"Sample",
clients: [inputClient]));

var clientProvider = new ClientProvider(inputClient);
var restClient = clientProvider.RestClient;
_ = restClient.Methods;

_mockVisitor.Protected().Verify<ScmMethodProvider?>("VisitCreateRequestMethod", Times.Once(), inputServiceMethod, ItExpr.IsAny<RestClientProvider>(), ItExpr.IsAny<ScmMethodProvider?>());
}

[Test]
public void PreVisitsCreateNextRequestMethods()
{
_mockGenerator.Object.AddVisitor(_mockVisitor.Object);

var inputOperation = InputFactory.Operation("testOperation", responses: [InputFactory.OperationResponse(bodytype: InputPrimitiveType.Any)]);
var pagingMetadata = InputFactory.NextLinkPagingMetadata(["items"], ["nextLink"], InputResponseLocation.Body);
var inputServiceMethod = InputFactory.PagingServiceMethod("test", inputOperation, pagingMetadata: pagingMetadata);
var inputClient = InputFactory.Client("fooClient", methods: [inputServiceMethod]);
_mockInputLibrary.Setup(l => l.InputNamespace).Returns(InputFactory.Namespace(
"Sample",
clients: [inputClient]));

var clientProvider = new ClientProvider(inputClient);
var restClient = clientProvider.RestClient;
_ = restClient.Methods;

// Verified twice because it is called for CreateRequest and CreateNextRequest
_mockVisitor.Protected().Verify<ScmMethodProvider?>("VisitCreateRequestMethod", Times.Exactly(2), inputServiceMethod, ItExpr.IsAny<RestClientProvider>(), ItExpr.IsAny<ScmMethodProvider?>());
}
}
}
Loading