diff --git a/src/app/project_runner.go b/src/app/project_runner.go index a7ec1e8..3950db3 100644 --- a/src/app/project_runner.go +++ b/src/app/project_runner.go @@ -917,8 +917,9 @@ func (p *ProjectRunner) UpdateProject(project *types.Project) (map[string]string func (p *ProjectRunner) ReloadProject() (map[string]string, error) { opts := &loader.LoaderOptions{ - FileNames: p.project.FileNames, - EnvFileNames: p.project.EnvFileNames, + FileNames: p.project.FileNames, + EnvFileNames: p.project.EnvFileNames, + IsInternalLoader: true, } opts.WithTuiDisabled(p.disableDotenv) opts.WithTuiDisabled(p.isTuiOn) diff --git a/src/loader/loader.go b/src/loader/loader.go index f862347..a1ba83e 100644 --- a/src/loader/loader.go +++ b/src/loader/loader.go @@ -23,7 +23,10 @@ func Load(opts *LoaderOptions) (*types.Project, error) { } for _, file := range opts.FileNames { - p := loadProjectFromFile(file, opts.disableDotenv, opts.EnvFileNames) + p, err := loadProjectFromFile(file, opts) + if err != nil { + return nil, err + } opts.projects = append(opts.projects, p) } mergedProject, err := merge(opts) @@ -79,7 +82,7 @@ func admitProcesses(opts *LoaderOptions, p *types.Project) *types.Project { return p } -func loadProjectFromFile(inputFile string, disableDotEnv bool, envFileNames []string) *types.Project { +func loadProjectFromFile(inputFile string, opts *LoaderOptions) (*types.Project, error) { yamlFile, err := os.ReadFile(inputFile) if err != nil { if errors.Is(err, os.ErrNotExist) { @@ -88,9 +91,9 @@ func loadProjectFromFile(inputFile string, disableDotEnv bool, envFileNames []st log.Fatal().Err(err).Msgf("Failed to read %s", inputFile) } - if !disableDotEnv { + if !opts.disableDotenv { // .env is optional we don't care if it errors - _ = godotenv.Load(envFileNames...) + _ = godotenv.Load(opts.EnvFileNames...) } const envEscaped = "##PC_ENV_ESCAPED##" @@ -104,20 +107,23 @@ func loadProjectFromFile(inputFile string, disableDotEnv bool, envFileNames []st } err = yaml.Unmarshal([]byte(temp), project) if err != nil { + if opts.IsInternalLoader { + return nil, err + } log.Fatal().Err(err).Msgf("Failed to parse %s", inputFile) } if project.DisableEnvExpansion { err = yaml.Unmarshal(yamlFile, project) if err != nil { + if opts.IsInternalLoader { + return nil, err + } log.Fatal().Err(err).Msgf("Failed to parse %s", inputFile) } } - if err != nil { - log.Fatal().Err(err).Msgf("Failed to validate %s", inputFile) - } log.Info().Msgf("Loaded project from %s", inputFile) - return project + return project, nil } func findFiles(names []string, pwd string) []string { diff --git a/src/loader/loader_options.go b/src/loader/loader_options.go index 442808b..23ea6d6 100644 --- a/src/loader/loader_options.go +++ b/src/loader/loader_options.go @@ -8,13 +8,14 @@ import ( ) type LoaderOptions struct { - workingDir string - FileNames []string - EnvFileNames []string - projects []*types.Project - admitters []admitter.Admitter - disableDotenv bool - isTuiDisabled bool + workingDir string + FileNames []string + EnvFileNames []string + IsInternalLoader bool + projects []*types.Project + admitters []admitter.Admitter + disableDotenv bool + isTuiDisabled bool } func (o *LoaderOptions) AddAdmitter(adm ...admitter.Admitter) {