go-rfc8259/boolean/parse.go

70 lines
1.3 KiB
Go
Raw Normal View History

2023-11-03 23:21:12 +00:00
package rfc8259boolean
2023-11-03 21:29:39 +00:00
import (
"io"
"sourcecode.social/reiver/go-erorr"
)
2023-11-03 23:21:12 +00:00
// Parse tries to parse a JSON boolean literal — i.e., either 'false' or 'true'.
2023-11-03 21:29:39 +00:00
// 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
//
// // ...
//
2023-11-03 23:29:38 +00:00
// var value rfc8259boolean.Boolean
2023-11-03 21:29:39 +00:00
// err := rfc8259.ParseTrue(rs, &value)
//
// if nil != err {
// return err
// }
//
// fmt.Printf("value = %t\n", value)
2023-11-03 23:21:12 +00:00
func Parse(runescanner io.RuneScanner, dst *Boolean) error {
2023-11-03 21:29:39 +00:00
if nil == runescanner {
return errNilRuneScanner
}
if nil == dst {
return errNilDestination
}
var r rune
{
var err error
r, _, err = runescanner.ReadRune()
if nil != err {
if io.EOF == err {
return errUnexpectedEndOfFile
}
return errProblemReadingRune(err)
}
if err := runescanner.UnreadRune(); nil != err {
return errProblemUnreadingRune(err, r)
}
}
switch r {
case 'f':
if err := ParseFalse(runescanner); nil != err {
return err
}
2023-11-03 23:21:12 +00:00
*dst = False()
2023-11-03 21:29:39 +00:00
return nil
case 't':
if err := ParseTrue(runescanner); nil != err {
return err
}
2023-11-03 23:21:12 +00:00
*dst = True()
2023-11-03 21:29:39 +00:00
return nil
default:
return erorr.Errorf("rfc8259: problem when trying to parse JSON boolean literal — expected either 'false' or 'true' but first character was %q (%U)", r, r)
}
}