pkg/selector/services.go (57 lines of code) (raw):

// 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 selector import ( "fmt" "strings" "dario.cat/mergo" ) // Service is used to write custom service filter transforms. type Service interface { Filters(version string) (Filters, error) } // ServiceFiltersFn is the func type definition for the Service interface. type ServiceFiltersFn func(version string) (Filters, error) // Filters implements the Service interface on ServiceFiltersFn // This allows any ServiceFiltersFn to be passed into funcs accepting the Service interface. func (fn ServiceFiltersFn) Filters(version string) (Filters, error) { return fn(version) } // ServiceRegistry is used to register service filter transforms. type ServiceRegistry struct { services map[string]*Service } // NewRegistry creates a new instance of a ServiceRegistry. func NewRegistry() ServiceRegistry { return ServiceRegistry{ services: make(map[string]*Service), } } // Register takes a service name and Service implementation that will be executed on an ExecuteTransforms call. func (sr *ServiceRegistry) Register(name string, service Service) { if sr.services == nil { sr.services = make(map[string]*Service) } if name == "" { return } sr.services[name] = &service } // RegisterAWSServices registers the built-in AWS service filter transforms. func (sr *ServiceRegistry) RegisterAWSServices() { sr.Register("emr", &EMR{}) } // ExecuteTransforms will execute the ServiceRegistry's registered service filter transforms // Filters.Service will be parsed as <service-name>-<version> and passed to Service.Filters. func (sr *ServiceRegistry) ExecuteTransforms(filters Filters) (Filters, error) { if filters.Service == nil || *filters.Service == "" || *filters.Service == "eks" { return filters, nil } serviceAndVersion := strings.ToLower(*filters.Service) versionParts := strings.Split(serviceAndVersion, "-") serviceName := versionParts[0] version := "" if len(versionParts) >= 2 { version = strings.Join(versionParts[1:], "-") } service, ok := sr.services[serviceName] if !ok { return filters, fmt.Errorf("Service %s is not registered", serviceName) } serviceFilters, err := (*service).Filters(version) if err != nil { return filters, err } if err := mergo.Merge(&filters, serviceFilters); err != nil { return filters, err } return filters, nil }