@ -36,6 +36,7 @@ func (s MultiSource) AvailableVersions(provider addrs.Provider) (VersionList, er
// We will return the union of all versions reported by the nested
// sources that have matching patterns that accept the given provider.
vs := make ( map [ Version ] struct { } )
var registryError bool
for _ , selector := range s {
if ! selector . CanHandleProvider ( provider ) {
continue // doesn't match the given patterns
@ -43,8 +44,11 @@ func (s MultiSource) AvailableVersions(provider addrs.Provider) (VersionList, er
thisSourceVersions , err := selector . Source . AvailableVersions ( provider )
switch err . ( type ) {
case nil :
// okay
case ErrProviderNotKnown :
// okay
case ErrRegistryProviderNotKnown :
registryError = true
continue // ignore, then
case ErrProviderNotFound :
continue // ignore, then
default :
return nil , err
@ -55,7 +59,11 @@ func (s MultiSource) AvailableVersions(provider addrs.Provider) (VersionList, er
}
if len ( vs ) == 0 {
return nil , ErrProviderNotKnown { provider }
if registryError {
return nil , ErrRegistryProviderNotKnown { provider }
} else {
return nil , ErrProviderNotFound { provider , s . sourcesForProvider ( provider ) }
}
}
ret := make ( VersionList , 0 , len ( vs ) )
for v := range vs {
@ -70,7 +78,7 @@ func (s MultiSource) AvailableVersions(provider addrs.Provider) (VersionList, er
// from the first selector that indicates availability of it.
func ( s MultiSource ) PackageMeta ( provider addrs . Provider , version Version , target Platform ) ( PackageMeta , error ) {
if len ( s ) == 0 { // Easy case: no providers exist at all
return PackageMeta { } , ErrProviderNot Known{ provider }
return PackageMeta { } , ErrProviderNot Found{ provider , s . sourcesForProvider ( provider ) }
}
for _ , selector := range s {
@ -81,7 +89,7 @@ func (s MultiSource) PackageMeta(provider addrs.Provider, version Version, targe
switch err . ( type ) {
case nil :
return meta , nil
case ErrProviderNot Known, ErrPlatformNotSupported :
case ErrProviderNot Found, ErrRegistryProviderNot Known, ErrPlatformNotSupported :
continue // ignore, then
default :
return PackageMeta { } , err
@ -224,3 +232,20 @@ func normalizeProviderNameOrWildcard(s string) (string, error) {
}
return addrs . ParseProviderPart ( s )
}
func ( s MultiSource ) ForDisplay ( provider addrs . Provider ) string {
return strings . Join ( s . sourcesForProvider ( provider ) , "\n" )
}
// sourcesForProvider returns a list of source display strings configured for a
// given provider, taking into account any `Exclude` statements.
func ( s MultiSource ) sourcesForProvider ( provider addrs . Provider ) [ ] string {
ret := make ( [ ] string , 0 )
for _ , selector := range s {
if ! selector . CanHandleProvider ( provider ) {
continue // doesn't match the given patterns
}
ret = append ( ret , selector . Source . ForDisplay ( provider ) )
}
return ret
}