func FromNewSessionArgs()

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
}