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

     1  // Copyright 2019 Google LLC
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     https://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package aip0142
    16  
    17  import (
    18  	"strings"
    19  
    20  	"github.com/googleapis/api-linter/lint"
    21  	"github.com/googleapis/api-linter/locations"
    22  	"github.com/jhump/protoreflect/desc"
    23  )
    24  
    25  var fieldNames = &lint.FieldRule{
    26  	Name:   lint.NewRuleName(142, "time-field-names"),
    27  	OnlyIf: isTimestamp,
    28  	LintField: func(f *desc.FieldDescriptor) []lint.Problem {
    29  		// Look for common non-imperative terms.
    30  		mistakes := map[string]string{
    31  			"created":  "create_time",
    32  			"creation": "create_time",
    33  			"expired":  "expire_time",
    34  			"modified": "update_time",
    35  			"updated":  "update_time",
    36  			"purged":   "purge_time",
    37  		}
    38  		for got, want := range mistakes {
    39  			if strings.Contains(f.GetName(), got) {
    40  				return []lint.Problem{{
    41  					Message:    "Use the imperative mood and a `_time` suffix for timestamps.",
    42  					Descriptor: f,
    43  					Location:   locations.DescriptorName(f),
    44  					Suggestion: want,
    45  				}}
    46  			}
    47  		}
    48  
    49  		// Look for timestamps that do not end in `_time` or, if repeated, `_times`.
    50  		if !strings.HasSuffix(f.GetName(), "_time") {
    51  			if !f.IsRepeated() {
    52  				return []lint.Problem{{
    53  					Message:    "Timestamp fields should end in `_time`.",
    54  					Descriptor: f,
    55  					Location:   locations.DescriptorName(f),
    56  				}}
    57  			} else if !strings.HasSuffix(f.GetName(), "_times") {
    58  				return []lint.Problem{{
    59  					Message:    "Repeated Timestamp fields should end in `_time` or `_times`.",
    60  					Descriptor: f,
    61  					Location:   locations.DescriptorName(f),
    62  				}}
    63  			}
    64  		}
    65  
    66  		return nil
    67  	},
    68  }