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 }