Blame vendor/github.com/BurntSushi/toml/type_check.go

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
}