1
package sdk
2

            
3
import (
4
	"fmt"
5

            
6
	"github.com/envoyproxy/envoy/source/extensions/dynamic_modules/sdk/go/shared"
7
)
8

            
9
// For built-in plugin factories in the host binary directly. DO NOT use this for independently
10
// compiled module or plugins.
11
var httpFilterConfigFactoryRegistry = make(map[string]shared.HttpFilterConfigFactory)
12

            
13
// NewHttpFilterFactory creates a new plugin factory for the given plugin name and unparsed config.
14
func NewHttpFilterFactory(handle shared.HttpFilterConfigHandle, name string,
15
	unparsedConfig []byte) (shared.HttpFilterFactory, error) {
16
	configFactory := httpFilterConfigFactoryRegistry[name]
17
	if configFactory == nil {
18
		return nil, fmt.Errorf("failed to get plugin config factory")
19
	}
20
	return configFactory.Create(handle, unparsedConfig)
21
}
22

            
23
// GetHttpFilterConfigFactory gets the plugin config factory for the given plugin name.
24
func GetHttpFilterConfigFactory(name string) shared.HttpFilterConfigFactory {
25
	return httpFilterConfigFactoryRegistry[name]
26
}
27

            
28
// RegisterHttpFilterConfigFactories registers plugin config factories for plugins in the composer
29
// binary itself. This function MUST only be called from init() functions.
30
func RegisterHttpFilterConfigFactories(factories map[string]shared.HttpFilterConfigFactory) {
31
	for name, factory := range factories {
32
		if _, ok := httpFilterConfigFactoryRegistry[name]; ok {
33
			// Same plugin name should only be register once in same lib.
34
			panic("plugin config factory already registered: " + name)
35
		}
36
		httpFilterConfigFactoryRegistry[name] = factory
37
	}
38
}