dcmerge/pkg/fetcher/fetcher.go
Markus Pesch 9705b468fa
All checks were successful
Golang Tests / unittest (push) Successful in 28s
Markdown linter / markdown-lint (push) Successful in 3s
Golang CI lint / golangci (stable, ubuntu-latest-amd64) (push) Successful in 1m49s
Golang CI lint / golangci (stable, ubuntu-latest-arm64) (push) Successful in 2m13s
chore(ci): be golangci-lint compatible
2025-05-31 23:02:00 +02:00

100 lines
2.1 KiB
Go

package fetcher
import (
"errors"
"fmt"
"net/http"
"net/url"
"os"
"git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose"
"gopkg.in/yaml.v3"
)
func Fetch(urls ...string) ([]*dockerCompose.Config, error) {
dockerComposeConfigs := make([]*dockerCompose.Config, 0)
for _, rawURL := range urls {
dockerComposeURL, err := url.Parse(rawURL)
if err != nil {
return nil, err
}
switch dockerComposeURL.Scheme {
case "http", "https":
dockerComposeConfig, err := getDockerComposeViaHTTP(dockerComposeURL.String())
if err != nil {
return nil, err
}
dockerComposeConfigs = append(dockerComposeConfigs, dockerComposeConfig)
case "file":
fallthrough
default:
dockerComposeConfig, err := readDockerComposeFromFile(dockerComposeURL.Path)
if err != nil {
return nil, err
}
dockerComposeConfigs = append(dockerComposeConfigs, dockerComposeConfig)
}
}
return dockerComposeConfigs, nil
}
var ErrorPathIsDir error = errors.New("path is a directory")
func getDockerComposeViaHTTP(url string) (*dockerCompose.Config, error) {
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return nil, err
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
defer func() { _ = resp.Body.Close() }()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("received unexpected HTTP-Statuscode %v", resp.StatusCode)
}
dockerCompose := dockerCompose.NewConfig()
yamlDecoder := yaml.NewDecoder(resp.Body)
err = yamlDecoder.Decode(&dockerCompose)
if err != nil {
return nil, err
}
return dockerCompose, nil
}
func readDockerComposeFromFile(name string) (*dockerCompose.Config, error) {
fileStat, err := os.Stat(name)
switch {
case err != nil:
return nil, err
case fileStat.IsDir():
return nil, fmt.Errorf("%w: %s", ErrorPathIsDir, name)
}
file, err := os.Open(name)
if err != nil {
return nil, err
}
defer func() { _ = file.Close() }()
dockerCompose := dockerCompose.NewConfig()
yamlDecoder := yaml.NewDecoder(file)
err = yamlDecoder.Decode(&dockerCompose)
if err != nil {
return nil, err
}
return dockerCompose, nil
}