initial commits
parent
13e7cedb60
commit
ee7a6b0e4f
|
@ -0,0 +1,110 @@
|
||||||
|
package rfc8259number
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"sourcecode.social/reiver/go-rfc8259/errors"
|
||||||
|
"sourcecode.social/reiver/go-rfc8259/exponentnumber"
|
||||||
|
"sourcecode.social/reiver/go-rfc8259/fractionalnumber"
|
||||||
|
"sourcecode.social/reiver/go-rfc8259/naturalnumber"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Parse tries to parse a JSON number literal.
|
||||||
|
// If it succeeds, then it return nil, and sets ‘dst’ to the parsed value.
|
||||||
|
// If it failed, it returns an error.
|
||||||
|
//
|
||||||
|
// Example usage:
|
||||||
|
//
|
||||||
|
// var rs io.RuneScaner
|
||||||
|
//
|
||||||
|
// // ...
|
||||||
|
//
|
||||||
|
// var value rfc8259number.Number
|
||||||
|
// err := rfc8259number.Parse(rs, &value)
|
||||||
|
//
|
||||||
|
// if nil != err {
|
||||||
|
// return err
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// fmt.Printf("value = %#v\n", value)
|
||||||
|
func Parse(runescanner io.RuneScanner, dst *Number) error {
|
||||||
|
if nil == runescanner {
|
||||||
|
return rfc8259errors.ErrNilRuneScanner
|
||||||
|
}
|
||||||
|
if nil == dst {
|
||||||
|
return rfc8259errors.ErrNilDestination
|
||||||
|
}
|
||||||
|
|
||||||
|
var natPart rfc8259naturalnumber.NaturalNumber // [ minus ] int
|
||||||
|
var fracPart rfc8259fractionalnumber.FractionalNumber // [ frac ]
|
||||||
|
var expPart rfc8259exponentnumber.ExponentNumber // [ exp ]
|
||||||
|
|
||||||
|
// [ minus ] int
|
||||||
|
{
|
||||||
|
if err := rfc8259naturalnumber.Parse(runescanner, &natPart); nil != err {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if rfc8259naturalnumber.Nothing() == natPart {
|
||||||
|
return rfc8259errors.ErrInternalError("expected the result of a natural-number, but it is actually nothing")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// [ frac ]
|
||||||
|
{
|
||||||
|
var r rune
|
||||||
|
{
|
||||||
|
var err error
|
||||||
|
|
||||||
|
r, _, err = runescanner.ReadRune()
|
||||||
|
if nil != err {
|
||||||
|
if io.EOF == err {
|
||||||
|
natPart.WhenSomething(func(value string){
|
||||||
|
*dst = Something(value)
|
||||||
|
})
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return rfc8259errors.ErrProblemReadingRune(err)
|
||||||
|
}
|
||||||
|
if err := runescanner.UnreadRune(); nil != err {
|
||||||
|
return rfc8259errors.ErrProblemUnreadingRune(err, r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if '.' == r {
|
||||||
|
if err := rfc8259fractionalnumber.Parse(runescanner, &fracPart); nil != err {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// [ exp ]
|
||||||
|
{
|
||||||
|
var r rune
|
||||||
|
{
|
||||||
|
var err error
|
||||||
|
|
||||||
|
r, _, err = runescanner.ReadRune()
|
||||||
|
if nil != err {
|
||||||
|
if io.EOF == err {
|
||||||
|
*dst = Something(natPart.GetElse("") + fracPart.GetElse(""))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return rfc8259errors.ErrProblemReadingRune(err)
|
||||||
|
}
|
||||||
|
if err := runescanner.UnreadRune(); nil != err {
|
||||||
|
return rfc8259errors.ErrProblemUnreadingRune(err, r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if 'E' == r || 'e' == r {
|
||||||
|
if err := rfc8259exponentnumber.Parse(runescanner, &expPart); nil != err {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*dst = Something(natPart.GetElse("") + fracPart.GetElse("") + expPart.GetElse(""))
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
Reference in New Issue