in go/metadata/capabilities/capabilities.go [54:149]
func FromNewSessionArgs(args map[string]interface{}) (*Capabilities, error) {
always := map[string]interface{}{}
var first []map[string]interface{}
w3c, _ := args["capabilities"].(map[string]interface{})
if w3c != nil {
if am, ok := w3c["alwaysMatch"].(map[string]interface{}); ok {
n, err := normalize(am)
if err != nil {
return nil, err
}
if err := mergeIntoNoReplace(always, n); err != nil {
return nil, err
}
}
}
if required, ok := args["requiredCapabilities"].(map[string]interface{}); ok {
n, err := normalize(required)
if err != nil {
return nil, err
}
if err := mergeIntoNoReplace(always, n); err != nil {
return nil, err
}
}
if desired, ok := args["desiredCapabilities"].(map[string]interface{}); ok {
n, err := normalize(desired)
if err != nil {
return nil, err
}
if err := mergeIntoNoReplace(always, n); err != nil {
return nil, err
}
}
if w3c != nil {
fm, _ := w3c["firstMatch"].([]interface{})
for _, e := range fm {
fme, ok := e.(map[string]interface{})
if !ok {
return nil, fmt.Errorf("firstMatch entries must be JSON Objects, found %#v", e)
}
newFM := map[string]interface{}{}
nfme, err := normalize(fme)
if err != nil {
return nil, err
}
for k, v := range nfme {
if a, ok := always[k]; ok {
if !reflect.DeepEqual(a, v) {
return nil, fmt.Errorf("alwaysMatch|required|desired[%q] == %+v, firstMatch[%q] == %+v, they must be equal", k, a, k, v)
}
continue
}
newFM[k] = v
}
first = append(first, newFM)
}
}
var reduced []map[string]interface{}
for i, v := range first {
duped := false
for _, v2 := range first[i+1:] {
if reflect.DeepEqual(v, v2) {
duped = true
break
}
}
if !duped {
reduced = append(reduced, v)
}
}
first = reduced
if len(first) == 1 {
if err := mergeIntoNoReplace(always, first[0]); err != nil {
return nil, err
}
first = nil
}
return &Capabilities{
AlwaysMatch: always,
FirstMatch: first,
W3CSupported: w3c != nil,
}, nil
}