diff --git a/event.go b/event.go index 844925b..d9f6d44 100644 --- a/event.go +++ b/event.go @@ -43,10 +43,7 @@ const ( ) // Event Stringer interface, just returns the raw JSON as a string -func (evt *Event) String() string { - if evt == nil { - return "null" - } +func (evt Event) String() string { j, _ := json.Marshal(evt) return string(j) } diff --git a/event_aux.go b/event_aux.go index 3cac60f..710b5f8 100644 --- a/event_aux.go +++ b/event_aux.go @@ -4,8 +4,9 @@ import ( "bytes" "encoding/json" "fmt" - "github.com/valyala/fastjson" "time" + + "github.com/valyala/fastjson" ) func (evt *Event) UnmarshalJSON(payload []byte) error { @@ -17,7 +18,7 @@ func (evt *Event) UnmarshalJSON(payload []byte) error { obj, err := parsed.Object() if err != nil { - return fmt.Errorf("event is not an object") + return fmt.Errorf("event is not an object: %w", err) } // prepare this to receive any extra property that may serialized along with the event diff --git a/log_debug.go b/log_debug.go index 175aecd..084eb19 100644 --- a/log_debug.go +++ b/log_debug.go @@ -8,17 +8,33 @@ import ( ) func debugLog(str string, args ...any) { + // this is such that we don't modify the actual args that may be used outside of this function + printableArgs := make([]any, len(args)) + for i, v := range args { - switch v.(type) { - case []json.RawMessage: - j, _ := json.Marshal(v) - args[i] = string(j) - case []byte: - args[i] = string(v.([]byte)) - case fmt.Stringer: - args[i] = v.(fmt.Stringer).String() - } + printableArgs[i] = stringify(v) } - DebugLogger.Printf(str, args...) + DebugLogger.Printf(str, printableArgs...) +} + +func stringify(anything any) any { + switch v := anything.(type) { + case []any: + // this is such that we don't modify the actual values that may be used outside of this function + printableValues := make([]any, len(v)) + for i, subv := range v { + printableValues[i] = stringify(subv) + } + return printableValues + case []json.RawMessage: + j, _ := json.Marshal(v) + return string(j) + case []byte: + return string(v) + case fmt.Stringer: + return v.String() + default: + return v + } } diff --git a/relay.go b/relay.go index e9e0c20..c3f15fc 100644 --- a/relay.go +++ b/relay.go @@ -300,7 +300,7 @@ func (r *Relay) Publish(ctx context.Context, event Event) (Status, error) { defer r.okCallbacks.Delete(event.ID) // publish event - message := []interface{}{"EVENT", event} + message := []any{"EVENT", event} debugLog("{%s} sending %v\n", r.URL, message) if err := r.Connection.WriteJSON(message); err != nil { return status, err diff --git a/relay_test.go b/relay_test.go index d381f57..832bc7a 100644 --- a/relay_test.go +++ b/relay_test.go @@ -197,7 +197,7 @@ func parseEventMessage(t *testing.T, raw []json.RawMessage) Event { } var event Event if err := json.Unmarshal(raw[1], &event); err != nil { - t.Errorf("json.Unmarshal: %v", err) + t.Errorf("json.Unmarshal(`%s`): %v", string(raw[1]), err) } return event }