debian-forge-composer/internal/remotefile/resolver.go
Gianluca Zuccarelli b7e7bafb2e internal/remotefile: create a remote file resolver
Create a resolver to fetch the contents of a
remote file which can be used at build time.
The initial usecase for this resolver is to
resolve remote gpgkeys but the resolver has
been made more generic for general files.
2023-03-16 09:55:39 +00:00

66 lines
1.2 KiB
Go

package remotefile
import (
"context"
"github.com/osbuild/osbuild-composer/internal/worker/clienterrors"
)
type resolveResult struct {
url string
content []byte
err error
}
// TODO: could make this more generic
// since this is shared with the container
// resolver
type Resolver struct {
jobs int
queue chan resolveResult
ctx context.Context
}
func NewResolver() *Resolver {
return &Resolver{
ctx: context.Background(),
queue: make(chan resolveResult, 2),
}
}
func (r *Resolver) Add(url string) {
client := NewClient()
r.jobs += 1
go func() {
content, err := client.Resolve(url)
r.queue <- resolveResult{url: url, content: content, err: err}
}()
}
func (r *Resolver) Finish() []Spec {
resultItems := make([]Spec, 0, r.jobs)
for r.jobs > 0 {
result := <-r.queue
r.jobs -= 1
var resultError *clienterrors.Error
if result.err != nil {
resultError = clienterrors.WorkerClientError(
clienterrors.ErrorRemoteFileResolution,
result.err.Error(),
result.url,
)
}
resultItems = append(resultItems, Spec{
URL: result.url,
Content: result.content,
ResolutionError: resultError,
})
}
return resultItems
}