summaryrefslogtreecommitdiffstats
path: root/vendor/go.mau.fi/whatsmeow/binary/node.go
diff options
context:
space:
mode:
authorWim <wim@42.be>2022-01-31 00:27:37 +0100
committerWim <wim@42.be>2022-03-20 14:57:48 +0100
commite3cafeaf9292f67459ff1d186f68283bfaedf2ae (patch)
treeb69c39620aa91dba695b3b935c6651c0fb37ce75 /vendor/go.mau.fi/whatsmeow/binary/node.go
parente7b193788a56ee7cdb02a87a9db0ad6724ef66d5 (diff)
downloadmatterbridge-msglm-e3cafeaf9292f67459ff1d186f68283bfaedf2ae.tar.gz
matterbridge-msglm-e3cafeaf9292f67459ff1d186f68283bfaedf2ae.tar.bz2
matterbridge-msglm-e3cafeaf9292f67459ff1d186f68283bfaedf2ae.zip
Add dependencies/vendor (whatsapp)
Diffstat (limited to 'vendor/go.mau.fi/whatsmeow/binary/node.go')
-rw-r--r--vendor/go.mau.fi/whatsmeow/binary/node.go83
1 files changed, 83 insertions, 0 deletions
diff --git a/vendor/go.mau.fi/whatsmeow/binary/node.go b/vendor/go.mau.fi/whatsmeow/binary/node.go
new file mode 100644
index 00000000..e09550f0
--- /dev/null
+++ b/vendor/go.mau.fi/whatsmeow/binary/node.go
@@ -0,0 +1,83 @@
+// Copyright (c) 2021 Tulir Asokan
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// Package binary implements encoding and decoding documents in WhatsApp's binary XML format.
+package binary
+
+// Attrs is a type alias for the attributes of an XML element (Node).
+type Attrs = map[string]interface{}
+
+// Node represents an XML element.
+type Node struct {
+ Tag string // The tag of the element.
+ Attrs Attrs // The attributes of the element.
+ Content interface{} // The content inside the element. Can be nil, a list of Nodes, or a byte array.
+}
+
+// GetChildren returns the Content of the node as a list of nodes. If the content is not a list of nodes, this returns nil.
+func (n *Node) GetChildren() []Node {
+ if n.Content == nil {
+ return nil
+ }
+ children, ok := n.Content.([]Node)
+ if !ok {
+ return nil
+ }
+ return children
+}
+
+// GetChildrenByTag returns the same list as GetChildren, but filters it by tag first.
+func (n *Node) GetChildrenByTag(tag string) (children []Node) {
+ for _, node := range n.GetChildren() {
+ if node.Tag == tag {
+ children = append(children, node)
+ }
+ }
+ return
+}
+
+// GetOptionalChildByTag finds the first child with the given tag and returns it.
+// Each provided tag will recurse in, so this is useful for getting a specific nested element.
+func (n *Node) GetOptionalChildByTag(tags ...string) (val Node, ok bool) {
+ val = *n
+Outer:
+ for _, tag := range tags {
+ for _, child := range val.GetChildren() {
+ if child.Tag == tag {
+ val = child
+ continue Outer
+ }
+ }
+ // If no matching children are found, return false
+ return
+ }
+ // All iterations of loop found a matching child, return it
+ ok = true
+ return
+}
+
+// GetChildByTag does the same thing as GetOptionalChildByTag, but returns the Node directly without the ok boolean.
+func (n *Node) GetChildByTag(tags ...string) Node {
+ node, _ := n.GetOptionalChildByTag(tags...)
+ return node
+}
+
+// Marshal encodes an XML element (Node) into WhatsApp's binary XML representation.
+func Marshal(n Node) ([]byte, error) {
+ w := newEncoder()
+ w.writeNode(n)
+ return w.getData(), nil
+}
+
+// Unmarshal decodes WhatsApp's binary XML representation into a Node.
+func Unmarshal(data []byte) (*Node, error) {
+ r := newDecoder(data)
+ n, err := r.readNode()
+ if err != nil {
+ return nil, err
+ }
+ return n, nil
+}