50 lines
1.3 KiB
Go
50 lines
1.3 KiB
Go
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])
|
|
}
|
|
}
|