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
// }
//
2023-11-03 23:31:06 +00:00
// fmt.Printf("value = %#v\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 )
}
}