/*
Copyright 2021 The Dapr Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package pubsub

import "fmt"

// ConcurrencyMode is a pub/sub metadata setting that allows to specify whether messages are delivered in a serial or parallel execution.
type ConcurrencyMode string

const (
	// ConcurrencyKey is the metadata key name for ConcurrencyMode.
	ConcurrencyKey                 = "concurrencyMode"
	Single         ConcurrencyMode = "single"
	Parallel       ConcurrencyMode = "parallel"
)

// Concurrency takes a metadata object and returns the ConcurrencyMode configured. Default is Parallel.
func Concurrency(metadata map[string]string) (ConcurrencyMode, error) {
	if val, ok := metadata[ConcurrencyKey]; ok && val != "" {
		switch val {
		case string(Single):
			return Single, nil
		case string(Parallel):
			return Parallel, nil
		default:
			return "", fmt.Errorf("invalid %s %s", ConcurrencyKey, val)
		}
	}

	return Parallel, nil
}
