|
Packit |
63bb0d |
package toml
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// tomlType represents any Go type that corresponds to a TOML type.
|
|
Packit |
63bb0d |
// While the first draft of the TOML spec has a simplistic type system that
|
|
Packit |
63bb0d |
// probably doesn't need this level of sophistication, we seem to be militating
|
|
Packit |
63bb0d |
// toward adding real composite types.
|
|
Packit |
63bb0d |
type tomlType interface {
|
|
Packit |
63bb0d |
typeString() string
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// typeEqual accepts any two types and returns true if they are equal.
|
|
Packit |
63bb0d |
func typeEqual(t1, t2 tomlType) bool {
|
|
Packit |
63bb0d |
if t1 == nil || t2 == nil {
|
|
Packit |
63bb0d |
return false
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return t1.typeString() == t2.typeString()
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func typeIsHash(t tomlType) bool {
|
|
Packit |
63bb0d |
return typeEqual(t, tomlHash) || typeEqual(t, tomlArrayHash)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
type tomlBaseType string
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (btype tomlBaseType) typeString() string {
|
|
Packit |
63bb0d |
return string(btype)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (btype tomlBaseType) String() string {
|
|
Packit |
63bb0d |
return btype.typeString()
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
var (
|
|
Packit |
63bb0d |
tomlInteger tomlBaseType = "Integer"
|
|
Packit |
63bb0d |
tomlFloat tomlBaseType = "Float"
|
|
Packit |
63bb0d |
tomlDatetime tomlBaseType = "Datetime"
|
|
Packit |
63bb0d |
tomlString tomlBaseType = "String"
|
|
Packit |
63bb0d |
tomlBool tomlBaseType = "Bool"
|
|
Packit |
63bb0d |
tomlArray tomlBaseType = "Array"
|
|
Packit |
63bb0d |
tomlHash tomlBaseType = "Hash"
|
|
Packit |
63bb0d |
tomlArrayHash tomlBaseType = "ArrayHash"
|
|
Packit |
63bb0d |
)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// typeOfPrimitive returns a tomlType of any primitive value in TOML.
|
|
Packit |
63bb0d |
// Primitive values are: Integer, Float, Datetime, String and Bool.
|
|
Packit |
63bb0d |
//
|
|
Packit |
63bb0d |
// Passing a lexer item other than the following will cause a BUG message
|
|
Packit |
63bb0d |
// to occur: itemString, itemBool, itemInteger, itemFloat, itemDatetime.
|
|
Packit |
63bb0d |
func (p *parser) typeOfPrimitive(lexItem item) tomlType {
|
|
Packit |
63bb0d |
switch lexItem.typ {
|
|
Packit |
63bb0d |
case itemInteger:
|
|
Packit |
63bb0d |
return tomlInteger
|
|
Packit |
63bb0d |
case itemFloat:
|
|
Packit |
63bb0d |
return tomlFloat
|
|
Packit |
63bb0d |
case itemDatetime:
|
|
Packit |
63bb0d |
return tomlDatetime
|
|
Packit |
63bb0d |
case itemString:
|
|
Packit |
63bb0d |
return tomlString
|
|
Packit |
63bb0d |
case itemMultilineString:
|
|
Packit |
63bb0d |
return tomlString
|
|
Packit |
63bb0d |
case itemRawString:
|
|
Packit |
63bb0d |
return tomlString
|
|
Packit |
63bb0d |
case itemRawMultilineString:
|
|
Packit |
63bb0d |
return tomlString
|
|
Packit |
63bb0d |
case itemBool:
|
|
Packit |
63bb0d |
return tomlBool
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
p.bug("Cannot infer primitive type of lex item '%s'.", lexItem)
|
|
Packit |
63bb0d |
panic("unreachable")
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// typeOfArray returns a tomlType for an array given a list of types of its
|
|
Packit |
63bb0d |
// values.
|
|
Packit |
63bb0d |
//
|
|
Packit |
63bb0d |
// In the current spec, if an array is homogeneous, then its type is always
|
|
Packit |
63bb0d |
// "Array". If the array is not homogeneous, an error is generated.
|
|
Packit |
63bb0d |
func (p *parser) typeOfArray(types []tomlType) tomlType {
|
|
Packit |
63bb0d |
// Empty arrays are cool.
|
|
Packit |
63bb0d |
if len(types) == 0 {
|
|
Packit |
63bb0d |
return tomlArray
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
theType := types[0]
|
|
Packit |
63bb0d |
for _, t := range types[1:] {
|
|
Packit |
63bb0d |
if !typeEqual(theType, t) {
|
|
Packit |
63bb0d |
p.panicf("Array contains values of type '%s' and '%s', but "+
|
|
Packit |
63bb0d |
"arrays must be homogeneous.", theType, t)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return tomlArray
|
|
Packit |
63bb0d |
}
|