2021-11-30 12:04:28 +01:00
package compose
import (
"log"
"os"
2022-04-04 09:53:36 +02:00
"path/filepath"
2021-11-30 12:04:28 +01:00
2022-04-03 16:08:00 +02:00
"github.com/compose-spec/compose-go/cli"
"github.com/compose-spec/compose-go/types"
2021-11-30 12:04:28 +01:00
)
2021-12-05 09:05:48 +01:00
const (
ICON_EXCLAMATION = "❕"
)
2021-11-30 15:45:36 +01:00
// Parser is a docker-compose parser.
2021-11-30 12:04:28 +01:00
type Parser struct {
2022-04-04 09:53:36 +02:00
Data * types . Project
temporary * string
2021-11-30 12:04:28 +01:00
}
var Appname = ""
2022-03-31 14:12:20 +02:00
// NewParser create a Parser and parse the file given in filename. If filename is empty, we try to parse the content[0] argument that should be a valid YAML content.
func NewParser ( filename string , content ... string ) * Parser {
2021-11-30 12:04:28 +01:00
2022-04-04 09:53:36 +02:00
p := & Parser { }
if len ( content ) > 0 {
//write it in a temporary file
tmp , err := os . MkdirTemp ( os . TempDir ( ) , "katenary-" )
2022-03-31 14:12:20 +02:00
if err != nil {
log . Fatal ( err )
}
2022-04-04 09:53:36 +02:00
tmpfile , err := os . Create ( filepath . Join ( tmp , "tmp.yml" ) )
2022-03-31 14:12:20 +02:00
if err != nil {
log . Fatal ( err )
}
2022-04-04 09:53:36 +02:00
tmpfile . WriteString ( content [ 0 ] )
tmpfile . Close ( )
filename = tmpfile . Name ( )
p . temporary = & tmp
2022-04-04 13:52:28 +02:00
cli . DefaultFileNames = [ ] string { filename }
2022-04-04 09:53:36 +02:00
}
// if filename is not in cli Default files, add it
if len ( filename ) > 0 {
found := false
for _ , f := range cli . DefaultFileNames {
if f == filename {
found = true
break
}
}
// add the file at first position
if ! found {
cli . DefaultFileNames = append ( [ ] string { filename } , cli . DefaultFileNames ... )
2022-03-31 14:12:20 +02:00
}
}
2021-11-30 12:04:28 +01:00
2022-03-31 14:12:20 +02:00
return p
}
2022-04-04 09:53:36 +02:00
// Parse using compose-go parser, adapt a bit the Project and set Appname.
2022-03-31 14:12:20 +02:00
func ( p * Parser ) Parse ( appname string ) {
2022-04-03 16:08:00 +02:00
// Reminder:
// - set Appname
// - loas services
2021-12-03 11:49:32 +01:00
2022-04-03 16:08:00 +02:00
options , err := cli . NewProjectOptions ( nil ,
cli . WithDefaultConfigPath ,
cli . WithNormalization ( true ) ,
cli . WithInterpolation ( true ) ,
cli . WithResolvedPaths ( true ) ,
)
if err != nil {
log . Fatal ( err )
2022-04-01 09:22:00 +02:00
}
2022-04-03 16:08:00 +02:00
proj , err := cli . ProjectFromOptions ( options )
if err != nil {
2022-04-04 09:53:36 +02:00
log . Fatal ( "Failed to create project" , err )
2021-12-03 11:49:32 +01:00
}
2022-04-03 16:08:00 +02:00
Appname = proj . Name
p . Data = proj
2022-04-04 09:53:36 +02:00
if p . temporary != nil {
defer os . RemoveAll ( * p . temporary )
}
2022-04-01 16:58:13 +02:00
}