forked from lug/matterbridge
		
	Update vendor (#1330)
This commit is contained in:
		
							
								
								
									
										77
									
								
								vendor/github.com/Jeffail/gabs/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										77
									
								
								vendor/github.com/Jeffail/gabs/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,21 +7,17 @@ It does nothing spectacular except for being fabulous.
 | 
			
		||||
 | 
			
		||||
https://godoc.org/github.com/Jeffail/gabs
 | 
			
		||||
 | 
			
		||||
## How to install:
 | 
			
		||||
## Install
 | 
			
		||||
 | 
			
		||||
``` bash
 | 
			
		||||
go get github.com/Jeffail/gabs
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## How to use
 | 
			
		||||
## Use
 | 
			
		||||
 | 
			
		||||
### Parsing and searching JSON
 | 
			
		||||
 | 
			
		||||
``` go
 | 
			
		||||
...
 | 
			
		||||
 | 
			
		||||
import "github.com/Jeffail/gabs"
 | 
			
		||||
 | 
			
		||||
jsonParsed, err := gabs.ParseJSON([]byte(`{
 | 
			
		||||
	"outter":{
 | 
			
		||||
		"inner":{
 | 
			
		||||
@@ -29,7 +25,10 @@ jsonParsed, err := gabs.ParseJSON([]byte(`{
 | 
			
		||||
			"value2":22
 | 
			
		||||
		},
 | 
			
		||||
		"alsoInner":{
 | 
			
		||||
			"value1":20
 | 
			
		||||
			"value1":20,
 | 
			
		||||
			"array1":[
 | 
			
		||||
				30, 40
 | 
			
		||||
			]
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}`))
 | 
			
		||||
@@ -43,26 +42,26 @@ value, ok = jsonParsed.Path("outter.inner.value1").Data().(float64)
 | 
			
		||||
value, ok = jsonParsed.Search("outter", "inner", "value1").Data().(float64)
 | 
			
		||||
// value == 10.0, ok == true
 | 
			
		||||
 | 
			
		||||
gObj, err := jsonParsed.JSONPointer("/outter/alsoInner/array1/1")
 | 
			
		||||
if err != nil {
 | 
			
		||||
	panic(err)
 | 
			
		||||
}
 | 
			
		||||
value, ok = gObj.Data().(float64)
 | 
			
		||||
// value == 40.0, ok == true
 | 
			
		||||
 | 
			
		||||
value, ok = jsonParsed.Path("does.not.exist").Data().(float64)
 | 
			
		||||
// value == 0.0, ok == false
 | 
			
		||||
 | 
			
		||||
exists := jsonParsed.Exists("outter", "inner", "value1")
 | 
			
		||||
// exists == true
 | 
			
		||||
 | 
			
		||||
exists := jsonParsed.Exists("does", "not", "exist")
 | 
			
		||||
// exists == false
 | 
			
		||||
 | 
			
		||||
exists := jsonParsed.ExistsP("does.not.exist")
 | 
			
		||||
// exists == false
 | 
			
		||||
 | 
			
		||||
...
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Iterating objects
 | 
			
		||||
 | 
			
		||||
``` go
 | 
			
		||||
...
 | 
			
		||||
 | 
			
		||||
jsonParsed, _ := gabs.ParseJSON([]byte(`{"object":{ "first": 1, "second": 2, "third": 3 }}`))
 | 
			
		||||
 | 
			
		||||
// S is shorthand for Search
 | 
			
		||||
@@ -70,24 +69,25 @@ children, _ := jsonParsed.S("object").ChildrenMap()
 | 
			
		||||
for key, child := range children {
 | 
			
		||||
	fmt.Printf("key: %v, value: %v\n", key, child.Data().(string))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
...
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Iterating arrays
 | 
			
		||||
 | 
			
		||||
``` go
 | 
			
		||||
...
 | 
			
		||||
 | 
			
		||||
jsonParsed, _ := gabs.ParseJSON([]byte(`{"array":[ "first", "second", "third" ]}`))
 | 
			
		||||
jsonParsed, err := gabs.ParseJSON([]byte(`{"array":[ "first", "second", "third" ]}`))
 | 
			
		||||
if err != nil {
 | 
			
		||||
	panic(err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// S is shorthand for Search
 | 
			
		||||
children, _ := jsonParsed.S("array").Children()
 | 
			
		||||
children, err := jsonParsed.S("array").Children()
 | 
			
		||||
if err != nil {
 | 
			
		||||
	panic(err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
for _, child := range children {
 | 
			
		||||
	fmt.Println(child.Data().(string))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
...
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Will print:
 | 
			
		||||
@@ -108,12 +108,11 @@ objects within the array, this returns a JSON array containing the results for
 | 
			
		||||
each element.
 | 
			
		||||
 | 
			
		||||
``` go
 | 
			
		||||
...
 | 
			
		||||
 | 
			
		||||
jsonParsed, _ := gabs.ParseJSON([]byte(`{"array":[ {"value":1}, {"value":2}, {"value":3} ]}`))
 | 
			
		||||
jsonParsed, err := gabs.ParseJSON([]byte(`{"array":[ {"value":1}, {"value":2}, {"value":3} ]}`))
 | 
			
		||||
if err != nil {
 | 
			
		||||
	panic(err)
 | 
			
		||||
}
 | 
			
		||||
fmt.Println(jsonParsed.Path("array.value").String())
 | 
			
		||||
 | 
			
		||||
...
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Will print:
 | 
			
		||||
@@ -125,8 +124,6 @@ Will print:
 | 
			
		||||
### Generating JSON
 | 
			
		||||
 | 
			
		||||
``` go
 | 
			
		||||
...
 | 
			
		||||
 | 
			
		||||
jsonObj := gabs.New()
 | 
			
		||||
// or gabs.Consume(jsonObject) to work on an existing map[string]interface{}
 | 
			
		||||
 | 
			
		||||
@@ -135,8 +132,6 @@ jsonObj.SetP(20, "outter.inner.value2")
 | 
			
		||||
jsonObj.Set(30, "outter", "inner2", "value3")
 | 
			
		||||
 | 
			
		||||
fmt.Println(jsonObj.String())
 | 
			
		||||
 | 
			
		||||
...
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Will print:
 | 
			
		||||
@@ -148,11 +143,7 @@ Will print:
 | 
			
		||||
To pretty-print:
 | 
			
		||||
 | 
			
		||||
``` go
 | 
			
		||||
...
 | 
			
		||||
 | 
			
		||||
fmt.Println(jsonObj.StringIndent("", "  "))
 | 
			
		||||
 | 
			
		||||
...
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Will print:
 | 
			
		||||
@@ -174,8 +165,6 @@ Will print:
 | 
			
		||||
### Generating Arrays
 | 
			
		||||
 | 
			
		||||
``` go
 | 
			
		||||
...
 | 
			
		||||
 | 
			
		||||
jsonObj := gabs.New()
 | 
			
		||||
 | 
			
		||||
jsonObj.Array("foo", "array")
 | 
			
		||||
@@ -186,8 +175,6 @@ jsonObj.ArrayAppend(20, "foo", "array")
 | 
			
		||||
jsonObj.ArrayAppend(30, "foo", "array")
 | 
			
		||||
 | 
			
		||||
fmt.Println(jsonObj.String())
 | 
			
		||||
 | 
			
		||||
...
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Will print:
 | 
			
		||||
@@ -199,8 +186,6 @@ Will print:
 | 
			
		||||
Working with arrays by index:
 | 
			
		||||
 | 
			
		||||
``` go
 | 
			
		||||
...
 | 
			
		||||
 | 
			
		||||
jsonObj := gabs.New()
 | 
			
		||||
 | 
			
		||||
// Create an array with the length of 3
 | 
			
		||||
@@ -217,8 +202,6 @@ jsonObj.S("foo").Index(2).SetIndex(2, 1)
 | 
			
		||||
jsonObj.S("foo").Index(2).SetIndex(3, 2)
 | 
			
		||||
 | 
			
		||||
fmt.Println(jsonObj.String())
 | 
			
		||||
 | 
			
		||||
...
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Will print:
 | 
			
		||||
@@ -232,8 +215,6 @@ Will print:
 | 
			
		||||
This is the easiest part:
 | 
			
		||||
 | 
			
		||||
``` go
 | 
			
		||||
...
 | 
			
		||||
 | 
			
		||||
jsonParsedObj, _ := gabs.ParseJSON([]byte(`{
 | 
			
		||||
	"outter":{
 | 
			
		||||
		"values":{
 | 
			
		||||
@@ -246,15 +227,11 @@ jsonParsedObj, _ := gabs.ParseJSON([]byte(`{
 | 
			
		||||
 | 
			
		||||
jsonOutput := jsonParsedObj.String()
 | 
			
		||||
// Becomes `{"outter":{"values":{"first":10,"second":11}},"outter2":"hello world"}`
 | 
			
		||||
 | 
			
		||||
...
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
And to serialize a specific segment is as simple as:
 | 
			
		||||
 | 
			
		||||
``` go
 | 
			
		||||
...
 | 
			
		||||
 | 
			
		||||
jsonParsedObj := gabs.ParseJSON([]byte(`{
 | 
			
		||||
	"outter":{
 | 
			
		||||
		"values":{
 | 
			
		||||
@@ -267,8 +244,6 @@ jsonParsedObj := gabs.ParseJSON([]byte(`{
 | 
			
		||||
 | 
			
		||||
jsonOutput := jsonParsedObj.Search("outter").String()
 | 
			
		||||
// Becomes `{"values":{"first":10,"second":11}}`
 | 
			
		||||
 | 
			
		||||
...
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Merge two containers
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										344
									
								
								vendor/github.com/Jeffail/gabs/gabs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										344
									
								
								vendor/github.com/Jeffail/gabs/gabs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -20,58 +20,85 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
THE SOFTWARE.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// Package gabs implements a simplified wrapper around creating and parsing JSON.
 | 
			
		||||
// Package gabs implements a simplified wrapper around creating and parsing
 | 
			
		||||
// unknown or dynamic JSON.
 | 
			
		||||
package gabs
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------------------------------------
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// ErrOutOfBounds - Index out of bounds.
 | 
			
		||||
	// ErrOutOfBounds indicates an index was out of bounds.
 | 
			
		||||
	ErrOutOfBounds = errors.New("out of bounds")
 | 
			
		||||
 | 
			
		||||
	// ErrNotObjOrArray - The target is not an object or array type.
 | 
			
		||||
	// ErrNotObjOrArray is returned when a target is not an object or array type
 | 
			
		||||
	// but needs to be for the intended operation.
 | 
			
		||||
	ErrNotObjOrArray = errors.New("not an object or array")
 | 
			
		||||
 | 
			
		||||
	// ErrNotObj - The target is not an object type.
 | 
			
		||||
	// ErrNotObj is returned when a target is not an object but needs to be for
 | 
			
		||||
	// the intended operation.
 | 
			
		||||
	ErrNotObj = errors.New("not an object")
 | 
			
		||||
 | 
			
		||||
	// ErrNotArray - The target is not an array type.
 | 
			
		||||
	// ErrNotArray is returned when a target is not an array but needs to be for
 | 
			
		||||
	// the intended operation.
 | 
			
		||||
	ErrNotArray = errors.New("not an array")
 | 
			
		||||
 | 
			
		||||
	// ErrPathCollision - Creating a path failed because an element collided with an existing value.
 | 
			
		||||
	// ErrPathCollision is returned when creating a path failed because an
 | 
			
		||||
	// element collided with an existing value.
 | 
			
		||||
	ErrPathCollision = errors.New("encountered value collision whilst building path")
 | 
			
		||||
 | 
			
		||||
	// ErrInvalidInputObj - The input value was not a map[string]interface{}.
 | 
			
		||||
	// ErrInvalidInputObj is returned when the input value was not a
 | 
			
		||||
	// map[string]interface{}.
 | 
			
		||||
	ErrInvalidInputObj = errors.New("invalid input object")
 | 
			
		||||
 | 
			
		||||
	// ErrInvalidInputText - The input data could not be parsed.
 | 
			
		||||
	// ErrInvalidInputText is returned when the input data could not be parsed.
 | 
			
		||||
	ErrInvalidInputText = errors.New("input text could not be parsed")
 | 
			
		||||
 | 
			
		||||
	// ErrInvalidPath - The filepath was not valid.
 | 
			
		||||
	// ErrInvalidPath is returned when the filepath was not valid.
 | 
			
		||||
	ErrInvalidPath = errors.New("invalid file path")
 | 
			
		||||
 | 
			
		||||
	// ErrInvalidBuffer - The input buffer contained an invalid JSON string
 | 
			
		||||
	// ErrInvalidBuffer is returned when the input buffer contained an invalid
 | 
			
		||||
	// JSON string.
 | 
			
		||||
	ErrInvalidBuffer = errors.New("input buffer contained invalid JSON")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------------------------------------
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// Container - an internal structure that holds a reference to the core interface map of the parsed
 | 
			
		||||
// json. Use this container to move context.
 | 
			
		||||
func resolveJSONPointerHierarchy(path string) ([]string, error) {
 | 
			
		||||
	if len(path) < 1 {
 | 
			
		||||
		return nil, errors.New("failed to resolve JSON pointer: path must not be empty")
 | 
			
		||||
	}
 | 
			
		||||
	if path[0] != '/' {
 | 
			
		||||
		return nil, errors.New("failed to resolve JSON pointer: path must begin with '/'")
 | 
			
		||||
	}
 | 
			
		||||
	hierarchy := strings.Split(path, "/")[1:]
 | 
			
		||||
	for i, v := range hierarchy {
 | 
			
		||||
		v = strings.Replace(v, "~1", "/", -1)
 | 
			
		||||
		v = strings.Replace(v, "~0", "~", -1)
 | 
			
		||||
		hierarchy[i] = v
 | 
			
		||||
	}
 | 
			
		||||
	return hierarchy, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// Container references a specific element within a JSON structure.
 | 
			
		||||
type Container struct {
 | 
			
		||||
	object interface{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Data - Return the contained data as an interface{}.
 | 
			
		||||
// Data returns the underlying interface{} of the target element in the JSON
 | 
			
		||||
// structure.
 | 
			
		||||
func (g *Container) Data() interface{} {
 | 
			
		||||
	if g == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
@@ -79,17 +106,18 @@ func (g *Container) Data() interface{} {
 | 
			
		||||
	return g.object
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------------------------------------
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// Path - Search for a value using dot notation.
 | 
			
		||||
// Path searches the JSON structure following a path in dot notation.
 | 
			
		||||
func (g *Container) Path(path string) *Container {
 | 
			
		||||
	return g.Search(strings.Split(path, ".")...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Search - Attempt to find and return an object within the JSON structure by specifying the
 | 
			
		||||
// hierarchy of field names to locate the target. If the search encounters an array and has not
 | 
			
		||||
// reached the end target then it will iterate each object of the array for the target and return
 | 
			
		||||
// all of the results in a JSON array.
 | 
			
		||||
// Search attempts to find and return an object within the JSON structure by
 | 
			
		||||
// following a provided hierarchy of field names to locate the target. If the
 | 
			
		||||
// search encounters an array and has not reached the end target then it will
 | 
			
		||||
// iterate each object of the array for the target and return all of the results
 | 
			
		||||
// in a JSON array.
 | 
			
		||||
func (g *Container) Search(hierarchy ...string) *Container {
 | 
			
		||||
	var object interface{}
 | 
			
		||||
 | 
			
		||||
@@ -120,22 +148,55 @@ func (g *Container) Search(hierarchy ...string) *Container {
 | 
			
		||||
	return &Container{object}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// S - Shorthand method, does the same thing as Search.
 | 
			
		||||
// JSONPointer parses a JSON pointer path (https://tools.ietf.org/html/rfc6901)
 | 
			
		||||
// and either returns a *gabs.Container containing the result or an error if the
 | 
			
		||||
// referenced item could not be found.
 | 
			
		||||
func (g *Container) JSONPointer(path string) (*Container, error) {
 | 
			
		||||
	hierarchy, err := resolveJSONPointerHierarchy(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	object := g.Data()
 | 
			
		||||
	for target := 0; target < len(hierarchy); target++ {
 | 
			
		||||
		pathSeg := hierarchy[target]
 | 
			
		||||
		if mmap, ok := object.(map[string]interface{}); ok {
 | 
			
		||||
			object, ok = mmap[pathSeg]
 | 
			
		||||
			if !ok {
 | 
			
		||||
				return nil, fmt.Errorf("failed to resolve JSON pointer: index '%v' value '%v' was not found", target, pathSeg)
 | 
			
		||||
			}
 | 
			
		||||
		} else if marray, ok := object.([]interface{}); ok {
 | 
			
		||||
			index, err := strconv.Atoi(pathSeg)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, fmt.Errorf("failed to resolve JSON pointer: could not parse index '%v' value '%v' into array index: %v", target, pathSeg, err)
 | 
			
		||||
			}
 | 
			
		||||
			if len(marray) <= index {
 | 
			
		||||
				return nil, fmt.Errorf("failed to resolve JSON pointer: index '%v' value '%v' exceeded target array size of '%v'", target, pathSeg, len(marray))
 | 
			
		||||
			}
 | 
			
		||||
			object = marray[index]
 | 
			
		||||
		} else {
 | 
			
		||||
			return &Container{nil}, fmt.Errorf("failed to resolve JSON pointer: index '%v' field '%v' was not found", target, pathSeg)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return &Container{object}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// S is a shorthand alias for Search.
 | 
			
		||||
func (g *Container) S(hierarchy ...string) *Container {
 | 
			
		||||
	return g.Search(hierarchy...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Exists - Checks whether a path exists.
 | 
			
		||||
// Exists checks whether a path exists.
 | 
			
		||||
func (g *Container) Exists(hierarchy ...string) bool {
 | 
			
		||||
	return g.Search(hierarchy...) != nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ExistsP - Checks whether a dot notation path exists.
 | 
			
		||||
// ExistsP checks whether a dot notation path exists.
 | 
			
		||||
func (g *Container) ExistsP(path string) bool {
 | 
			
		||||
	return g.Exists(strings.Split(path, ".")...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Index - Attempt to find and return an object within a JSON array by index.
 | 
			
		||||
// Index attempts to find and return an element within a JSON array by an index.
 | 
			
		||||
func (g *Container) Index(index int) *Container {
 | 
			
		||||
	if array, ok := g.Data().([]interface{}); ok {
 | 
			
		||||
		if index >= len(array) {
 | 
			
		||||
@@ -146,9 +207,9 @@ func (g *Container) Index(index int) *Container {
 | 
			
		||||
	return &Container{nil}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Children - Return a slice of all the children of the array. This also works for objects, however,
 | 
			
		||||
// the children returned for an object will NOT be in order and you lose the names of the returned
 | 
			
		||||
// objects this way.
 | 
			
		||||
// Children returns a slice of all children of an array element. This also works
 | 
			
		||||
// for objects, however, the children returned for an object will be in a random
 | 
			
		||||
// order and you lose the names of the returned objects this way.
 | 
			
		||||
func (g *Container) Children() ([]*Container, error) {
 | 
			
		||||
	if array, ok := g.Data().([]interface{}); ok {
 | 
			
		||||
		children := make([]*Container, len(array))
 | 
			
		||||
@@ -167,7 +228,7 @@ func (g *Container) Children() ([]*Container, error) {
 | 
			
		||||
	return nil, ErrNotObjOrArray
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ChildrenMap - Return a map of all the children of an object.
 | 
			
		||||
// ChildrenMap returns a map of all the children of an object element.
 | 
			
		||||
func (g *Container) ChildrenMap() (map[string]*Container, error) {
 | 
			
		||||
	if mmap, ok := g.Data().(map[string]interface{}); ok {
 | 
			
		||||
		children := map[string]*Container{}
 | 
			
		||||
@@ -179,11 +240,11 @@ func (g *Container) ChildrenMap() (map[string]*Container, error) {
 | 
			
		||||
	return nil, ErrNotObj
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------------------------------------
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// Set - Set the value of a field at a JSON path, any parts of the path that do not exist will be
 | 
			
		||||
// constructed, and if a collision occurs with a non object type whilst iterating the path an error
 | 
			
		||||
// is returned.
 | 
			
		||||
// Set the value of a field at a JSON path, any parts of the path that do not
 | 
			
		||||
// exist will be constructed, and if a collision occurs with a non object type
 | 
			
		||||
// whilst iterating the path an error is returned.
 | 
			
		||||
func (g *Container) Set(value interface{}, path ...string) (*Container, error) {
 | 
			
		||||
	if len(path) == 0 {
 | 
			
		||||
		g.object = value
 | 
			
		||||
@@ -209,12 +270,14 @@ func (g *Container) Set(value interface{}, path ...string) (*Container, error) {
 | 
			
		||||
	return &Container{object}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetP - Does the same as Set, but using a dot notation JSON path.
 | 
			
		||||
// SetP sets the value of a field at a JSON path using dot notation, any parts
 | 
			
		||||
// of the path that do not exist will be constructed, and if a collision occurs
 | 
			
		||||
// with a non object type whilst iterating the path an error is returned.
 | 
			
		||||
func (g *Container) SetP(value interface{}, path string) (*Container, error) {
 | 
			
		||||
	return g.Set(value, strings.Split(path, ".")...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetIndex - Set a value of an array element based on the index.
 | 
			
		||||
// SetIndex attempts to set a value of an array element based on an index.
 | 
			
		||||
func (g *Container) SetIndex(value interface{}, index int) (*Container, error) {
 | 
			
		||||
	if array, ok := g.Data().([]interface{}); ok {
 | 
			
		||||
		if index >= len(array) {
 | 
			
		||||
@@ -226,60 +289,112 @@ func (g *Container) SetIndex(value interface{}, index int) (*Container, error) {
 | 
			
		||||
	return &Container{nil}, ErrNotArray
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Object - Create a new JSON object at a path. Returns an error if the path contains a collision
 | 
			
		||||
// with a non object type.
 | 
			
		||||
// SetJSONPointer parses a JSON pointer path
 | 
			
		||||
// (https://tools.ietf.org/html/rfc6901) and sets the leaf to a value. Returns
 | 
			
		||||
// an error if the pointer could not be resolved due to missing fields.
 | 
			
		||||
func (g *Container) SetJSONPointer(value interface{}, path string) error {
 | 
			
		||||
	hierarchy, err := resolveJSONPointerHierarchy(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(hierarchy) == 0 {
 | 
			
		||||
		g.object = value
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	object := g.object
 | 
			
		||||
 | 
			
		||||
	for target := 0; target < len(hierarchy); target++ {
 | 
			
		||||
		pathSeg := hierarchy[target]
 | 
			
		||||
		if mmap, ok := object.(map[string]interface{}); ok {
 | 
			
		||||
			if target == len(hierarchy)-1 {
 | 
			
		||||
				object = value
 | 
			
		||||
				mmap[pathSeg] = object
 | 
			
		||||
			} else if object = mmap[pathSeg]; object == nil {
 | 
			
		||||
				return fmt.Errorf("failed to resolve JSON pointer: index '%v' value '%v' was not found", target, pathSeg)
 | 
			
		||||
			}
 | 
			
		||||
		} else if marray, ok := object.([]interface{}); ok {
 | 
			
		||||
			index, err := strconv.Atoi(pathSeg)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return fmt.Errorf("failed to resolve JSON pointer: could not parse index '%v' value '%v' into array index: %v", target, pathSeg, err)
 | 
			
		||||
			}
 | 
			
		||||
			if len(marray) <= index {
 | 
			
		||||
				return fmt.Errorf("failed to resolve JSON pointer: index '%v' value '%v' exceeded target array size of '%v'", target, pathSeg, len(marray))
 | 
			
		||||
			}
 | 
			
		||||
			if target == len(hierarchy)-1 {
 | 
			
		||||
				object = value
 | 
			
		||||
				marray[index] = object
 | 
			
		||||
			} else if object = marray[index]; object == nil {
 | 
			
		||||
				return fmt.Errorf("failed to resolve JSON pointer: index '%v' value '%v' was not found", target, pathSeg)
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			return fmt.Errorf("failed to resolve JSON pointer: index '%v' value '%v' was not found", target, pathSeg)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Object creates a new JSON object at a target path. Returns an error if the
 | 
			
		||||
// path contains a collision with a non object type.
 | 
			
		||||
func (g *Container) Object(path ...string) (*Container, error) {
 | 
			
		||||
	return g.Set(map[string]interface{}{}, path...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ObjectP - Does the same as Object, but using a dot notation JSON path.
 | 
			
		||||
// ObjectP creates a new JSON object at a target path using dot notation.
 | 
			
		||||
// Returns an error if the path contains a collision with a non object type.
 | 
			
		||||
func (g *Container) ObjectP(path string) (*Container, error) {
 | 
			
		||||
	return g.Object(strings.Split(path, ".")...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ObjectI - Create a new JSON object at an array index. Returns an error if the object is not an
 | 
			
		||||
// array or the index is out of bounds.
 | 
			
		||||
// ObjectI creates a new JSON object at an array index. Returns an error if the
 | 
			
		||||
// object is not an array or the index is out of bounds.
 | 
			
		||||
func (g *Container) ObjectI(index int) (*Container, error) {
 | 
			
		||||
	return g.SetIndex(map[string]interface{}{}, index)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Array - Create a new JSON array at a path. Returns an error if the path contains a collision with
 | 
			
		||||
// a non object type.
 | 
			
		||||
// Array creates a new JSON array at a path. Returns an error if the path
 | 
			
		||||
// contains a collision with a non object type.
 | 
			
		||||
func (g *Container) Array(path ...string) (*Container, error) {
 | 
			
		||||
	return g.Set([]interface{}{}, path...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ArrayP - Does the same as Array, but using a dot notation JSON path.
 | 
			
		||||
// ArrayP creates a new JSON array at a path using dot notation. Returns an
 | 
			
		||||
// error if the path contains a collision with a non object type.
 | 
			
		||||
func (g *Container) ArrayP(path string) (*Container, error) {
 | 
			
		||||
	return g.Array(strings.Split(path, ".")...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ArrayI - Create a new JSON array at an array index. Returns an error if the object is not an
 | 
			
		||||
// array or the index is out of bounds.
 | 
			
		||||
// ArrayI creates a new JSON array within an array at an index. Returns an error
 | 
			
		||||
// if the element is not an array or the index is out of bounds.
 | 
			
		||||
func (g *Container) ArrayI(index int) (*Container, error) {
 | 
			
		||||
	return g.SetIndex([]interface{}{}, index)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ArrayOfSize - Create a new JSON array of a particular size at a path. Returns an error if the
 | 
			
		||||
// path contains a collision with a non object type.
 | 
			
		||||
// ArrayOfSize creates a new JSON array of a particular size at a path. Returns
 | 
			
		||||
// an error if the path contains a collision with a non object type.
 | 
			
		||||
func (g *Container) ArrayOfSize(size int, path ...string) (*Container, error) {
 | 
			
		||||
	a := make([]interface{}, size)
 | 
			
		||||
	return g.Set(a, path...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ArrayOfSizeP - Does the same as ArrayOfSize, but using a dot notation JSON path.
 | 
			
		||||
// ArrayOfSizeP creates a new JSON array of a particular size at a path using
 | 
			
		||||
// dot notation. Returns an error if the path contains a collision with a non
 | 
			
		||||
// object type.
 | 
			
		||||
func (g *Container) ArrayOfSizeP(size int, path string) (*Container, error) {
 | 
			
		||||
	return g.ArrayOfSize(size, strings.Split(path, ".")...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ArrayOfSizeI - Create a new JSON array of a particular size at an array index. Returns an error
 | 
			
		||||
// if the object is not an array or the index is out of bounds.
 | 
			
		||||
// ArrayOfSizeI create a new JSON array of a particular size within an array at
 | 
			
		||||
// an index. Returns an error if the element is not an array or the index is out
 | 
			
		||||
// of bounds.
 | 
			
		||||
func (g *Container) ArrayOfSizeI(size, index int) (*Container, error) {
 | 
			
		||||
	a := make([]interface{}, size)
 | 
			
		||||
	return g.SetIndex(a, index)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Delete - Delete an element at a JSON path, an error is returned if the element does not exist.
 | 
			
		||||
// Delete an element at a path, an error is returned if the element does not
 | 
			
		||||
// exist.
 | 
			
		||||
func (g *Container) Delete(path ...string) error {
 | 
			
		||||
	var object interface{}
 | 
			
		||||
 | 
			
		||||
@@ -304,45 +419,40 @@ func (g *Container) Delete(path ...string) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeleteP - Does the same as Delete, but using a dot notation JSON path.
 | 
			
		||||
// DeleteP deletes an element at a path using dot notation, an error is returned
 | 
			
		||||
// if the element does not exist.
 | 
			
		||||
func (g *Container) DeleteP(path string) error {
 | 
			
		||||
	return g.Delete(strings.Split(path, ".")...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Merge - Merges two gabs-containers
 | 
			
		||||
func (g *Container) Merge(toMerge *Container) error {
 | 
			
		||||
// MergeFn merges two objects using a provided function to resolve collisions.
 | 
			
		||||
//
 | 
			
		||||
// The collision function receives two interface{} arguments, destination (the
 | 
			
		||||
// original object) and source (the object being merged into the destination).
 | 
			
		||||
// Which ever value is returned becomes the new value in the destination object
 | 
			
		||||
// at the location of the collision.
 | 
			
		||||
func (g *Container) MergeFn(source *Container, collisionFn func(destination, source interface{}) interface{}) error {
 | 
			
		||||
	var recursiveFnc func(map[string]interface{}, []string) error
 | 
			
		||||
	recursiveFnc = func(mmap map[string]interface{}, path []string) error {
 | 
			
		||||
		for key, value := range mmap {
 | 
			
		||||
			newPath := append(path, key)
 | 
			
		||||
			if g.Exists(newPath...) {
 | 
			
		||||
				target := g.Search(newPath...)
 | 
			
		||||
				existingData := g.Search(newPath...).Data()
 | 
			
		||||
				switch t := value.(type) {
 | 
			
		||||
				case map[string]interface{}:
 | 
			
		||||
					switch targetV := target.Data().(type) {
 | 
			
		||||
					switch existingVal := existingData.(type) {
 | 
			
		||||
					case map[string]interface{}:
 | 
			
		||||
						if err := recursiveFnc(t, newPath); err != nil {
 | 
			
		||||
							return err
 | 
			
		||||
						}
 | 
			
		||||
					case []interface{}:
 | 
			
		||||
						g.Set(append(targetV, t), newPath...)
 | 
			
		||||
					default:
 | 
			
		||||
						newSlice := append([]interface{}{}, targetV)
 | 
			
		||||
						g.Set(append(newSlice, t), newPath...)
 | 
			
		||||
					}
 | 
			
		||||
				case []interface{}:
 | 
			
		||||
					for _, valueOfSlice := range t {
 | 
			
		||||
						if err := g.ArrayAppend(valueOfSlice, newPath...); err != nil {
 | 
			
		||||
						if _, err := g.Set(collisionFn(existingVal, t), newPath...); err != nil {
 | 
			
		||||
							return err
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				default:
 | 
			
		||||
					switch targetV := target.Data().(type) {
 | 
			
		||||
					case []interface{}:
 | 
			
		||||
						g.Set(append(targetV, t), newPath...)
 | 
			
		||||
					default:
 | 
			
		||||
						newSlice := append([]interface{}{}, targetV)
 | 
			
		||||
						g.Set(append(newSlice, t), newPath...)
 | 
			
		||||
					if _, err := g.Set(collisionFn(existingData, t), newPath...); err != nil {
 | 
			
		||||
						return err
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
@@ -354,21 +464,48 @@ func (g *Container) Merge(toMerge *Container) error {
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	if mmap, ok := toMerge.Data().(map[string]interface{}); ok {
 | 
			
		||||
	if mmap, ok := source.Data().(map[string]interface{}); ok {
 | 
			
		||||
		return recursiveFnc(mmap, []string{})
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------------------------------------
 | 
			
		||||
// Merge a source object into an existing destination object. When a collision
 | 
			
		||||
// is found within the merged structures (both a source and destination object
 | 
			
		||||
// contain the same non-object keys) the result will be an array containing both
 | 
			
		||||
// values, where values that are already arrays will be expanded into the
 | 
			
		||||
// resulting array.
 | 
			
		||||
//
 | 
			
		||||
// It is possible to merge structures will different collision behaviours with
 | 
			
		||||
// MergeFn.
 | 
			
		||||
func (g *Container) Merge(source *Container) error {
 | 
			
		||||
	return g.MergeFn(source, func(dest, source interface{}) interface{} {
 | 
			
		||||
		destArr, destIsArray := dest.([]interface{})
 | 
			
		||||
		sourceArr, sourceIsArray := source.([]interface{})
 | 
			
		||||
		if destIsArray {
 | 
			
		||||
			if sourceIsArray {
 | 
			
		||||
				return append(destArr, sourceArr...)
 | 
			
		||||
			}
 | 
			
		||||
			return append(destArr, source)
 | 
			
		||||
		}
 | 
			
		||||
		if sourceIsArray {
 | 
			
		||||
			return append(append([]interface{}{}, dest), sourceArr...)
 | 
			
		||||
		}
 | 
			
		||||
		return []interface{}{dest, source}
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Array modification/search - Keeping these options simple right now, no need for anything more
 | 
			
		||||
complicated since you can just cast to []interface{}, modify and then reassign with Set.
 | 
			
		||||
Array modification/search - Keeping these options simple right now, no need for
 | 
			
		||||
anything more complicated since you can just cast to []interface{}, modify and
 | 
			
		||||
then reassign with Set.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// ArrayAppend - Append a value onto a JSON array. If the target is not a JSON array then it will be
 | 
			
		||||
// converted into one, with its contents as the first element of the array.
 | 
			
		||||
// ArrayAppend attempts to append a value onto a JSON array at a path. If the
 | 
			
		||||
// target is not a JSON array then it will be converted into one, with its
 | 
			
		||||
// original contents set to the first element of the array.
 | 
			
		||||
func (g *Container) ArrayAppend(value interface{}, path ...string) error {
 | 
			
		||||
	if array, ok := g.Search(path...).Data().([]interface{}); ok {
 | 
			
		||||
		array = append(array, value)
 | 
			
		||||
@@ -386,12 +523,15 @@ func (g *Container) ArrayAppend(value interface{}, path ...string) error {
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ArrayAppendP - Append a value onto a JSON array using a dot notation JSON path.
 | 
			
		||||
// ArrayAppendP attempts to append a value onto a JSON array at a path using dot
 | 
			
		||||
// notation. If the target is not a JSON array then it will be converted into
 | 
			
		||||
// one, with its original contents set to the first element of the array.
 | 
			
		||||
func (g *Container) ArrayAppendP(value interface{}, path string) error {
 | 
			
		||||
	return g.ArrayAppend(value, strings.Split(path, ".")...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ArrayRemove - Remove an element from a JSON array.
 | 
			
		||||
// ArrayRemove attempts to remove an element identified by an index from a JSON
 | 
			
		||||
// array at a path.
 | 
			
		||||
func (g *Container) ArrayRemove(index int, path ...string) error {
 | 
			
		||||
	if index < 0 {
 | 
			
		||||
		return ErrOutOfBounds
 | 
			
		||||
@@ -409,12 +549,14 @@ func (g *Container) ArrayRemove(index int, path ...string) error {
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ArrayRemoveP - Remove an element from a JSON array using a dot notation JSON path.
 | 
			
		||||
// ArrayRemoveP attempts to remove an element identified by an index from a JSON
 | 
			
		||||
// array at a path using dot notation.
 | 
			
		||||
func (g *Container) ArrayRemoveP(index int, path string) error {
 | 
			
		||||
	return g.ArrayRemove(index, strings.Split(path, ".")...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ArrayElement - Access an element from a JSON array.
 | 
			
		||||
// ArrayElement attempts to access an element by an index from a JSON array at a
 | 
			
		||||
// path.
 | 
			
		||||
func (g *Container) ArrayElement(index int, path ...string) (*Container, error) {
 | 
			
		||||
	if index < 0 {
 | 
			
		||||
		return &Container{nil}, ErrOutOfBounds
 | 
			
		||||
@@ -429,12 +571,13 @@ func (g *Container) ArrayElement(index int, path ...string) (*Container, error)
 | 
			
		||||
	return &Container{nil}, ErrOutOfBounds
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ArrayElementP - Access an element from a JSON array using a dot notation JSON path.
 | 
			
		||||
// ArrayElementP attempts to access an element by an index from a JSON array at
 | 
			
		||||
// a path using dot notation.
 | 
			
		||||
func (g *Container) ArrayElementP(index int, path string) (*Container, error) {
 | 
			
		||||
	return g.ArrayElement(index, strings.Split(path, ".")...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ArrayCount - Count the number of elements in a JSON array.
 | 
			
		||||
// ArrayCount counts the number of elements in a JSON array at a path.
 | 
			
		||||
func (g *Container) ArrayCount(path ...string) (int, error) {
 | 
			
		||||
	if array, ok := g.Search(path...).Data().([]interface{}); ok {
 | 
			
		||||
		return len(array), nil
 | 
			
		||||
@@ -442,14 +585,15 @@ func (g *Container) ArrayCount(path ...string) (int, error) {
 | 
			
		||||
	return 0, ErrNotArray
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ArrayCountP - Count the number of elements in a JSON array using a dot notation JSON path.
 | 
			
		||||
// ArrayCountP counts the number of elements in a JSON array at a path using dot
 | 
			
		||||
// notation.
 | 
			
		||||
func (g *Container) ArrayCountP(path string) (int, error) {
 | 
			
		||||
	return g.ArrayCount(strings.Split(path, ".")...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------------------------------------
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// Bytes - Converts the contained object back to a JSON []byte blob.
 | 
			
		||||
// Bytes marshals an element to a JSON []byte blob.
 | 
			
		||||
func (g *Container) Bytes() []byte {
 | 
			
		||||
	if g.Data() != nil {
 | 
			
		||||
		if bytes, err := json.Marshal(g.object); err == nil {
 | 
			
		||||
@@ -459,7 +603,8 @@ func (g *Container) Bytes() []byte {
 | 
			
		||||
	return []byte("{}")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BytesIndent - Converts the contained object to a JSON []byte blob formatted with prefix, indent.
 | 
			
		||||
// BytesIndent marshals an element to a JSON []byte blob formatted with a prefix
 | 
			
		||||
// and indent string.
 | 
			
		||||
func (g *Container) BytesIndent(prefix string, indent string) []byte {
 | 
			
		||||
	if g.object != nil {
 | 
			
		||||
		if bytes, err := json.MarshalIndent(g.object, prefix, indent); err == nil {
 | 
			
		||||
@@ -469,12 +614,13 @@ func (g *Container) BytesIndent(prefix string, indent string) []byte {
 | 
			
		||||
	return []byte("{}")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String - Converts the contained object to a JSON formatted string.
 | 
			
		||||
// String marshals an element to a JSON formatted string.
 | 
			
		||||
func (g *Container) String() string {
 | 
			
		||||
	return string(g.Bytes())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StringIndent - Converts the contained object back to a JSON formatted string with prefix, indent.
 | 
			
		||||
// StringIndent marshals an element to a JSON string formatted with a prefix and
 | 
			
		||||
// indent string.
 | 
			
		||||
func (g *Container) StringIndent(prefix string, indent string) string {
 | 
			
		||||
	return string(g.BytesIndent(prefix, indent))
 | 
			
		||||
}
 | 
			
		||||
@@ -496,10 +642,9 @@ func EncodeOptIndent(prefix string, indent string) EncodeOpt {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeJSON - Encodes the contained object back to a JSON formatted []byte
 | 
			
		||||
// using a variant list of modifier functions for the encoder being used.
 | 
			
		||||
// Functions for modifying the output are prefixed with EncodeOpt, e.g.
 | 
			
		||||
// EncodeOptHTMLEscape.
 | 
			
		||||
// EncodeJSON marshals an element to a JSON formatted []byte using a variant
 | 
			
		||||
// list of modifier functions for the encoder being used. Functions for
 | 
			
		||||
// modifying the output are prefixed with EncodeOpt, e.g. EncodeOptHTMLEscape.
 | 
			
		||||
func (g *Container) EncodeJSON(encodeOpts ...EncodeOpt) []byte {
 | 
			
		||||
	var b bytes.Buffer
 | 
			
		||||
	encoder := json.NewEncoder(&b)
 | 
			
		||||
@@ -517,17 +662,18 @@ func (g *Container) EncodeJSON(encodeOpts ...EncodeOpt) []byte {
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// New - Create a new gabs JSON object.
 | 
			
		||||
// New creates a new gabs JSON object.
 | 
			
		||||
func New() *Container {
 | 
			
		||||
	return &Container{map[string]interface{}{}}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Consume - Gobble up an already converted JSON object, or a fresh map[string]interface{} object.
 | 
			
		||||
// Consume an already unmarshalled JSON object (or a new map[string]interface{})
 | 
			
		||||
// into a *Container.
 | 
			
		||||
func Consume(root interface{}) (*Container, error) {
 | 
			
		||||
	return &Container{root}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseJSON - Convert a string into a representation of the parsed JSON.
 | 
			
		||||
// ParseJSON unmarshals a JSON byte slice into a *Container.
 | 
			
		||||
func ParseJSON(sample []byte) (*Container, error) {
 | 
			
		||||
	var gabs Container
 | 
			
		||||
 | 
			
		||||
@@ -538,7 +684,7 @@ func ParseJSON(sample []byte) (*Container, error) {
 | 
			
		||||
	return &gabs, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseJSONDecoder - Convert a json.Decoder into a representation of the parsed JSON.
 | 
			
		||||
// ParseJSONDecoder applies a json.Decoder to a *Container.
 | 
			
		||||
func ParseJSONDecoder(decoder *json.Decoder) (*Container, error) {
 | 
			
		||||
	var gabs Container
 | 
			
		||||
 | 
			
		||||
@@ -549,7 +695,7 @@ func ParseJSONDecoder(decoder *json.Decoder) (*Container, error) {
 | 
			
		||||
	return &gabs, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseJSONFile - Read a file and convert into a representation of the parsed JSON.
 | 
			
		||||
// ParseJSONFile reads a file and unmarshals the contents into a *Container.
 | 
			
		||||
func ParseJSONFile(path string) (*Container, error) {
 | 
			
		||||
	if len(path) > 0 {
 | 
			
		||||
		cBytes, err := ioutil.ReadFile(path)
 | 
			
		||||
@@ -567,7 +713,7 @@ func ParseJSONFile(path string) (*Container, error) {
 | 
			
		||||
	return nil, ErrInvalidPath
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseJSONBuffer - Read the contents of a buffer into a representation of the parsed JSON.
 | 
			
		||||
// ParseJSONBuffer reads a buffer and unmarshals the contents into a *Container.
 | 
			
		||||
func ParseJSONBuffer(buffer io.Reader) (*Container, error) {
 | 
			
		||||
	var gabs Container
 | 
			
		||||
	jsonDecoder := json.NewDecoder(buffer)
 | 
			
		||||
@@ -578,4 +724,4 @@ func ParseJSONBuffer(buffer io.Reader) (*Container, error) {
 | 
			
		||||
	return &gabs, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------------------------------------
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/Jeffail/gabs/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/Jeffail/gabs/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
module github.com/Jeffail/gabs
 | 
			
		||||
							
								
								
									
										32
									
								
								vendor/github.com/Rhymen/go-whatsapp/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								vendor/github.com/Rhymen/go-whatsapp/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,23 +7,21 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	ErrAlreadyConnected           = errors.New("already connected")
 | 
			
		||||
	ErrAlreadyLoggedIn            = errors.New("already logged in")
 | 
			
		||||
	ErrInvalidSession             = errors.New("invalid session")
 | 
			
		||||
	ErrLoginInProgress            = errors.New("login or restore already running")
 | 
			
		||||
	ErrNotConnected               = errors.New("not connected")
 | 
			
		||||
	ErrInvalidWsData              = errors.New("received invalid data")
 | 
			
		||||
	ErrInvalidWsState             = errors.New("can't handle binary data when not logged in")
 | 
			
		||||
	ErrConnectionTimeout          = errors.New("connection timed out")
 | 
			
		||||
	ErrMissingMessageTag          = errors.New("no messageTag specified or to short")
 | 
			
		||||
	ErrInvalidHmac                = errors.New("invalid hmac")
 | 
			
		||||
	ErrInvalidServerResponse      = errors.New("invalid response received from server")
 | 
			
		||||
	ErrServerRespondedWith404     = errors.New("server responded with status 404")
 | 
			
		||||
	ErrMediaDownloadFailedWith404 = errors.New("download failed with status code 404")
 | 
			
		||||
	ErrMediaDownloadFailedWith410 = errors.New("download failed with status code 410")
 | 
			
		||||
	ErrInvalidWebsocket           = errors.New("invalid websocket")
 | 
			
		||||
	ErrMessageTypeNotImplemented  = errors.New("message type not implemented")
 | 
			
		||||
	ErrOptionsNotProvided         = errors.New("new conn options not provided")
 | 
			
		||||
	ErrAlreadyConnected          = errors.New("already connected")
 | 
			
		||||
	ErrAlreadyLoggedIn           = errors.New("already logged in")
 | 
			
		||||
	ErrInvalidSession            = errors.New("invalid session")
 | 
			
		||||
	ErrLoginInProgress           = errors.New("login or restore already running")
 | 
			
		||||
	ErrNotConnected              = errors.New("not connected")
 | 
			
		||||
	ErrInvalidWsData             = errors.New("received invalid data")
 | 
			
		||||
	ErrInvalidWsState            = errors.New("can't handle binary data when not logged in")
 | 
			
		||||
	ErrConnectionTimeout         = errors.New("connection timed out")
 | 
			
		||||
	ErrMissingMessageTag         = errors.New("no messageTag specified or to short")
 | 
			
		||||
	ErrInvalidHmac               = errors.New("invalid hmac")
 | 
			
		||||
	ErrInvalidServerResponse     = errors.New("invalid response received from server")
 | 
			
		||||
	ErrServerRespondedWith404    = errors.New("server responded with status 404")
 | 
			
		||||
	ErrInvalidWebsocket          = errors.New("invalid websocket")
 | 
			
		||||
	ErrMessageTypeNotImplemented = errors.New("message type not implemented")
 | 
			
		||||
	ErrOptionsNotProvided        = errors.New("new conn options not provided")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type ErrConnectionFailed struct {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										33
									
								
								vendor/github.com/Rhymen/go-whatsapp/media.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								vendor/github.com/Rhymen/go-whatsapp/media.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -10,6 +10,7 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"net"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"time"
 | 
			
		||||
@@ -71,16 +72,10 @@ func downloadMedia(url string) (file []byte, mac []byte, err error) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if resp.StatusCode != 200 {
 | 
			
		||||
		if resp.StatusCode == 404 {
 | 
			
		||||
			return nil, nil, ErrMediaDownloadFailedWith404
 | 
			
		||||
		}
 | 
			
		||||
		if resp.StatusCode == 410 {
 | 
			
		||||
			return nil, nil, ErrMediaDownloadFailedWith410
 | 
			
		||||
		}
 | 
			
		||||
	defer resp.Body.Close()
 | 
			
		||||
	if resp.StatusCode != http.StatusOK {
 | 
			
		||||
		return nil, nil, fmt.Errorf("download failed with status code %d", resp.StatusCode)
 | 
			
		||||
	}
 | 
			
		||||
	defer resp.Body.Close()
 | 
			
		||||
	if resp.ContentLength <= 10 {
 | 
			
		||||
		return nil, nil, fmt.Errorf("file to short")
 | 
			
		||||
	}
 | 
			
		||||
@@ -101,8 +96,8 @@ type MediaConn struct {
 | 
			
		||||
		Hosts []struct {
 | 
			
		||||
			Hostname string `json:"hostname"`
 | 
			
		||||
			IPs      []struct {
 | 
			
		||||
				IP4 string `json:"ip4"`
 | 
			
		||||
				IP6 string `json:"ip6"`
 | 
			
		||||
				IP4 net.IP `json:"ip4"`
 | 
			
		||||
				IP6 net.IP `json:"ip6"`
 | 
			
		||||
			} `json:"ips"`
 | 
			
		||||
		} `json:"hosts"`
 | 
			
		||||
	} `json:"media_conn"`
 | 
			
		||||
@@ -125,21 +120,17 @@ func (wac *Conn) queryMediaConn() (hostname, auth string, ttl int, err error) {
 | 
			
		||||
		return "", "", 0, fmt.Errorf("query media conn timed out")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if resp.Status != 200 {
 | 
			
		||||
	if resp.Status != http.StatusOK {
 | 
			
		||||
		return "", "", 0, fmt.Errorf("query media conn responded with %d", resp.Status)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var host string
 | 
			
		||||
	for _, h := range resp.MediaConn.Hosts {
 | 
			
		||||
		if h.Hostname != "" {
 | 
			
		||||
			host = h.Hostname
 | 
			
		||||
			break
 | 
			
		||||
			return h.Hostname, resp.MediaConn.Auth, resp.MediaConn.TTL, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if host == "" {
 | 
			
		||||
		return "", "", 0, fmt.Errorf("query media conn responded with no host")
 | 
			
		||||
	}
 | 
			
		||||
	return host, resp.MediaConn.Auth, resp.MediaConn.TTL, nil
 | 
			
		||||
 | 
			
		||||
	return "", "", 0, fmt.Errorf("query media conn responded with no host")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var mediaTypeMap = map[MediaType]string{
 | 
			
		||||
@@ -202,7 +193,7 @@ func (wac *Conn) Upload(reader io.Reader, appInfo MediaType) (downloadURL string
 | 
			
		||||
 | 
			
		||||
	body := bytes.NewReader(append(enc, mac...))
 | 
			
		||||
 | 
			
		||||
	req, err := http.NewRequest("POST", uploadURL.String(), body)
 | 
			
		||||
	req, err := http.NewRequest(http.MethodPost, uploadURL.String(), body)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", nil, nil, nil, 0, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -222,7 +213,9 @@ func (wac *Conn) Upload(reader io.Reader, appInfo MediaType) (downloadURL string
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var jsonRes map[string]string
 | 
			
		||||
	json.NewDecoder(res.Body).Decode(&jsonRes)
 | 
			
		||||
	if err := json.NewDecoder(res.Body).Decode(&jsonRes); err != nil {
 | 
			
		||||
		return "", nil, nil, nil, 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return jsonRes["url"], mediaKey, fileEncSha256, fileSha256, fileLength, nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								vendor/github.com/Rhymen/go-whatsapp/read.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/Rhymen/go-whatsapp/read.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,6 +7,7 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/Rhymen/go-whatsapp/binary"
 | 
			
		||||
@@ -111,16 +112,16 @@ func (wac *Conn) decryptBinaryMessage(msg []byte) (*binary.Node, error) {
 | 
			
		||||
		var response struct {
 | 
			
		||||
			Status int `json:"status"`
 | 
			
		||||
		}
 | 
			
		||||
		err := json.Unmarshal(msg, &response)
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			if response.Status == 404 {
 | 
			
		||||
 | 
			
		||||
		if err := json.Unmarshal(msg, &response); err == nil {
 | 
			
		||||
			if response.Status == http.StatusNotFound {
 | 
			
		||||
				return nil, ErrServerRespondedWith404
 | 
			
		||||
			}
 | 
			
		||||
			return nil, errors.New(fmt.Sprintf("server responded with %d", response.Status))
 | 
			
		||||
		} else {
 | 
			
		||||
			return nil, ErrInvalidServerResponse
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return nil, ErrInvalidServerResponse
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	h2.Write([]byte(msg[32:]))
 | 
			
		||||
	if !hmac.Equal(h2.Sum(nil), msg[:32]) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										37
									
								
								vendor/github.com/matterbridge/Rocket.Chat.Go.SDK/models/message.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/matterbridge/Rocket.Chat.Go.SDK/models/message.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -66,6 +66,9 @@ type Attachment struct {
 | 
			
		||||
	AudioURL string `json:"audio_url,omitempty"`
 | 
			
		||||
	VideoURL string `json:"video_url,omitempty"`
 | 
			
		||||
 | 
			
		||||
	Actions                []AttachmentAction               `json:"actions,omitempty"`
 | 
			
		||||
	ActionButtonsAlignment AttachmentActionButtonsAlignment `json:"button_alignment,omitempty"`
 | 
			
		||||
 | 
			
		||||
	Fields []AttachmentField `json:"fields,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -77,3 +80,37 @@ type AttachmentField struct {
 | 
			
		||||
	Title string `json:"title"`
 | 
			
		||||
	Value string `json:"value"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type AttachmentActionType string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	AttachmentActionTypeButton AttachmentActionType = "button"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// AttachmentAction are action buttons on message attachments
 | 
			
		||||
type AttachmentAction struct {
 | 
			
		||||
	Type               AttachmentActionType  `json:"type"`
 | 
			
		||||
	Text               string                `json:"text"`
 | 
			
		||||
	Url                string                `json:"url"`
 | 
			
		||||
	ImageURL           string                `json:"image_url"`
 | 
			
		||||
	IsWebView          bool                  `json:"is_webview"`
 | 
			
		||||
	WebviewHeightRatio string                `json:"webview_height_ratio"`
 | 
			
		||||
	Msg                string                `json:"msg"`
 | 
			
		||||
	MsgInChatWindow    bool                  `json:"msg_in_chat_window"`
 | 
			
		||||
	MsgProcessingType  MessageProcessingType `json:"msg_processing_type"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AttachmentActionButtonAlignment configures how the actions buttons will be aligned
 | 
			
		||||
type AttachmentActionButtonsAlignment string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	ActionButtonAlignVertical   AttachmentActionButtonsAlignment = "vertical"
 | 
			
		||||
	ActionButtonAlignHorizontal AttachmentActionButtonsAlignment = "horizontal"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type MessageProcessingType string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	ProcessingTypeSendMessage        MessageProcessingType = "sendMessage"
 | 
			
		||||
	ProcessingTypeRespondWithMessage MessageProcessingType = "respondWithMessage"
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/matterbridge/Rocket.Chat.Go.SDK/models/user.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/matterbridge/Rocket.Chat.Go.SDK/models/user.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -14,6 +14,7 @@ type CreateUserRequest struct {
 | 
			
		||||
	Email        string            `json:"email"`
 | 
			
		||||
	Password     string            `json:"password"`
 | 
			
		||||
	Username     string            `json:"username"`
 | 
			
		||||
	Roles        []string          `json:"roles,omitempty"`
 | 
			
		||||
	CustomFields map[string]string `json:"customFields,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/matterbridge/Rocket.Chat.Go.SDK/realtime/channels.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/matterbridge/Rocket.Chat.Go.SDK/realtime/channels.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -72,6 +72,7 @@ func (c *Client) GetChannelSubscriptions() ([]models.ChannelSubscription, error)
 | 
			
		||||
			DisplayName: stringOrZero(sub.Path("fname").Data()),
 | 
			
		||||
			Open:        sub.Path("open").Data().(bool),
 | 
			
		||||
			Type:        stringOrZero(sub.Path("t").Data()),
 | 
			
		||||
			RoomId:      stringOrZero(sub.Path("rid").Data()),
 | 
			
		||||
			User: models.User{
 | 
			
		||||
				ID:       stringOrZero(sub.Path("u._id").Data()),
 | 
			
		||||
				UserName: stringOrZero(sub.Path("u.username").Data()),
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										54
									
								
								vendor/github.com/matterbridge/Rocket.Chat.Go.SDK/realtime/messages.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										54
									
								
								vendor/github.com/matterbridge/Rocket.Chat.Go.SDK/realtime/messages.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,6 +2,7 @@ package realtime
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"log"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
@@ -16,27 +17,54 @@ const (
 | 
			
		||||
	default_buffer_size = 100
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var messageListenerAdded = false
 | 
			
		||||
 | 
			
		||||
// NewMessage creates basic message with an ID, a RoomID, and a Msg
 | 
			
		||||
// Takes channel and text
 | 
			
		||||
func (c *Client) NewMessage(channel *models.Channel, text string) *models.Message {
 | 
			
		||||
	return &models.Message{
 | 
			
		||||
		ID:     c.newRandomId(),
 | 
			
		||||
		RoomID: channel.ID,
 | 
			
		||||
		Msg:    text,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LoadHistory loads history
 | 
			
		||||
// Takes roomId
 | 
			
		||||
// Takes roomID
 | 
			
		||||
//
 | 
			
		||||
// https://rocket.chat/docs/developer-guides/realtime-api/method-calls/load-history
 | 
			
		||||
func (c *Client) LoadHistory(roomId string) error {
 | 
			
		||||
	_, err := c.ddp.Call("loadHistory", roomId)
 | 
			
		||||
func (c *Client) LoadHistory(roomID string) ([]models.Message, error) {
 | 
			
		||||
	m, err := c.ddp.Call("loadHistory", roomID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
	history := m.(map[string]interface{})
 | 
			
		||||
 | 
			
		||||
	document, _ := gabs.Consume(history["messages"])
 | 
			
		||||
	msgs, err := document.Children()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Printf("response is in an unexpected format: %v", err)
 | 
			
		||||
		return make([]models.Message, 0), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	messages := make([]models.Message, len(msgs))
 | 
			
		||||
 | 
			
		||||
	for i, arg := range msgs {
 | 
			
		||||
		messages[i] = *getMessageFromDocument(arg)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// log.Println(messages)
 | 
			
		||||
 | 
			
		||||
	return messages, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SendMessage sends message to channel
 | 
			
		||||
// takes channel and message
 | 
			
		||||
// takes message
 | 
			
		||||
//
 | 
			
		||||
// https://rocket.chat/docs/developer-guides/realtime-api/method-calls/send-message
 | 
			
		||||
func (c *Client) SendMessage(m *models.Message) (*models.Message, error) {
 | 
			
		||||
	m.ID = c.newRandomId()
 | 
			
		||||
 | 
			
		||||
	rawResponse, err := c.ddp.Call("sendMessage", m)
 | 
			
		||||
func (c *Client) SendMessage(message *models.Message) (*models.Message, error) {
 | 
			
		||||
	rawResponse, err := c.ddp.Call("sendMessage", message)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -158,8 +186,10 @@ func (c *Client) SubscribeToMessageStream(channel *models.Channel, msgChannel ch
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// msgChannel := make(chan models.Message, default_buffer_size)
 | 
			
		||||
	c.ddp.CollectionByName("stream-room-messages").AddUpdateListener(messageExtractor{msgChannel, "update"})
 | 
			
		||||
	if !messageListenerAdded {
 | 
			
		||||
		c.ddp.CollectionByName("stream-room-messages").AddUpdateListener(messageExtractor{msgChannel, "update"})
 | 
			
		||||
		messageListenerAdded = true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								vendor/github.com/matterbridge/Rocket.Chat.Go.SDK/rest/channels.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/matterbridge/Rocket.Chat.Go.SDK/rest/channels.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -56,9 +56,17 @@ func (c *Client) LeaveChannel(channel *models.Channel) error {
 | 
			
		||||
// https://rocket.chat/docs/developer-guides/rest-api/channels/info
 | 
			
		||||
func (c *Client) GetChannelInfo(channel *models.Channel) (*models.Channel, error) {
 | 
			
		||||
	response := new(ChannelResponse)
 | 
			
		||||
	if err := c.Get("channels.info", url.Values{"roomId": []string{channel.ID}}, response); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	switch {
 | 
			
		||||
	case channel.Name != "" && channel.ID == "":
 | 
			
		||||
		if err := c.Get("channels.info", url.Values{"roomName": []string{channel.Name}}, response); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		if err := c.Get("channels.info", url.Values{"roomId": []string{channel.ID}}, response); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &response.Channel, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										33
									
								
								vendor/github.com/matterbridge/Rocket.Chat.Go.SDK/rest/permissions.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								vendor/github.com/matterbridge/Rocket.Chat.Go.SDK/rest/permissions.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
package rest
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
 | 
			
		||||
	"github.com/matterbridge/Rocket.Chat.Go.SDK/models"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type UpdatePermissionsRequest struct {
 | 
			
		||||
	Permissions []models.Permission `json:"permissions"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type UpdatePermissionsResponse struct {
 | 
			
		||||
	Status
 | 
			
		||||
	Permissions []models.Permission `json:"permissions"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UpdatePermissions updates permissions
 | 
			
		||||
//
 | 
			
		||||
// https://rocket.chat/docs/developer-guides/rest-api/permissions/update/
 | 
			
		||||
func (c *Client) UpdatePermissions(req *UpdatePermissionsRequest) (*UpdatePermissionsResponse, error) {
 | 
			
		||||
	body, err := json.Marshal(req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	response := new(UpdatePermissionsResponse)
 | 
			
		||||
	if err := c.Post("permissions.update", bytes.NewBuffer(body), response); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return response, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								vendor/github.com/mattermost/mattermost-server/v5/model/thread.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/mattermost/mattermost-server/v5/model/thread.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -25,11 +25,12 @@ func (o *Thread) Etag() string {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ThreadMembership struct {
 | 
			
		||||
	PostId      string `json:"post_id"`
 | 
			
		||||
	UserId      string `json:"user_id"`
 | 
			
		||||
	Following   bool   `json:"following"`
 | 
			
		||||
	LastViewed  int64  `json:"last_view_at"`
 | 
			
		||||
	LastUpdated int64  `json:"last_update_at"`
 | 
			
		||||
	PostId         string `json:"post_id"`
 | 
			
		||||
	UserId         string `json:"user_id"`
 | 
			
		||||
	Following      bool   `json:"following"`
 | 
			
		||||
	LastViewed     int64  `json:"last_view_at"`
 | 
			
		||||
	LastUpdated    int64  `json:"last_update_at"`
 | 
			
		||||
	UnreadMentions int64  `json:"unread_mentions"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *ThreadMembership) ToJson() string {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/russross/blackfriday/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/russross/blackfriday/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -3,6 +3,7 @@ language: go
 | 
			
		||||
go:
 | 
			
		||||
  - "1.9.x"
 | 
			
		||||
  - "1.10.x"
 | 
			
		||||
  - "1.11.x"
 | 
			
		||||
  - tip
 | 
			
		||||
matrix:
 | 
			
		||||
  fast_finish: true
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										53
									
								
								vendor/github.com/russross/blackfriday/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										53
									
								
								vendor/github.com/russross/blackfriday/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,29 +1,28 @@
 | 
			
		||||
Blackfriday is distributed under the Simplified BSD License:
 | 
			
		||||
 | 
			
		||||
> Copyright © 2011 Russ Ross
 | 
			
		||||
> All rights reserved.
 | 
			
		||||
>
 | 
			
		||||
> Redistribution and use in source and binary forms, with or without
 | 
			
		||||
> modification, are permitted provided that the following conditions
 | 
			
		||||
> are met:
 | 
			
		||||
>
 | 
			
		||||
> 1.  Redistributions of source code must retain the above copyright
 | 
			
		||||
>     notice, this list of conditions and the following disclaimer.
 | 
			
		||||
>
 | 
			
		||||
> 2.  Redistributions in binary form must reproduce the above
 | 
			
		||||
>     copyright notice, this list of conditions and the following
 | 
			
		||||
>     disclaimer in the documentation and/or other materials provided with
 | 
			
		||||
>     the distribution.
 | 
			
		||||
>
 | 
			
		||||
> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
> "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
> LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 | 
			
		||||
> FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 | 
			
		||||
> COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
			
		||||
> INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 | 
			
		||||
> BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
> LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 | 
			
		||||
> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
			
		||||
> LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 | 
			
		||||
> ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
> POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
Copyright © 2011 Russ Ross
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without
 | 
			
		||||
modification, are permitted provided that the following conditions
 | 
			
		||||
are met:
 | 
			
		||||
 | 
			
		||||
1.  Redistributions of source code must retain the above copyright
 | 
			
		||||
    notice, this list of conditions and the following disclaimer.
 | 
			
		||||
2.  Redistributions in binary form must reproduce the above
 | 
			
		||||
    copyright notice, this list of conditions and the following
 | 
			
		||||
    disclaimer in the documentation and/or other materials provided with
 | 
			
		||||
    the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 | 
			
		||||
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 | 
			
		||||
COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
			
		||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 | 
			
		||||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 | 
			
		||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
			
		||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 | 
			
		||||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										93
									
								
								vendor/github.com/russross/blackfriday/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										93
									
								
								vendor/github.com/russross/blackfriday/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
Blackfriday
 | 
			
		||||
[![Build Status][BuildSVG]][BuildURL]
 | 
			
		||||
[![Godoc][GodocV2SVG]][GodocV2URL]
 | 
			
		||||
[![Build Status][BuildV2SVG]][BuildV2URL]
 | 
			
		||||
[![PkgGoDev][PkgGoDevV2SVG]][PkgGoDevV2URL]
 | 
			
		||||
===========
 | 
			
		||||
 | 
			
		||||
Blackfriday is a [Markdown][1] processor implemented in [Go][2]. It
 | 
			
		||||
@@ -18,12 +18,21 @@ It started as a translation from C of [Sundown][3].
 | 
			
		||||
Installation
 | 
			
		||||
------------
 | 
			
		||||
 | 
			
		||||
Blackfriday is compatible with any modern Go release. With Go and git installed:
 | 
			
		||||
Blackfriday is compatible with modern Go releases in module mode.
 | 
			
		||||
With Go installed:
 | 
			
		||||
 | 
			
		||||
    go get -u gopkg.in/russross/blackfriday.v2
 | 
			
		||||
    go get github.com/russross/blackfriday
 | 
			
		||||
 | 
			
		||||
will download, compile, and install the package into your `$GOPATH` directory
 | 
			
		||||
hierarchy.
 | 
			
		||||
will resolve and add the package to the current development module,
 | 
			
		||||
then build and install it. Alternatively, you can achieve the same
 | 
			
		||||
if you import it in a package:
 | 
			
		||||
 | 
			
		||||
    import "github.com/russross/blackfriday"
 | 
			
		||||
 | 
			
		||||
and `go get` without parameters.
 | 
			
		||||
 | 
			
		||||
Old versions of Go and legacy GOPATH mode might work,
 | 
			
		||||
but no effort is made to keep them working.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Versions
 | 
			
		||||
@@ -32,13 +41,9 @@ Versions
 | 
			
		||||
Currently maintained and recommended version of Blackfriday is `v2`. It's being
 | 
			
		||||
developed on its own branch: https://github.com/russross/blackfriday/tree/v2 and the
 | 
			
		||||
documentation is available at
 | 
			
		||||
https://godoc.org/gopkg.in/russross/blackfriday.v2.
 | 
			
		||||
https://pkg.go.dev/github.com/russross/blackfriday/v2.
 | 
			
		||||
 | 
			
		||||
It is `go get`-able via [gopkg.in][6] at `gopkg.in/russross/blackfriday.v2`,
 | 
			
		||||
but we highly recommend using package management tool like [dep][7] or
 | 
			
		||||
[Glide][8] and make use of semantic versioning. With package management you
 | 
			
		||||
should import `github.com/russross/blackfriday` and specify that you're using
 | 
			
		||||
version 2.0.0.
 | 
			
		||||
It is `go get`-able in module mode at `github.com/russross/blackfriday/v2`.
 | 
			
		||||
 | 
			
		||||
Version 2 offers a number of improvements over v1:
 | 
			
		||||
 | 
			
		||||
@@ -60,22 +65,7 @@ Potential drawbacks:
 | 
			
		||||
 | 
			
		||||
If you are still interested in the legacy `v1`, you can import it from
 | 
			
		||||
`github.com/russross/blackfriday`. Documentation for the legacy v1 can be found
 | 
			
		||||
here: https://godoc.org/github.com/russross/blackfriday
 | 
			
		||||
 | 
			
		||||
### Known issue with `dep`
 | 
			
		||||
 | 
			
		||||
There is a known problem with using Blackfriday v1 _transitively_ and `dep`.
 | 
			
		||||
Currently `dep` prioritizes semver versions over anything else, and picks the
 | 
			
		||||
latest one, plus it does not apply a `[[constraint]]` specifier to transitively
 | 
			
		||||
pulled in packages. So if you're using something that uses Blackfriday v1, but
 | 
			
		||||
that something does not use `dep` yet, you will get Blackfriday v2 pulled in and
 | 
			
		||||
your first dependency will fail to build.
 | 
			
		||||
 | 
			
		||||
There are couple of fixes for it, documented here:
 | 
			
		||||
https://github.com/golang/dep/blob/master/docs/FAQ.md#how-do-i-constrain-a-transitive-dependencys-version
 | 
			
		||||
 | 
			
		||||
Meanwhile, `dep` team is working on a more general solution to the constraints
 | 
			
		||||
on transitive dependencies problem: https://github.com/golang/dep/issues/1124.
 | 
			
		||||
here: https://pkg.go.dev/github.com/russross/blackfriday.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Usage
 | 
			
		||||
@@ -86,12 +76,16 @@ Usage
 | 
			
		||||
For basic usage, it is as simple as getting your input into a byte
 | 
			
		||||
slice and calling:
 | 
			
		||||
 | 
			
		||||
    output := blackfriday.MarkdownBasic(input)
 | 
			
		||||
```go
 | 
			
		||||
output := blackfriday.MarkdownBasic(input)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
This renders it with no extensions enabled. To get a more useful
 | 
			
		||||
feature set, use this instead:
 | 
			
		||||
 | 
			
		||||
    output := blackfriday.MarkdownCommon(input)
 | 
			
		||||
```go
 | 
			
		||||
output := blackfriday.MarkdownCommon(input)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### v2
 | 
			
		||||
 | 
			
		||||
@@ -121,7 +115,7 @@ Here's an example of simple usage of Blackfriday together with Bluemonday:
 | 
			
		||||
```go
 | 
			
		||||
import (
 | 
			
		||||
    "github.com/microcosm-cc/bluemonday"
 | 
			
		||||
    "gopkg.in/russross/blackfriday.v2"
 | 
			
		||||
    "github.com/russross/blackfriday"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ...
 | 
			
		||||
@@ -154,7 +148,7 @@ markdown file using a standalone program.  You can also browse the
 | 
			
		||||
source directly on github if you are just looking for some example
 | 
			
		||||
code:
 | 
			
		||||
 | 
			
		||||
* <http://github.com/russross/blackfriday-tool>
 | 
			
		||||
* <https://github.com/russross/blackfriday-tool>
 | 
			
		||||
 | 
			
		||||
Note that if you have not already done so, installing
 | 
			
		||||
`blackfriday-tool` will be sufficient to download and install
 | 
			
		||||
@@ -171,12 +165,12 @@ anchors for headings when `EXTENSION_AUTO_HEADER_IDS` is enabled. The
 | 
			
		||||
algorithm has a specification, so that other packages can create
 | 
			
		||||
compatible anchor names and links to those anchors.
 | 
			
		||||
 | 
			
		||||
The specification is located at https://godoc.org/github.com/russross/blackfriday#hdr-Sanitized_Anchor_Names.
 | 
			
		||||
The specification is located at https://pkg.go.dev/github.com/russross/blackfriday#hdr-Sanitized_Anchor_Names.
 | 
			
		||||
 | 
			
		||||
[`SanitizedAnchorName`](https://godoc.org/github.com/russross/blackfriday#SanitizedAnchorName) exposes this functionality, and can be used to
 | 
			
		||||
[`SanitizedAnchorName`](https://pkg.go.dev/github.com/russross/blackfriday#SanitizedAnchorName) exposes this functionality, and can be used to
 | 
			
		||||
create compatible links to the anchor names generated by blackfriday.
 | 
			
		||||
This algorithm is also implemented in a small standalone package at
 | 
			
		||||
[`github.com/shurcooL/sanitized_anchor_name`](https://godoc.org/github.com/shurcooL/sanitized_anchor_name). It can be useful for clients
 | 
			
		||||
[`github.com/shurcooL/sanitized_anchor_name`](https://pkg.go.dev/github.com/shurcooL/sanitized_anchor_name). It can be useful for clients
 | 
			
		||||
that want a small package and don't need full functionality of blackfriday.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -246,7 +240,7 @@ implements the following extensions:
 | 
			
		||||
    and supply a language (to make syntax highlighting simple). Just
 | 
			
		||||
    mark it like this:
 | 
			
		||||
 | 
			
		||||
        ``` go
 | 
			
		||||
        ```go
 | 
			
		||||
        func getTrue() bool {
 | 
			
		||||
            return true
 | 
			
		||||
        }
 | 
			
		||||
@@ -258,7 +252,7 @@ implements the following extensions:
 | 
			
		||||
    To preserve classes of fenced code blocks while using the bluemonday
 | 
			
		||||
    HTML sanitizer, use the following policy:
 | 
			
		||||
 | 
			
		||||
    ``` go
 | 
			
		||||
    ```go
 | 
			
		||||
    p := bluemonday.UGCPolicy()
 | 
			
		||||
    p.AllowAttrs("class").Matching(regexp.MustCompile("^language-[a-zA-Z0-9]+$")).OnElements("code")
 | 
			
		||||
    html := p.SanitizeBytes(unsafe)
 | 
			
		||||
@@ -269,7 +263,7 @@ implements the following extensions:
 | 
			
		||||
 | 
			
		||||
        Cat
 | 
			
		||||
        : Fluffy animal everyone likes
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        Internet
 | 
			
		||||
        : Vector of transmission for pictures of cats
 | 
			
		||||
 | 
			
		||||
@@ -280,7 +274,7 @@ implements the following extensions:
 | 
			
		||||
    end of the document. A footnote looks like this:
 | 
			
		||||
 | 
			
		||||
        This is a footnote.[^1]
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        [^1]: the footnote text.
 | 
			
		||||
 | 
			
		||||
*   **Autolinking**. Blackfriday can find URLs that have not been
 | 
			
		||||
@@ -317,7 +311,7 @@ Other renderers
 | 
			
		||||
Blackfriday is structured to allow alternative rendering engines. Here
 | 
			
		||||
are a few of note:
 | 
			
		||||
 | 
			
		||||
*   [github_flavored_markdown](https://godoc.org/github.com/shurcooL/github_flavored_markdown):
 | 
			
		||||
*   [github_flavored_markdown](https://pkg.go.dev/github.com/shurcooL/github_flavored_markdown):
 | 
			
		||||
    provides a GitHub Flavored Markdown renderer with fenced code block
 | 
			
		||||
    highlighting, clickable heading anchor links.
 | 
			
		||||
 | 
			
		||||
@@ -328,7 +322,7 @@ are a few of note:
 | 
			
		||||
*   [markdownfmt](https://github.com/shurcooL/markdownfmt): like gofmt,
 | 
			
		||||
    but for markdown.
 | 
			
		||||
 | 
			
		||||
*   [LaTeX output](https://bitbucket.org/ambrevar/blackfriday-latex):
 | 
			
		||||
*   [LaTeX output](https://gitlab.com/ambrevar/blackfriday-latex):
 | 
			
		||||
    renders output as LaTeX.
 | 
			
		||||
 | 
			
		||||
*   [bfchroma](https://github.com/Depado/bfchroma/): provides convenience
 | 
			
		||||
@@ -337,6 +331,10 @@ are a few of note:
 | 
			
		||||
    provides a drop-in renderer ready to use with Blackfriday, as well as
 | 
			
		||||
    options and means for further customization.
 | 
			
		||||
 | 
			
		||||
*   [Blackfriday-Confluence](https://github.com/kentaro-m/blackfriday-confluence): provides a [Confluence Wiki Markup](https://confluence.atlassian.com/doc/confluence-wiki-markup-251003035.html) renderer.
 | 
			
		||||
 | 
			
		||||
*   [Blackfriday-Slack](https://github.com/karriereat/blackfriday-slack): converts markdown to slack message style
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TODO
 | 
			
		||||
----
 | 
			
		||||
@@ -357,13 +355,10 @@ License
 | 
			
		||||
   [1]: https://daringfireball.net/projects/markdown/ "Markdown"
 | 
			
		||||
   [2]: https://golang.org/ "Go Language"
 | 
			
		||||
   [3]: https://github.com/vmg/sundown "Sundown"
 | 
			
		||||
   [4]: https://godoc.org/gopkg.in/russross/blackfriday.v2#Parse "Parse func"
 | 
			
		||||
   [4]: https://pkg.go.dev/github.com/russross/blackfriday/v2#Parse "Parse func"
 | 
			
		||||
   [5]: https://github.com/microcosm-cc/bluemonday "Bluemonday"
 | 
			
		||||
   [6]: https://labix.org/gopkg.in "gopkg.in"
 | 
			
		||||
   [7]: https://github.com/golang/dep/ "dep"
 | 
			
		||||
   [8]: https://github.com/Masterminds/glide "Glide"
 | 
			
		||||
 | 
			
		||||
   [BuildSVG]: https://travis-ci.org/russross/blackfriday.svg?branch=master
 | 
			
		||||
   [BuildURL]: https://travis-ci.org/russross/blackfriday
 | 
			
		||||
   [GodocV2SVG]: https://godoc.org/gopkg.in/russross/blackfriday.v2?status.svg
 | 
			
		||||
   [GodocV2URL]: https://godoc.org/gopkg.in/russross/blackfriday.v2
 | 
			
		||||
   [BuildV2SVG]: https://travis-ci.org/russross/blackfriday.svg?branch=v2
 | 
			
		||||
   [BuildV2URL]: https://travis-ci.org/russross/blackfriday
 | 
			
		||||
   [PkgGoDevV2SVG]: https://pkg.go.dev/badge/github.com/russross/blackfriday/v2
 | 
			
		||||
   [PkgGoDevV2URL]: https://pkg.go.dev/github.com/russross/blackfriday/v2
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										24
									
								
								vendor/github.com/russross/blackfriday/block.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								vendor/github.com/russross/blackfriday/block.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -649,14 +649,17 @@ func isFenceLine(data []byte, info *string, oldmarker string, newlineOptional bo
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	i = skipChar(data, i, ' ')
 | 
			
		||||
	if i >= len(data) || data[i] != '\n' {
 | 
			
		||||
		if newlineOptional && i == len(data) {
 | 
			
		||||
	if i >= len(data) {
 | 
			
		||||
		if newlineOptional {
 | 
			
		||||
			return i, marker
 | 
			
		||||
		}
 | 
			
		||||
		return 0, ""
 | 
			
		||||
	}
 | 
			
		||||
	if data[i] == '\n' {
 | 
			
		||||
		i++ // Take newline into account
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return i + 1, marker // Take newline into account.
 | 
			
		||||
	return i, marker
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// fencedCodeBlock returns the end index if data contains a fenced code block at the beginning,
 | 
			
		||||
@@ -1133,6 +1136,15 @@ func (p *parser) listItem(out *bytes.Buffer, data []byte, flags *int) int {
 | 
			
		||||
		i++
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// process the following lines
 | 
			
		||||
	containsBlankLine := false
 | 
			
		||||
	sublist := 0
 | 
			
		||||
	codeBlockMarker := ""
 | 
			
		||||
	if p.flags&EXTENSION_FENCED_CODE != 0 && i > line {
 | 
			
		||||
		// determine if codeblock starts on the first line
 | 
			
		||||
		_, codeBlockMarker = isFenceLine(data[line:i], nil, "", false)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// get working buffer
 | 
			
		||||
	var raw bytes.Buffer
 | 
			
		||||
 | 
			
		||||
@@ -1140,11 +1152,6 @@ func (p *parser) listItem(out *bytes.Buffer, data []byte, flags *int) int {
 | 
			
		||||
	raw.Write(data[line:i])
 | 
			
		||||
	line = i
 | 
			
		||||
 | 
			
		||||
	// process the following lines
 | 
			
		||||
	containsBlankLine := false
 | 
			
		||||
	sublist := 0
 | 
			
		||||
	codeBlockMarker := ""
 | 
			
		||||
 | 
			
		||||
gatherlines:
 | 
			
		||||
	for line < len(data) {
 | 
			
		||||
		i++
 | 
			
		||||
@@ -1153,7 +1160,6 @@ gatherlines:
 | 
			
		||||
		for data[i-1] != '\n' {
 | 
			
		||||
			i++
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// if it is an empty line, guess that it is part of this item
 | 
			
		||||
		// and move on to the next line
 | 
			
		||||
		if p.isEmpty(data[line:i]) > 0 {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/russross/blackfriday/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/russross/blackfriday/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1 +1,3 @@
 | 
			
		||||
module github.com/russross/blackfriday
 | 
			
		||||
 | 
			
		||||
go 1.13
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								vendor/github.com/russross/blackfriday/html.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/russross/blackfriday/html.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -32,6 +32,7 @@ const (
 | 
			
		||||
	HTML_SAFELINK                              // only link to trusted protocols
 | 
			
		||||
	HTML_NOFOLLOW_LINKS                        // only link with rel="nofollow"
 | 
			
		||||
	HTML_NOREFERRER_LINKS                      // only link with rel="noreferrer"
 | 
			
		||||
	HTML_NOOPENER_LINKS                        // only link with rel="noopener"
 | 
			
		||||
	HTML_HREF_TARGET_BLANK                     // add a blank target
 | 
			
		||||
	HTML_TOC                                   // generate a table of contents
 | 
			
		||||
	HTML_OMIT_CONTENTS                         // skip the main contents (for a standalone table of contents)
 | 
			
		||||
@@ -445,6 +446,9 @@ func (options *Html) AutoLink(out *bytes.Buffer, link []byte, kind int) {
 | 
			
		||||
	if options.flags&HTML_NOREFERRER_LINKS != 0 && !isRelativeLink(link) {
 | 
			
		||||
		relAttrs = append(relAttrs, "noreferrer")
 | 
			
		||||
	}
 | 
			
		||||
	if options.flags&HTML_NOOPENER_LINKS != 0 && !isRelativeLink(link) {
 | 
			
		||||
		relAttrs = append(relAttrs, "noopener")
 | 
			
		||||
	}
 | 
			
		||||
	if len(relAttrs) > 0 {
 | 
			
		||||
		out.WriteString(fmt.Sprintf("\" rel=\"%s", strings.Join(relAttrs, " ")))
 | 
			
		||||
	}
 | 
			
		||||
@@ -559,6 +563,9 @@ func (options *Html) Link(out *bytes.Buffer, link []byte, title []byte, content
 | 
			
		||||
	if options.flags&HTML_NOREFERRER_LINKS != 0 && !isRelativeLink(link) {
 | 
			
		||||
		relAttrs = append(relAttrs, "noreferrer")
 | 
			
		||||
	}
 | 
			
		||||
	if options.flags&HTML_NOOPENER_LINKS != 0 && !isRelativeLink(link) {
 | 
			
		||||
		relAttrs = append(relAttrs, "noopener")
 | 
			
		||||
	}
 | 
			
		||||
	if len(relAttrs) > 0 {
 | 
			
		||||
		out.WriteString(fmt.Sprintf("\" rel=\"%s", strings.Join(relAttrs, " ")))
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/russross/blackfriday/inline.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/russross/blackfriday/inline.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -252,7 +252,7 @@ func link(p *parser, out *bytes.Buffer, data []byte, offset int) int {
 | 
			
		||||
		case data[i] == '\n':
 | 
			
		||||
			textHasNl = true
 | 
			
		||||
 | 
			
		||||
		case data[i-1] == '\\':
 | 
			
		||||
		case isBackslashEscaped(data, i):
 | 
			
		||||
			continue
 | 
			
		||||
 | 
			
		||||
		case data[i] == '[':
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/russross/blackfriday/markdown.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/russross/blackfriday/markdown.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -132,6 +132,7 @@ var blockTags = map[string]struct{}{
 | 
			
		||||
	"article":    {},
 | 
			
		||||
	"aside":      {},
 | 
			
		||||
	"canvas":     {},
 | 
			
		||||
	"details":    {},
 | 
			
		||||
	"figcaption": {},
 | 
			
		||||
	"figure":     {},
 | 
			
		||||
	"footer":     {},
 | 
			
		||||
@@ -142,6 +143,7 @@ var blockTags = map[string]struct{}{
 | 
			
		||||
	"output":     {},
 | 
			
		||||
	"progress":   {},
 | 
			
		||||
	"section":    {},
 | 
			
		||||
	"summary":    {},
 | 
			
		||||
	"video":      {},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								vendor/golang.org/x/net/http2/server.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/golang.org/x/net/http2/server.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2020,7 +2020,11 @@ func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*res
 | 
			
		||||
	}
 | 
			
		||||
	if bodyOpen {
 | 
			
		||||
		if vv, ok := rp.header["Content-Length"]; ok {
 | 
			
		||||
			req.ContentLength, _ = strconv.ParseInt(vv[0], 10, 64)
 | 
			
		||||
			if cl, err := strconv.ParseUint(vv[0], 10, 63); err == nil {
 | 
			
		||||
				req.ContentLength = int64(cl)
 | 
			
		||||
			} else {
 | 
			
		||||
				req.ContentLength = 0
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			req.ContentLength = -1
 | 
			
		||||
		}
 | 
			
		||||
@@ -2403,9 +2407,8 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) {
 | 
			
		||||
		var ctype, clen string
 | 
			
		||||
		if clen = rws.snapHeader.Get("Content-Length"); clen != "" {
 | 
			
		||||
			rws.snapHeader.Del("Content-Length")
 | 
			
		||||
			clen64, err := strconv.ParseInt(clen, 10, 64)
 | 
			
		||||
			if err == nil && clen64 >= 0 {
 | 
			
		||||
				rws.sentContentLen = clen64
 | 
			
		||||
			if cl, err := strconv.ParseUint(clen, 10, 63); err == nil {
 | 
			
		||||
				rws.sentContentLen = int64(cl)
 | 
			
		||||
			} else {
 | 
			
		||||
				clen = ""
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/net/http2/transport.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/net/http2/transport.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2006,8 +2006,8 @@ func (rl *clientConnReadLoop) handleResponse(cs *clientStream, f *MetaHeadersFra
 | 
			
		||||
	if !streamEnded || isHead {
 | 
			
		||||
		res.ContentLength = -1
 | 
			
		||||
		if clens := res.Header["Content-Length"]; len(clens) == 1 {
 | 
			
		||||
			if clen64, err := strconv.ParseInt(clens[0], 10, 64); err == nil {
 | 
			
		||||
				res.ContentLength = clen64
 | 
			
		||||
			if cl, err := strconv.ParseUint(clens[0], 10, 63); err == nil {
 | 
			
		||||
				res.ContentLength = int64(cl)
 | 
			
		||||
			} else {
 | 
			
		||||
				// TODO: care? unlike http/1, it won't mess up our framing, so it's
 | 
			
		||||
				// more safe smuggling-wise to ignore.
 | 
			
		||||
 
 | 
			
		||||
@@ -21,5 +21,5 @@ const (
 | 
			
		||||
 | 
			
		||||
// RemoteDavEndpoint returns the endpoint for the Dav API for Nextcloud
 | 
			
		||||
func RemoteDavEndpoint(username string, davType string) string {
 | 
			
		||||
	return "/remote.php/dav/" + davType + "/" + username + "/"
 | 
			
		||||
	return "/remote.php/dav/" + username + "/" + davType + "/"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,7 @@ func NewTalkRoom(tuser *user.TalkUser, token string) (*TalkRoom, error) {
 | 
			
		||||
 | 
			
		||||
// SendMessage sends a message in the Talk room
 | 
			
		||||
func (t *TalkRoom) SendMessage(msg string) (*ocs.TalkRoomMessageData, error) {
 | 
			
		||||
	url := t.User.NextcloudURL + constants.BaseEndpoint + "chat/" + t.Token
 | 
			
		||||
	url := t.User.NextcloudURL + constants.BaseEndpoint + "/chat/" + t.Token
 | 
			
		||||
	requestParams := map[string]string{
 | 
			
		||||
		"message": msg,
 | 
			
		||||
	}
 | 
			
		||||
@@ -93,7 +93,7 @@ func (t *TalkRoom) ReceiveMessages(ctx context.Context) (chan ocs.TalkRoomMessag
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	url := t.User.NextcloudURL + constants.BaseEndpoint + "chat/" + t.Token
 | 
			
		||||
	url := t.User.NextcloudURL + constants.BaseEndpoint + "/chat/" + t.Token
 | 
			
		||||
	requestParam := map[string]string{
 | 
			
		||||
		"lookIntoFuture":   "1",
 | 
			
		||||
		"includeLastKnown": "0",
 | 
			
		||||
@@ -154,7 +154,7 @@ func (t *TalkRoom) TestConnection() error {
 | 
			
		||||
	if t.Token == "" {
 | 
			
		||||
		return ErrEmptyToken
 | 
			
		||||
	}
 | 
			
		||||
	url := t.User.NextcloudURL + constants.BaseEndpoint + "chat/" + t.Token
 | 
			
		||||
	url := t.User.NextcloudURL + constants.BaseEndpoint + "/chat/" + t.Token
 | 
			
		||||
	requestParam := map[string]string{
 | 
			
		||||
		"lookIntoFuture":   "0",
 | 
			
		||||
		"includeLastKnown": "0",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							@@ -4,8 +4,7 @@ github.com/42wim/go-gitter
 | 
			
		||||
# github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f
 | 
			
		||||
## explicit
 | 
			
		||||
github.com/Baozisoftware/qrcode-terminal-go
 | 
			
		||||
# github.com/Jeffail/gabs v1.1.1
 | 
			
		||||
## explicit
 | 
			
		||||
# github.com/Jeffail/gabs v1.4.0
 | 
			
		||||
github.com/Jeffail/gabs
 | 
			
		||||
# github.com/Philipp15b/go-steam v1.0.1-0.20200727090957-6ae9b3c0a560
 | 
			
		||||
## explicit
 | 
			
		||||
@@ -19,7 +18,7 @@ github.com/Philipp15b/go-steam/protocol/steamlang
 | 
			
		||||
github.com/Philipp15b/go-steam/rwu
 | 
			
		||||
github.com/Philipp15b/go-steam/socialcache
 | 
			
		||||
github.com/Philipp15b/go-steam/steamid
 | 
			
		||||
# github.com/Rhymen/go-whatsapp v0.1.2-0.20201122130733-6e5488ac98df
 | 
			
		||||
# github.com/Rhymen/go-whatsapp v0.1.2-0.20201130210432-64cc8cf1437d
 | 
			
		||||
## explicit
 | 
			
		||||
github.com/Rhymen/go-whatsapp
 | 
			
		||||
github.com/Rhymen/go-whatsapp/binary
 | 
			
		||||
@@ -28,6 +27,8 @@ github.com/Rhymen/go-whatsapp/binary/token
 | 
			
		||||
github.com/Rhymen/go-whatsapp/crypto/cbc
 | 
			
		||||
github.com/Rhymen/go-whatsapp/crypto/curve25519
 | 
			
		||||
github.com/Rhymen/go-whatsapp/crypto/hkdf
 | 
			
		||||
# github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20200922220614-e4a51dfb52e4
 | 
			
		||||
## explicit
 | 
			
		||||
# github.com/blang/semver v3.5.1+incompatible
 | 
			
		||||
github.com/blang/semver
 | 
			
		||||
# github.com/d5/tengo/v2 v2.6.2
 | 
			
		||||
@@ -71,7 +72,6 @@ github.com/google/gops/signal
 | 
			
		||||
# github.com/google/uuid v1.1.1
 | 
			
		||||
github.com/google/uuid
 | 
			
		||||
# github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4
 | 
			
		||||
## explicit
 | 
			
		||||
github.com/gopackage/ddp
 | 
			
		||||
# github.com/gorilla/schema v1.2.0
 | 
			
		||||
## explicit
 | 
			
		||||
@@ -125,7 +125,7 @@ github.com/magiconair/properties
 | 
			
		||||
# github.com/matrix-org/gomatrix v0.0.0-20200827122206-7dd5e2a05bcd
 | 
			
		||||
## explicit
 | 
			
		||||
github.com/matrix-org/gomatrix
 | 
			
		||||
# github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20201206161339-a8e64af17cde
 | 
			
		||||
# github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20201206215757-c1d86d75b9f8
 | 
			
		||||
## explicit
 | 
			
		||||
github.com/matterbridge/Rocket.Chat.Go.SDK/models
 | 
			
		||||
github.com/matterbridge/Rocket.Chat.Go.SDK/realtime
 | 
			
		||||
@@ -156,7 +156,7 @@ github.com/mattermost/ldap
 | 
			
		||||
github.com/mattermost/logr
 | 
			
		||||
github.com/mattermost/logr/format
 | 
			
		||||
github.com/mattermost/logr/target
 | 
			
		||||
# github.com/mattermost/mattermost-server/v5 v5.29.0
 | 
			
		||||
# github.com/mattermost/mattermost-server/v5 v5.29.1
 | 
			
		||||
## explicit
 | 
			
		||||
github.com/mattermost/mattermost-server/v5/mlog
 | 
			
		||||
github.com/mattermost/mattermost-server/v5/model
 | 
			
		||||
@@ -212,7 +212,7 @@ github.com/rickb777/plural
 | 
			
		||||
# github.com/rs/xid v1.2.1
 | 
			
		||||
## explicit
 | 
			
		||||
github.com/rs/xid
 | 
			
		||||
# github.com/russross/blackfriday v1.5.2
 | 
			
		||||
# github.com/russross/blackfriday v1.6.0
 | 
			
		||||
## explicit
 | 
			
		||||
github.com/russross/blackfriday
 | 
			
		||||
# github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca
 | 
			
		||||
@@ -323,7 +323,7 @@ golang.org/x/image/riff
 | 
			
		||||
golang.org/x/image/vp8
 | 
			
		||||
golang.org/x/image/vp8l
 | 
			
		||||
golang.org/x/image/webp
 | 
			
		||||
# golang.org/x/net v0.0.0-20200822124328-c89045814202
 | 
			
		||||
# golang.org/x/net v0.0.0-20200904194848-62affa334b73
 | 
			
		||||
golang.org/x/net/context
 | 
			
		||||
golang.org/x/net/context/ctxhttp
 | 
			
		||||
golang.org/x/net/html
 | 
			
		||||
@@ -334,7 +334,7 @@ golang.org/x/net/http2/h2c
 | 
			
		||||
golang.org/x/net/http2/hpack
 | 
			
		||||
golang.org/x/net/idna
 | 
			
		||||
golang.org/x/net/websocket
 | 
			
		||||
# golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58
 | 
			
		||||
# golang.org/x/oauth2 v0.0.0-20201203001011-0b49973bad19
 | 
			
		||||
## explicit
 | 
			
		||||
golang.org/x/oauth2
 | 
			
		||||
golang.org/x/oauth2/clientcredentials
 | 
			
		||||
@@ -362,7 +362,7 @@ golang.org/x/text/transform
 | 
			
		||||
golang.org/x/text/unicode/bidi
 | 
			
		||||
golang.org/x/text/unicode/norm
 | 
			
		||||
golang.org/x/text/width
 | 
			
		||||
# gomod.garykim.dev/nc-talk v0.1.5
 | 
			
		||||
# gomod.garykim.dev/nc-talk v0.1.6
 | 
			
		||||
## explicit
 | 
			
		||||
gomod.garykim.dev/nc-talk/constants
 | 
			
		||||
gomod.garykim.dev/nc-talk/ocs
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user