Files
katenary/internal/parser/main.go

65 lines
1.7 KiB
Go
Raw Normal View History

2025-06-26 23:53:05 +02:00
// Package parser is a wrapper around compose-go to parse compose files.
package parser
import (
"context"
"path/filepath"
"github.com/compose-spec/compose-go/v2/cli"
"github.com/compose-spec/compose-go/v2/types"
2026-03-08 22:38:03 +01:00
"katenary.io/internal/logger"
)
2024-04-19 22:26:45 +02:00
func init() {
// prepend compose.katenary.yaml to the list of default override file names
cli.DefaultOverrideFileNames = append([]string{
"compose.katenary.yml",
"compose.katenary.yaml",
}, cli.DefaultOverrideFileNames...)
// add podman-compose files
2024-04-19 22:26:45 +02:00
cli.DefaultOverrideFileNames = append(cli.DefaultOverrideFileNames,
[]string{
"podman-compose.katenary.yml",
"podman-compose.katenary.yaml",
"podman-compose.yml",
"podman-compose.yaml",
}...)
}
// Parse compose files and return a project. The project is parsed with dotenv, osenv and profiles.
func Parse(profiles []string, envFiles []string, dockerComposeFile ...string) (*types.Project, error) {
if len(dockerComposeFile) == 0 {
cli.DefaultOverrideFileNames = append(cli.DefaultOverrideFileNames, dockerComposeFile...)
}
// resolve absolute paths of envFiles
for i := range envFiles {
var err error
envFiles[i], err = filepath.Abs(envFiles[i])
if err != nil {
2026-03-08 22:38:03 +01:00
logger.Fatal(err)
}
}
opts := []cli.ProjectOptionsFn{
cli.WithProfiles(profiles),
cli.WithInterpolation(true),
cli.WithEnvFiles(envFiles...),
cli.WithOsEnv,
cli.WithDotEnv,
cli.WithNormalization(true),
cli.WithResolvedPaths(false),
}
if len(dockerComposeFile) == 0 {
opts = append(opts, cli.WithDefaultConfigPath)
}
options, err := cli.NewProjectOptions(dockerComposeFile, opts...)
if err != nil {
return nil, err
}
ctx := context.TODO()
return cli.ProjectFromOptions(ctx, options)
}