package ast import ( "fmt" "sort" "strings" "time" ) // String() produces a JSON-like (but not JSON) string representation of the value. // This string version is useful for testing and debugging purposes. func (parseItem item) String() string { switch parseItem.Type { case tString: return fmt.Sprintf("%q", parseItem.Data[0]) case tOffsetDateTime: return parseItem.Data[0].(time.Time).Format(time.RFC3339Nano) case tLocalDateTime: return parseItem.Data[0].(time.Time).Format("2006-01-02 15:04:05.999999999") case tLocalDate: return parseItem.Data[0].(time.Time).Format("2006-01-02") case tLocalTime: return parseItem.Data[0].(time.Time).Format("15:04:05.999999999") case tArrayOfTables: fallthrough case tArray: items := make([]string, len(parseItem.Data)) for i, value := range parseItem.Data { items[i] = value.(*item).String() } return fmt.Sprintf("[%s]", strings.Join(items, ", ")) case tTable: pairs := parseItem.Data[0].(table) keys := make([]string, len(pairs)) i := 0 for k := range pairs { keys[i] = k i++ } sort.Strings(keys) items := make([]string, len(pairs)) for i, k := range keys { items[i] = fmt.Sprintf("%q: %s", k, pairs[k].String()) } return fmt.Sprintf("{%s}", strings.Join(items, ", ")) default: return fmt.Sprintf("%v", parseItem.Data[0]) } }