// 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") } }