package core import ( "strconv" "strings" "unicode/utf8" "git.akyoto.dev/cli/q/src/errors" "git.akyoto.dev/cli/q/src/token" ) // Number tries to convert the token into a numeric value. func (f *Function) Number(t token.Token) (int, error) { switch t.Kind { case token.Number: digits := t.Text(f.File.Bytes) if strings.HasPrefix(digits, "0x") { number, err := strconv.ParseInt(digits[2:], 16, 64) return int(number), err } if strings.HasPrefix(digits, "0o") { number, err := strconv.ParseInt(digits[2:], 8, 64) return int(number), err } if strings.HasPrefix(digits, "0b") { number, err := strconv.ParseInt(digits[2:], 2, 64) return int(number), err } number, err := strconv.Atoi(digits) return number, err case token.Rune: r := t.Bytes(f.File.Bytes) r = String(r) if len(r) == 0 { return 0, errors.New(errors.InvalidRune, f.File, t.Position+1) } number, size := utf8.DecodeRune(r) if len(r) > size { return 0, errors.New(errors.InvalidRune, f.File, t.Position+1) } return int(number), nil } return 0, errors.New(errors.InvalidNumber, f.File, t.Position) }