2018-04-22 12:52:36 +02:00
|
|
|
package sessions
|
|
|
|
|
|
|
|
import "encoding/json"
|
|
|
|
|
|
|
|
type (
|
|
|
|
// Marshaler is the common marshaler interface, used by transcoder.
|
|
|
|
Marshaler interface {
|
|
|
|
Marshal(interface{}) ([]byte, error)
|
|
|
|
}
|
|
|
|
// Unmarshaler is the common unmarshaler interface, used by transcoder.
|
|
|
|
Unmarshaler interface {
|
|
|
|
Unmarshal([]byte, interface{}) error
|
|
|
|
}
|
|
|
|
// Transcoder is the interface that transcoders should implement, it includes just the `Marshaler` and the `Unmarshaler`.
|
|
|
|
Transcoder interface {
|
|
|
|
Marshaler
|
|
|
|
Unmarshaler
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
// DefaultTranscoder is the default transcoder across databases, it's the JSON by default.
|
|
|
|
// Change it if you want a different serialization/deserialization inside your session databases (when `UseDatabase` is used).
|
2018-06-27 12:30:28 +02:00
|
|
|
var DefaultTranscoder Transcoder = defaultTranscoder{}
|
2018-04-22 12:52:36 +02:00
|
|
|
|
|
|
|
type defaultTranscoder struct{}
|
|
|
|
|
|
|
|
func (d defaultTranscoder) Marshal(value interface{}) ([]byte, error) {
|
|
|
|
if tr, ok := value.(Marshaler); ok {
|
|
|
|
return tr.Marshal(value)
|
|
|
|
}
|
|
|
|
|
|
|
|
if jsonM, ok := value.(json.Marshaler); ok {
|
|
|
|
return jsonM.MarshalJSON()
|
|
|
|
}
|
|
|
|
|
|
|
|
return json.Marshal(value)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d defaultTranscoder) Unmarshal(b []byte, outPtr interface{}) error {
|
|
|
|
if tr, ok := outPtr.(Unmarshaler); ok {
|
|
|
|
return tr.Unmarshal(b, outPtr)
|
|
|
|
}
|
|
|
|
|
|
|
|
if jsonUM, ok := outPtr.(json.Unmarshaler); ok {
|
|
|
|
return jsonUM.UnmarshalJSON(b)
|
|
|
|
}
|
|
|
|
|
|
|
|
return json.Unmarshal(b, outPtr)
|
|
|
|
}
|