code: func subStructUsage(structType reflect.Type) string {
  	numFields := structType.NumField()
  	fieldUsages := make([]string, 0, numFields)
  	for i := 0; i < structType.NumField(); i++ {
  		rtf := structType.Field(i)
  
  		// When the field has a jsonrpcusage struct tag specified use
  		// that instead of automatically generating it.
  		if tag := rtf.Tag.Get("jsonrpcusage"); tag != "" {
  			fieldUsages = append(fieldUsages, tag)
  			continue
  		}
  
  		// Create the name/value entry for the field while considering
  		// the type of the field.  Not all possible types are covered
  		// here and when one of the types not specifically covered is
  		// encountered, the field name is simply reused for the value.
  		fieldName := strings.ToLower(rtf.Name)
  		fieldValue := fieldName
  		fieldKind := rtf.Type.Kind()
  		switch {
  		case isNumeric(fieldKind):
  			if fieldKind == reflect.Float32 || fieldKind == reflect.Float64 {
  				fieldValue = "n.nnn"
  			} else {
  				fieldValue = "n"
  			}
  		case fieldKind == reflect.String:
  			fieldValue = `"value"`
  
  		case fieldKind == reflect.Struct:
  			fieldValue = subStructUsage(rtf.Type)
  
  		case fieldKind == reflect.Array || fieldKind == reflect.Slice:
  			fieldValue = subArrayUsage(rtf.Type, fieldName)
  		}
  
  		usage := fmt.Sprintf("%q:%s", fieldName, fieldValue)
  		fieldUsages = append(fieldUsages, usage)
  	}
  
  	return fmt.Sprintf("{%s}", strings.Join(fieldUsages, ","))
  }
docs: // subStructUsage returns a string for use in the one-line usage for the given
  // sub struct.  Note that this is specifically for fields which consist of
  // structs (or an array/slice of structs) as opposed to the top-level command
  // struct.
  //
  // Any fields that include a jsonrpcusage struct tag will use that instead of
  // being automatically generated.