Files
Rango/pkg/message/parser.go
2026-08-13 20:20:47 +03:30

60 lines
1.3 KiB
Go

package message
import (
"encoding/json"
"errors"
"fmt"
"reflect"
)
func ParseRequest(msg []byte) (Request, error) {
request, err := Parse(msg)
if err != nil {
return request, err
}
return request, nil
}
func Parse(msg []byte) (Request, error) {
var v map[string]interface{}
var parsed Request
if err := json.Unmarshal(msg, &v); err != nil {
return parsed, fmt.Errorf("Could not parse message: %w", err)
}
switch v["event"] {
case "subscribe":
parsed.Method = "subscribe"
streams, ok := v["streams"]
if !ok {
return parsed, fmt.Errorf("No streams provided")
}
switch reflect.TypeOf(streams).Kind() {
case reflect.Slice:
streams := reflect.ValueOf(v["streams"])
for i := 0; i < streams.Len(); i++ {
parsed.Streams = append(parsed.Streams, streams.Index(i).Interface().(string))
}
}
case "unsubscribe":
parsed.Method = "unsubscribe"
streams, ok := v["streams"]
if !ok {
return parsed, fmt.Errorf("No streams provided")
}
switch reflect.TypeOf(streams).Kind() {
case reflect.Slice:
streams := reflect.ValueOf(v["streams"])
for i := 0; i < streams.Len(); i++ {
parsed.Streams = append(parsed.Streams, streams.Index(i).Interface().(string))
}
}
default:
return parsed, errors.New("Could not parse Type: Invalid event")
}
return parsed, nil
}