code: func properties(props *structpb.Struct) []property {
  	if props == nil {
  		return nil
  	}
  	// Render the fields to JSON.
  	m := jsonpb.Marshaler{}
  	buf := bytes.NewBuffer(nil)
  	if err := m.Marshal(buf, props); err != nil {
  		panic(err) // This shouldn't happen.
  	}
  	d := json.NewDecoder(buf)
  	jsonProps := map[string]json.RawMessage{}
  	if err := d.Decode(&jsonProps); err != nil {
  		panic(err) // This shouldn't happen.
  	}
  
  	// Sort the names.
  	names := make([]string, 0, len(jsonProps))
  	for n := range jsonProps {
  		names = append(names, n)
  	}
  	sort.Strings(names)
  
  	// Rearrange the fields into a slice.
  	results := make([]property, len(jsonProps))
  	for i, n := range names {
  		buf.Reset()
  		json.Indent(buf, jsonProps[n], "", "  ")
  		results[i] = property{
  			Name:  n,
  			Value: buf.String(),
  		}
  	}
  	return results
  }
docs: // properties returns the values in the proto struct fields as
  // a json rendered slice of pairs, sorted by key.