go-toml/ast/string.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])
}
}