public Paginated(ServiceDetails svc, MethodDescriptor desc, FieldDescriptor responseResourceField, int pageSizeFieldNumber, int pageTokenFieldNumber) : base(svc, desc) { ResourceTyp = ProtoTyp.Of(responseResourceField, forceRepeated: false); ApiCallTyp = Typ.Generic(typeof(ApiCall <,>), RequestTyp, ResponseTyp); SyncReturnTyp = Typ.Generic(typeof(PagedEnumerable <,>), ResponseTyp, ResourceTyp); AsyncReturnTyp = Typ.Generic(typeof(PagedAsyncEnumerable <,>), ResponseTyp, ResourceTyp); SyncGrpcType = Typ.Generic(typeof(GrpcPagedEnumerable <, ,>), RequestTyp, ResponseTyp, ResourceTyp); AsyncGrpcType = Typ.Generic(typeof(GrpcPagedAsyncEnumerable <, ,>), RequestTyp, ResponseTyp, ResourceTyp); ResourcesFieldName = responseResourceField.CSharpPropertyName(); PageSizeFieldNumber = pageSizeFieldNumber; PageTokenFieldNumber = pageTokenFieldNumber; }
private MethodDeclarationSyntax AbstractRequestMethod(bool sync, bool callSettings, IEnumerable <ParameterInfo> parameters, DocumentationCommentTriviaSyntax returnsXmlDoc = null) { var returnTyp = sync ? MethodDetails.SyncReturnTyp : MethodDetails.AsyncReturnTyp; var methodName = sync ? MethodDetails.SyncMethodName : MethodDetails.AsyncMethodName; var finalParam = callSettings ? _def.CallSettingsParam : _def.CancellationTokenParam; var finalParamXmlDoc = callSettings ? _def.CallSettingsXmlDoc : _def.CancellationTokenXmlDoc; returnsXmlDoc = returnsXmlDoc ?? (sync ? MethodDetails is MethodDetails.Paginated ? _def.ReturnsSyncPaginatedXmlDoc : _def.ReturnsSyncXmlDoc : MethodDetails is MethodDetails.Paginated ? _def.ReturnsAsyncPaginatedXmlDoc : _def.ReturnsAsyncXmlDoc); if (callSettings) { return(Method(Public | Virtual, Ctx.Type(returnTyp), methodName)(parameters.Select(x => x.Parameter).Append(finalParam).ToArray()) .WithBody(This.Call(methodName)(New(Ctx.Type(MethodDetails.RequestTyp))() .WithInitializer(NestInit(parameters, 0).ToArray()), finalParam)) .WithXmlDoc(parameters.Select(x => x.XmlDoc).Prepend(_def.SummaryXmlDoc).Append(finalParamXmlDoc).Append(returnsXmlDoc).ToArray())); IEnumerable <ObjectInitExpr> NestInit(IEnumerable <ParameterInfo> ps, int ofs) { var byField = ps.GroupBy(x => (x.FieldDescs ?? Enumerable.Empty <FieldDescriptor>()).Skip(ofs).SkipLast(1).FirstOrDefault()) .OrderBy(x => x.Key?.Index); foreach (var f in byField) { if (f.Key == null) { // No more nesting, these are the actual fields that need filling. foreach (var param in f.OrderBy(x => x.FieldDescs?.Last().Index ?? int.MaxValue)) { yield return((param.InitExpr as ObjectInitExpr) ?? new ObjectInitExpr(param.ResourcePropertyName ?? param.FieldDescs.Last().CSharpPropertyName(), param.InitExpr, isDeprecated: param.FieldDescs.Last().IsDeprecated())); } } else { // Nested field. var code = New(Ctx.Type(ProtoTyp.Of(f.Key)))().WithInitializer(NestInit(f, ofs + 1).ToArray()); yield return(new ObjectInitExpr(f.Key.CSharpPropertyName(), code)); } } } } else { return(Method(Public | Virtual, Ctx.Type(returnTyp), methodName)(parameters.Select(x => x.Parameter).Append(finalParam).ToArray()) .WithBody(This.Call(methodName)(parameters.Select(x => (object)x.Parameter).Append( Ctx.Type <CallSettings>().Call(nameof(CallSettings.FromCancellationToken))(finalParam)))) .WithXmlDoc(parameters.Select(x => x.XmlDoc).Prepend(_def.SummaryXmlDoc).Append(finalParamXmlDoc).Append(returnsXmlDoc).ToArray())); } }
public Paginated(ServiceDetails svc, MethodDescriptor desc, FieldDescriptor responseResourceField, int pageSizeFieldNumber, int pageTokenFieldNumber) : base(svc, desc) { ResourceTyp = ProtoTyp.Of(responseResourceField, forceRepeated: false); // For map fields, ResourceTyp is a constructed KeyValuePair<,> type: we need the open type in a cref. ResourceTypForCref = responseResourceField.IsMap ? Typ.Generic(typeof(KeyValuePair <,>), Typ.GenericParam("TKey"), Typ.GenericParam("TValue")) : ResourceTyp; ApiCallTyp = Typ.Generic(typeof(ApiCall <,>), RequestTyp, ResponseTyp); SyncReturnTyp = Typ.Generic(typeof(PagedEnumerable <,>), ResponseTyp, ResourceTyp); AsyncReturnTyp = Typ.Generic(typeof(PagedAsyncEnumerable <,>), ResponseTyp, ResourceTyp); SyncGrpcType = Typ.Generic(typeof(GrpcPagedEnumerable <, ,>), RequestTyp, ResponseTyp, ResourceTyp); AsyncGrpcType = Typ.Generic(typeof(GrpcPagedAsyncEnumerable <, ,>), RequestTyp, ResponseTyp, ResourceTyp); ResourcesFieldName = responseResourceField.CSharpPropertyName(); PageSizeFieldNumber = pageSizeFieldNumber; PageTokenFieldNumber = pageTokenFieldNumber; }
private static MemberDeclarationSyntax PaginatedPartialInterfaceClass(SourceFileContext ctx, Typ typ, MessageDescriptor messageDesc) { var partialInterfaceCls = Class(Public | Partial, typ, baseTypes: ctx.Type <IPageRequest>()); if (messageDesc.FindFieldByName("page_size") is null) { //DiREGapic scenario where `max_results` is an option for a page size-semantic field. var maxResMessage = messageDesc.FindFieldByName("max_results"); if (maxResMessage is null) { throw new InvalidOperationException("Paginated request should have either page_size or max_results field."); } using (ctx.InClass(partialInterfaceCls)) { var underlyingProperty = Property(DontCare, ctx.TypeDontCare, "MaxResults"); var getBody = ProtoTyp.Of(maxResMessage) == Typ.Of <int>() ? Return(underlyingProperty) : Return(CheckedCast(ctx.Type <int>(), underlyingProperty)); var assignFrom = ProtoTyp.Of(maxResMessage) == Typ.Of <int>() ? Value : CheckedCast(ctx.Type(ProtoTyp.Of(maxResMessage)), Value); var setBody = underlyingProperty.Assign(assignFrom); var property = Property(Public, ctx.Type <int>(), "PageSize") .WithGetBody(getBody) .WithSetBody(setBody) .WithXmlDoc(XmlDoc.InheritDoc); partialInterfaceCls = partialInterfaceCls.AddMembers(property); } } return(partialInterfaceCls); }