// Labels provide a way to associate user-defined metadata with various
// objects.  Labels may be used to organize objects into non-hierarchical
// groups; think metadata tags attached to mp3s.

syntax = "proto2";

package tech.label;

// A key-value pair applied to a given object.
message Label {
  // The key of a label is a syntactically valid URL (as per RFC 1738) with
  // the "scheme" and initial slashes omitted and with the additional
  // restrictions noted below.  Each key should be globally unique.  The
  // "host" portion is called the "namespace" and is not necessarily
  // resolvable to a network endpoint.  Instead, the namespace indicates what
  // system or entity defines the semantics of the label.  Namespaces do not
  // restrict the set of objects to which a label may be associated.
  //
  // Keys are defined by the following grammar:
  //
  //   key          = hostname "/" kpath
  //   kpath        = ksegment *[ "/" ksegment ]
  //   ksegment     = alphadigit | *[ alphadigit | "-" | "_" | "." ]
  //
  // where "hostname" and "alphadigit" are defined as in RFC 1738.
  //
  // Example key:
  //   spanner.google.com/universe
  required string key = 1;

  // The value of the label.
  oneof value {
    // A string value.
    string str_value = 2;
    // An integer value.
    int64 num_value = 3;
  }
}

// A collection of labels, such as the set of all labels attached to an
// object.  Each label in the set must have a different key.
//
// Users should prefer to embed "repeated Label" directly when possible.
// This message should only be used in cases where that isn't possible (e.g.
// with oneof).
message Labels {
  repeated Label label = 1;
}
