From 11414eaa0bd529d1addb2842db093448fe85d653 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 11 Aug 2023 14:20:40 +0300 Subject: [PATCH] Remove last thing in util package --- responses.go | 29 ++++++++++++++++++++++++----- util/marshal.go | 30 ------------------------------ 2 files changed, 24 insertions(+), 35 deletions(-) delete mode 100644 util/marshal.go diff --git a/responses.go b/responses.go index eb630d79..69eb4b8f 100644 --- a/responses.go +++ b/responses.go @@ -3,16 +3,17 @@ package mautrix import ( "bytes" "encoding/json" + "fmt" "reflect" "strconv" "strings" "github.com/tidwall/gjson" + "github.com/tidwall/sjson" "go.mau.fi/util/jsontime" "maunium.net/go/mautrix/event" "maunium.net/go/mautrix/id" - "maunium.net/go/mautrix/util" ) // RespWhoami is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#get_matrixclientv3accountwhoami @@ -270,8 +271,26 @@ type marshalableRespSync RespSync var syncPathsToDelete = []string{"account_data", "presence", "to_device", "device_lists", "device_one_time_keys_count", "rooms"} +// marshalAndDeleteEmpty marshals a JSON object, then uses gjson to delete empty objects at the given gjson paths. +func marshalAndDeleteEmpty(marshalable interface{}, paths []string) ([]byte, error) { + data, err := json.Marshal(marshalable) + if err != nil { + return nil, err + } + for _, path := range paths { + res := gjson.GetBytes(data, path) + if res.IsObject() && len(res.Raw) == 2 { + data, err = sjson.DeleteBytes(data, path) + if err != nil { + return nil, fmt.Errorf("failed to delete empty %s: %w", path, err) + } + } + } + return data, nil +} + func (rs *RespSync) MarshalJSON() ([]byte, error) { - return util.MarshalAndDeleteEmpty((*marshalableRespSync)(rs), syncPathsToDelete) + return marshalAndDeleteEmpty((*marshalableRespSync)(rs), syncPathsToDelete) } type DeviceLists struct { @@ -299,7 +318,7 @@ type marshalableSyncLeftRoom SyncLeftRoom var syncLeftRoomPathsToDelete = []string{"summary", "state", "timeline"} func (slr SyncLeftRoom) MarshalJSON() ([]byte, error) { - return util.MarshalAndDeleteEmpty((marshalableSyncLeftRoom)(slr), syncLeftRoomPathsToDelete) + return marshalAndDeleteEmpty((marshalableSyncLeftRoom)(slr), syncLeftRoomPathsToDelete) } type SyncJoinedRoom struct { @@ -324,7 +343,7 @@ type marshalableSyncJoinedRoom SyncJoinedRoom var syncJoinedRoomPathsToDelete = []string{"summary", "state", "timeline", "ephemeral", "account_data"} func (sjr SyncJoinedRoom) MarshalJSON() ([]byte, error) { - return util.MarshalAndDeleteEmpty((marshalableSyncJoinedRoom)(sjr), syncJoinedRoomPathsToDelete) + return marshalAndDeleteEmpty((marshalableSyncJoinedRoom)(sjr), syncJoinedRoomPathsToDelete) } type SyncInvitedRoom struct { @@ -337,7 +356,7 @@ type marshalableSyncInvitedRoom SyncInvitedRoom var syncInvitedRoomPathsToDelete = []string{"summary"} func (sir SyncInvitedRoom) MarshalJSON() ([]byte, error) { - return util.MarshalAndDeleteEmpty((marshalableSyncInvitedRoom)(sir), syncInvitedRoomPathsToDelete) + return marshalAndDeleteEmpty((marshalableSyncInvitedRoom)(sir), syncInvitedRoomPathsToDelete) } type SyncKnockedRoom struct { diff --git a/util/marshal.go b/util/marshal.go deleted file mode 100644 index 180adef2..00000000 --- a/util/marshal.go +++ /dev/null @@ -1,30 +0,0 @@ -package util - -import ( - "encoding/json" - "fmt" - - "github.com/tidwall/gjson" - "github.com/tidwall/sjson" -) - -// MarshalAndDeleteEmpty marshals a JSON object, then uses gjson to delete empty objects at the given gjson paths. -// -// This can be used as a convenient way to create a marshaler that omits empty non-pointer structs. -// See mautrix.RespSync for example. -func MarshalAndDeleteEmpty(marshalable interface{}, paths []string) ([]byte, error) { - data, err := json.Marshal(marshalable) - if err != nil { - return nil, err - } - for _, path := range paths { - res := gjson.GetBytes(data, path) - if res.IsObject() && len(res.Raw) == 2 { - data, err = sjson.DeleteBytes(data, path) - if err != nil { - return nil, fmt.Errorf("failed to delete empty %s: %w", path, err) - } - } - } - return data, nil -}