github.com/googleapis/api-linter@v1.65.2/rules/aip0132/request_show_deleted_required.go (about)

     1  package aip0132
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/googleapis/api-linter/lint"
     8  	"github.com/googleapis/api-linter/rules/internal/utils"
     9  	"github.com/jhump/protoreflect/desc"
    10  	"github.com/stoewer/go-strcase"
    11  )
    12  
    13  // List requests should contain a show_deleted field if the resource supports
    14  // soft delete.
    15  var requestShowDeletedRequired = &lint.MessageRule{
    16  	Name: lint.NewRuleName(132, "request-show-deleted-required"),
    17  	OnlyIf: func(m *desc.MessageDescriptor) bool {
    18  		if !utils.IsListRequestMessage(m) {
    19  			return false
    20  		}
    21  		// Check for soft-delete support by getting the resource name
    22  		// from the corresponding response message.
    23  		plural := strings.TrimPrefix(strings.TrimSuffix(m.GetName(), "Request"), "List")
    24  		if resp := utils.FindMessage(m.GetFile(), fmt.Sprintf("List%sResponse", plural)); resp != nil {
    25  			if paged := resp.FindFieldByName(strcase.SnakeCase(plural)); paged != nil && paged.GetMessageType() != nil {
    26  				singular := paged.GetMessageType().GetName()
    27  				return utils.FindMethod(m.GetFile(), "Undelete"+singular) != nil
    28  			}
    29  		}
    30  		return false
    31  	},
    32  	LintMessage: func(m *desc.MessageDescriptor) []lint.Problem {
    33  		if m.FindFieldByName("show_deleted") != nil {
    34  			return nil
    35  		}
    36  		return []lint.Problem{{
    37  			Message:    "List requests for resources supporting soft delete must have a `bool show_deleted` field.",
    38  			Descriptor: m,
    39  		}}
    40  	},
    41  }