code: func (r *Requirement) String() string {
  	var buffer bytes.Buffer
  	if r.operator == selection.DoesNotExist {
  		buffer.WriteString("!")
  	}
  	buffer.WriteString(r.key)
  
  	switch r.operator {
  	case selection.Equals:
  		buffer.WriteString("=")
  	case selection.DoubleEquals:
  		buffer.WriteString("==")
  	case selection.NotEquals:
  		buffer.WriteString("!=")
  	case selection.In:
  		buffer.WriteString(" in ")
  	case selection.NotIn:
  		buffer.WriteString(" notin ")
  	case selection.GreaterThan:
  		buffer.WriteString(">")
  	case selection.LessThan:
  		buffer.WriteString("<")
  	case selection.Exists, selection.DoesNotExist:
  		return buffer.String()
  	}
  
  	switch r.operator {
  	case selection.In, selection.NotIn:
  		buffer.WriteString("(")
  	}
  	if len(r.strValues) == 1 {
  		buffer.WriteString(r.strValues[0])
  	} else { // only > 1 since == 0 prohibited by NewRequirement
  		// normalizes value order on output, without mutating the in-memory selector representation
  		// also avoids normalization when it is not required, and ensures we do not mutate shared data
  		buffer.WriteString(strings.Join(safeSort(r.strValues), ","))
  	}
  
  	switch r.operator {
  	case selection.In, selection.NotIn:
  		buffer.WriteString(")")
  	}
  	return buffer.String()
  }
docs: // String returns a human-readable string that represents this
  // Requirement. If called on an invalid Requirement, an error is
  // returned. See NewRequirement for creating a valid Requirement.