38 lines
720 B
Go
38 lines
720 B
Go
package parser
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
)
|
|
|
|
type JSONParser struct{}
|
|
|
|
func (p *JSONParser) Parse(body []byte) (*ParsedMessage, error) {
|
|
var raw map[string]interface{}
|
|
if err := json.Unmarshal(body, &raw); err != nil {
|
|
return nil, fmt.Errorf("json parse: %w", err)
|
|
}
|
|
|
|
event, ok := raw["event"].(string)
|
|
if !ok {
|
|
return nil, fmt.Errorf("json: missing 'event' field")
|
|
}
|
|
|
|
data, _ := raw["data"].(map[string]interface{})
|
|
if data == nil {
|
|
// If no "data" key, use the entire JSON as data (minus event)
|
|
data = make(map[string]interface{})
|
|
for k, v := range raw {
|
|
if k != "event" {
|
|
data[k] = v
|
|
}
|
|
}
|
|
}
|
|
|
|
return &ParsedMessage{
|
|
Event: event,
|
|
Data: data,
|
|
Body: string(body),
|
|
}, nil
|
|
}
|