// MakeStructTypeFromHeaders creates a struct type from the headers using |kinds| as the type of each field. If |kinds| is empty, default to strings. func MakeStructTypeFromHeaders(headers []string, structName string, kinds KindSlice) *types.Type { useStringType := len(kinds) == 0 d.Chk.True(useStringType || len(headers) == len(kinds)) fields := make(types.TypeMap, len(headers)) for i, key := range headers { kind := types.StringKind if !useStringType { kind = kinds[i] } _, ok := fields[key] d.Exp.False(ok, `Duplicate field name "%s"`, key) fields[key] = types.MakePrimitiveType(kind) } return types.MakeStructType(structName, fields) }
// MakeStructTypeFromHeaders creates a struct type from the headers using |kinds| as the type of each field. If |kinds| is empty, default to strings. func MakeStructTypeFromHeaders(headers []string, structName string, kinds KindSlice) (typ *types.Type, fieldOrder []int, kindMap []types.NomsKind) { useStringType := len(kinds) == 0 d.Chk.True(useStringType || len(headers) == len(kinds)) fieldMap := make(types.TypeMap, len(headers)) origOrder := make(map[string]int, len(headers)) fieldNames := make(sort.StringSlice, len(headers)) for i, key := range headers { fn := types.EscapeStructField(key) origOrder[fn] = i kind := types.StringKind if !useStringType { kind = kinds[i] } _, ok := fieldMap[fn] d.PanicIfTrue(ok, `Duplicate field name "%s"`, key) fieldMap[fn] = types.MakePrimitiveType(kind) fieldNames[i] = fn } sort.Sort(fieldNames) kindMap = make([]types.NomsKind, len(fieldMap)) fieldOrder = make([]int, len(fieldMap)) fieldTypes := make([]*types.Type, len(fieldMap)) for i, fn := range fieldNames { typ := fieldMap[fn] fieldTypes[i] = typ kindMap[i] = typ.Kind() fieldOrder[origOrder[fn]] = i } typ = types.MakeStructType(structName, fieldNames, fieldTypes) return }