35 lines
812 B
Go
35 lines
812 B
Go
package event
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
)
|
|
|
|
func Serialize(t string, v any) ([]byte, error) {
|
|
var wrapper struct {
|
|
Type string `json:"type"`
|
|
Payload any `json:"payload"`
|
|
}
|
|
wrapper.Type = t
|
|
wrapper.Payload = v
|
|
return json.Marshal(wrapper)
|
|
}
|
|
|
|
func Parse(b []byte, typesToPointers map[string]any) (string, error) {
|
|
var wrapper struct {
|
|
Type string `json:"type"`
|
|
Payload json.RawMessage `json:"payload"`
|
|
}
|
|
if err := json.Unmarshal(b, &wrapper); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
if ptr, ok := typesToPointers[wrapper.Type]; !ok {
|
|
return "", fmt.Errorf("cannot parse unknown type %s", wrapper.Type)
|
|
} else if err := json.Unmarshal(wrapper.Payload, ptr); err != nil {
|
|
return "", fmt.Errorf("failed parsing type %s: %w", wrapper.Type, err)
|
|
}
|
|
|
|
return wrapper.Type, nil
|
|
}
|