summaryrefslogtreecommitdiffstats
path: root/vendor/maunium.net/go/mautrix/util/marshal.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/maunium.net/go/mautrix/util/marshal.go')
-rw-r--r--vendor/maunium.net/go/mautrix/util/marshal.go30
1 files changed, 30 insertions, 0 deletions
diff --git a/vendor/maunium.net/go/mautrix/util/marshal.go b/vendor/maunium.net/go/mautrix/util/marshal.go
new file mode 100644
index 00000000..180adef2
--- /dev/null
+++ b/vendor/maunium.net/go/mautrix/util/marshal.go
@@ -0,0 +1,30 @@
+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
+}