/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

/*
 *
 * Copyright 2021 gRPC authors.
 *
 */

// Package clusterspecifier contains the ClusterSpecifier interface and a registry for
// storing and retrieving their implementations.
package clusterspecifier

import (
	"github.com/golang/protobuf/proto"
)

// BalancerConfig is the Go Native JSON representation of a balancer
// configuration.
type BalancerConfig []map[string]interface{}

// ClusterSpecifier defines the parsing functionality of a Cluster Specifier.
type ClusterSpecifier interface {
	// TypeURLs are the proto message types supported by this
	// ClusterSpecifierPlugin. A ClusterSpecifierPlugin will be registered by
	// each of its supported message types.
	TypeURLs() []string
	// ParseClusterSpecifierConfig parses the provided configuration
	// proto.Message from the top level RDS configuration. The resulting
	// BalancerConfig will be used as configuration for a child LB Policy of the
	// Cluster Manager LB Policy.
	ParseClusterSpecifierConfig(proto.Message) (BalancerConfig, error)
}

var (
	// m is a map from scheme to filter.
	m = make(map[string]ClusterSpecifier)
)

// Register registers the ClusterSpecifierPlugin to the ClusterSpecifier map.
// cs.TypeURLs() will be used as the types for this ClusterSpecifierPlugin.
//
// NOTE: this function must only be called during initialization time (i.e. in
// an init() function), and is not thread-safe. If multiple cluster specifier
// plugins are registered with the same type URL, the one registered last will
// take effect.
func Register(cs ClusterSpecifier) {
	for _, u := range cs.TypeURLs() {
		m[u] = cs
	}
}

// Get returns the ClusterSpecifier registered with typeURL.
//
// If no cluster specifier is registered with typeURL, nil will be returned.
func Get(typeURL string) ClusterSpecifier {
	return m[typeURL]
}
