package parse

import (
	"git.makaay.nl/mauricem/go-parsekit/parse"
	"git.makaay.nl/mauricem/go-toml/ast"
)

var (
	detectString         = a.SingleQuote.Or(a.DoubleQuote)
	detectBoolean        = a.Str("true").Or(a.Str("false"))
	detectNumberSpecials = c.Any(a.Plus, a.Minus, a.Str("inf"), a.Str("nan"))
	detectDateTime       = a.Digits.Then(a.Minus.Or(a.Colon))
	detectNumber         = a.Digit
	detectArray          = a.SquareOpen
	detectInlineTable    = a.CurlyOpen
)

// Values must be of the following types: String, Integer, Float, Boolean,
// Datetime, Array, or Inline Table. Unspecified values are invalid.
func (t *parser) parseValue(p *parse.API) (*ast.Value, bool) {
	switch {
	case p.Peek(detectString):
		return t.parseString(p)
	case p.Peek(detectBoolean):
		return t.parseBoolean(p)
	case p.Peek(detectNumberSpecials):
		return t.parseNumber(p)
	case p.Peek(detectDateTime):
		return t.parseDateTime(p)
	case p.Peek(detectNumber):
		return t.parseNumber(p)
	case p.Peek(detectArray):
		return t.parseArray(p)
	case p.Peek(detectInlineTable):
		return t.parseInlineTable(p)
	default:
		p.Expected("a value")
		return nil, false
	}
}
