// cmdFieldType computes the Go type name used to store command flags of the given design type. func cmdFieldType(t design.DataType, point bool) string { var pointer, suffix string if point && !t.IsArray() { pointer = "*" } suffix = codegen.GoNativeType(t) return pointer + suffix }
func isArrayOfType(array design.DataType, kinds ...design.Kind) bool { if !array.IsArray() { return false } kind := array.ToArray().ElemType.Type.Kind() for _, t := range kinds { if t == kind { return true } } return false }
// cmdFieldTypeString computes the Go type name used to store command flags of the given design type. Complex types are String func cmdFieldTypeString(t design.DataType, point bool) string { var pointer, suffix string if point && !t.IsArray() { pointer = "*" } if t.Kind() == design.UUIDKind || t.Kind() == design.DateTimeKind || t.Kind() == design.AnyKind || t.Kind() == design.NumberKind || t.Kind() == design.BooleanKind { suffix = "string" } else if isArrayOfType(t, design.UUIDKind, design.DateTimeKind, design.AnyKind, design.NumberKind, design.BooleanKind) { suffix = "[]string" } else { suffix = codegen.GoNativeType(t) } return pointer + suffix }
// printVal prints the given value corresponding to the given data type. // The value is already checked for the compatibility with the data type. func printVal(t design.DataType, val interface{}) string { switch { case t.IsPrimitive(): // For primitive types, simply print the value s := fmt.Sprintf("%#v", val) if t == design.DateTime { s = fmt.Sprintf("time.Parse(time.RFC3339, %s)", s) } return s case t.IsHash(): // The input is a hash h := t.ToHash() hval := val.(map[interface{}]interface{}) if len(hval) == 0 { return fmt.Sprintf("%s{}", GoTypeName(t, nil, 0, false)) } var buffer bytes.Buffer buffer.WriteString(fmt.Sprintf("%s{", GoTypeName(t, nil, 0, false))) for k, v := range hval { buffer.WriteString(fmt.Sprintf("%s: %s, ", printVal(h.KeyType.Type, k), printVal(h.ElemType.Type, v))) } buffer.Truncate(buffer.Len() - 2) // remove ", " buffer.WriteString("}") return buffer.String() case t.IsArray(): // Input is an array a := t.ToArray() aval := val.([]interface{}) if len(aval) == 0 { return fmt.Sprintf("%s{}", GoTypeName(t, nil, 0, false)) } var buffer bytes.Buffer buffer.WriteString(fmt.Sprintf("%s{", GoTypeName(t, nil, 0, false))) for _, e := range aval { buffer.WriteString(fmt.Sprintf("%s, ", printVal(a.ElemType.Type, e))) } buffer.Truncate(buffer.Len() - 2) // remove ", " buffer.WriteString("}") return buffer.String() default: // shouldn't happen as the value's compatibility is already checked. panic("unknown type") } }