// qualifiedTypeName returns the qualified type name for the given data type. // This is useful in reporting types in error messages. // (e.g) array<string>, hash<string, string>, hash<string, array<int>> func qualifiedTypeName(t design.DataType) string { switch t.Kind() { case design.DateTimeKind: return "datetime" case design.ArrayKind: return fmt.Sprintf("%s<%s>", t.Name(), qualifiedTypeName(t.ToArray().ElemType.Type)) case design.HashKind: h := t.ToHash() return fmt.Sprintf("%s<%s, %s>", t.Name(), qualifiedTypeName(h.KeyType.Type), qualifiedTypeName(h.ElemType.Type), ) } return t.Name() }
// 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") } }