2023-09-23 21:27:34 +00:00
package opt
import (
"encoding/json"
2023-09-27 00:43:16 +00:00
"sourcecode.social/reiver/go-erorr"
2023-09-23 21:27:34 +00:00
)
2023-11-06 17:22:54 +00:00
const errNilReceiver = erorr . Error ( "opt: nil receiver" )
2023-09-23 21:27:34 +00:00
var _ json . Unmarshaler = new ( Optional [ bool ] )
var _ json . Unmarshaler = new ( Optional [ string ] )
// UnmarshalJSON makes it so json.Unmarshaler is implemented.
func ( receiver * Optional [ T ] ) UnmarshalJSON ( data [ ] byte ) error {
2023-11-06 17:22:54 +00:00
if nil == receiver {
return errNilReceiver
}
2023-09-24 22:04:29 +00:00
switch interface { } ( & receiver . value ) . ( type ) {
2024-02-24 17:50:00 +00:00
case * bool , * int64 , * uint64 , * string , * json . Number , json . Unmarshaler :
2023-09-23 21:27:34 +00:00
// these are OK.
default :
2023-09-27 00:43:16 +00:00
return erorr . Errorf ( "opt: cannot unmarshal into something of type %T from JSON because pointer to parameterized type is ‘ %T’ rather than ‘ *bool’ , ‘ *string’ , or ‘ json.Unmarshaler’ " , receiver , & receiver . value )
2023-09-23 21:27:34 +00:00
}
{
var dst T
err := json . Unmarshal ( data , & dst )
if nil != err {
return err
}
* receiver = Something ( dst )
}
return nil
}