62 lines
2.2 KiB
Go
62 lines
2.2 KiB
Go
|
package config
|
||
|
|
||
|
import "github.com/blang/semver"
|
||
|
|
||
|
// ProviderVersionConstraint presents a constraint for a particular
|
||
|
// provider, identified by its full name.
|
||
|
type ProviderVersionConstraint struct {
|
||
|
Constraint string
|
||
|
ProviderType string
|
||
|
}
|
||
|
|
||
|
// ProviderVersionConstraints is a map from provider full name to its associated
|
||
|
// ProviderVersionConstraint, as produced by Config.RequiredProviders.
|
||
|
type ProviderVersionConstraints map[string]ProviderVersionConstraint
|
||
|
|
||
|
// RequiredRanges returns a semver.Range for each distinct provider type in
|
||
|
// the constraint map. If the same provider type appears more than once
|
||
|
// (e.g. because aliases are in use) then their respective constraints are
|
||
|
// combined such that they must *all* apply.
|
||
|
//
|
||
|
// The result of this method can be passed to the
|
||
|
// PluginMetaSet.ConstrainVersions method within the plugin/discovery
|
||
|
// package in order to filter down the available plugins to those which
|
||
|
// satisfy the given constraints.
|
||
|
//
|
||
|
// This function will panic if any of the constraints within cannot be
|
||
|
// parsed as semver ranges. This is guaranteed to never happen for a
|
||
|
// constraint set that was built from a configuration that passed validation.
|
||
|
func (cons ProviderVersionConstraints) RequiredRanges() map[string]semver.Range {
|
||
|
ret := make(map[string]semver.Range, len(cons))
|
||
|
|
||
|
for _, con := range cons {
|
||
|
spec := semver.MustParseRange(con.Constraint)
|
||
|
if existing, exists := ret[con.ProviderType]; exists {
|
||
|
ret[con.ProviderType] = existing.AND(spec)
|
||
|
} else {
|
||
|
ret[con.ProviderType] = spec
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return ret
|
||
|
}
|
||
|
|
||
|
// ProviderConfigsByFullName returns a map from provider full names (as
|
||
|
// returned by ProviderConfig.FullName()) to the corresponding provider
|
||
|
// configs.
|
||
|
//
|
||
|
// This function returns no new information than what's already in
|
||
|
// c.ProviderConfigs, but returns it in a more convenient shape. If there
|
||
|
// is more than one provider config with the same full name then the result
|
||
|
// is undefined, but that is guaranteed not to happen for any config that
|
||
|
// has passed validation.
|
||
|
func (c *Config) ProviderConfigsByFullName() map[string]*ProviderConfig {
|
||
|
ret := make(map[string]*ProviderConfig, len(c.ProviderConfigs))
|
||
|
|
||
|
for _, pc := range c.ProviderConfigs {
|
||
|
ret[pc.FullName()] = pc
|
||
|
}
|
||
|
|
||
|
return ret
|
||
|
}
|