// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . package main import ( "encoding/json" "fmt" "log/slog" "os" "headshed/infctl-cli/app" "headshed/infctl-cli/config" "headshed/infctl-cli/logger" ) func main() { config.ParseFlags() baseConfig, projectConfig, err := config.LoadConfigs() if err != nil { fmt.Fprintf(os.Stderr, "Config error: %v\n", err) os.Exit(1) } logFormat := projectConfig.LogFormat if os.Getenv("LOG_FORMAT") != "" { logFormat = os.Getenv("LOG_FORMAT") } logFilePath := os.Getenv("LOG_FILE") logger := logger.SetupLogger(logFormat, logFilePath, slog.LevelDebug) slog.SetDefault(logger) if err := run(projectConfig, baseConfig); err != nil { slog.Error("❌ 💥 Pipeline error: " + err.Error()) os.Exit(1) } else { slog.Info("✅ 🚀 Pipeline completed successfully") } } func run(projectConfig config.ProjectConfig, baseConfig config.BaseConfig) error { appState, err := app.NewAppState(projectConfig, baseConfig) if err != nil { return fmt.Errorf("failed to initialize app state: %w", err) } // Pretty-print appState as JSON if os.Getenv("DEBUG") == "1" { if jsonBytes, err := json.MarshalIndent(appState, "", " "); err == nil { fmt.Printf(">>DEBUG>> appState:\n%s\n", string(jsonBytes)) } else { fmt.Printf(">>DEBUG>> appState: %+v\n", appState) } } if err := appState.CreateProjectAndRunPipeline(); err != nil { return fmt.Errorf("pipeline error: %w", err) } return nil }