Resource patterns

This rule enforces that files that define a resource with the google.api.resource_definition annotation have a pattern defined, as described in AIP-123.

Details

This rule scans all google.api.resource_definition annotations in all files, and complains if pattern is not provided at least once. It also complains if the segments outside of variable names contain underscores.

Examples

Incorrect code for this rule:

import "google/api/resources.proto";

// Incorrect.
option (google.api.resource_definition) = {
  type: "library.googleapis.com/Book"
  // pattern should be here
};
import "google/api/resources.proto";

// Incorrect.
option (google.api.resource_definition) = {
  type: "library.googleapis.com/ElectronicBook"
  // Should be: publishers/{publisher}/electronicBooks/{electronic_book}
  pattern: "publishers/{publisher}/electronic_books/{electronic_book}"
};

Correct code for this rule:

import "google/api/resources.proto";

// Correct.
option (google.api.resource_definition) = {
  type: "library.googleapis.com/Book"
  pattern: "publishers/{publisher}/books/{book}"
};
import "google/api/resource.proto";

// Correct.
option (google.api.resource_definition) = {
  type: "library.googleapis.com/ElectronicBook"
  pattern: "publishers/{publisher}/electronicBooks/{electronic_book}"
};

Disabling

If you need to violate this rule, use a comment on the annotation.

import "google/api/resource.proto";

// (-- api-linter: core::0123::resource-definition-pattern=disabled
//     aip.dev/not-precedent: We need to do this because reasons. --)
option (google.api.resource_definition) = {
  type: "library.googleapis.com/Book"
};

If you need to violate this rule for an entire file, place the comment at the top of the file.