Files
Bryce Lampe 26c144c916 Initial provider implementation (#18)
This brings over the initial buildx prototype from pulumi/pulumi-docker
and fixes various build and release issues.
2024-04-25 11:03:59 -07:00

118 lines
2.8 KiB
Go

// Copyright 2024, Pulumi Corporation.
//
// 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 internal
import (
"fmt"
)
// keeper decides whether an element should be included for a preview
// operation, optionally returning a mutated copy of that element.
type keeper[T any] interface {
keep(T) bool
}
// filter applies a keeper to each element, returning a new slice.
func filter[T any](k keeper[T], elems ...T) []T {
if elems == nil {
return nil
}
result := make([]T, 0, len(elems))
for _, e := range elems {
if !k.keep(e) {
continue
}
result = append(result, e)
}
return result
}
// stringKeeper preserves any non-empty string values for preview.
type stringKeeper struct{ preview bool }
func (k stringKeeper) keep(s string) bool {
if !k.preview {
return true
}
return s != ""
}
//nolint:structcheck // False positive due to generics.
type stringerKeeper[T fmt.Stringer] struct{ preview bool }
//nolint:unused // False positive due to generics.
func (k stringerKeeper[T]) keep(t T) bool {
if !k.preview {
return true
}
return stringKeeper(k).keep(t.String())
}
// registryKeeper preserves any registries with known values for address and
// password. This is imprecise and doesn't permit alternative auth strategies
// like registry tokens, email, etc.
type registryKeeper struct{ preview bool }
//nolint:unused // False positive due to generics.
func (k registryKeeper) keep(r Registry) bool {
if !k.preview {
return true
}
return r.Password != "" && r.Address != ""
}
// mapKeeper preserves map elements with known keys and values.
type mapKeeper struct{ preview bool }
func (k mapKeeper) keep(m map[string]string) map[string]string {
if !k.preview || len(m) == 0 {
return m
}
kk := stringKeeper(k)
filtered := make(map[string]string)
for key, val := range m {
if !kk.keep(key) {
continue
}
if !kk.keep(val) {
continue
}
filtered[key] = val
}
return filtered
}
type contextKeeper struct{ preview bool }
func (k contextKeeper) keep(bc *BuildContext) *BuildContext {
if !k.preview || bc == nil || len(bc.Named) == 0 {
return bc
}
named := NamedContexts{}
sk := stringKeeper(k)
for k, v := range bc.Named {
if !sk.keep(k) || !sk.keep(v.Location) {
continue
}
named[k] = v
}
return &BuildContext{
Context: Context{bc.Location},
Named: named,
}
}