package internal import ( "errors" "strings" "coopcloud.tech/abra/pkg/app" "coopcloud.tech/abra/pkg/config" "coopcloud.tech/abra/pkg/log" "coopcloud.tech/abra/pkg/recipe" "github.com/AlecAivazis/survey/v2" "github.com/urfave/cli" ) // ValidateRecipe ensures the recipe arg is valid. func ValidateRecipe(c *cli.Context) recipe.Recipe { recipeName := c.Args().First() if recipeName == "" && !NoInput { var recipes []string catl, err := recipe.ReadRecipeCatalogue(Offline) if err != nil { log.Fatal(err) } knownRecipes := make(map[string]bool) for name := range catl { knownRecipes[name] = true } localRecipes, err := recipe.GetRecipesLocal() if err != nil { log.Fatal(err) } for _, recipeLocal := range localRecipes { if _, ok := knownRecipes[recipeLocal]; !ok { knownRecipes[recipeLocal] = true } } for recipeName := range knownRecipes { recipes = append(recipes, recipeName) } prompt := &survey.Select{ Message: "Select recipe", Options: recipes, } if err := survey.AskOne(prompt, &recipeName); err != nil { log.Fatal(err) } } if recipeName == "" { ShowSubcommandHelpAndError(c, errors.New("no recipe name provided")) } chosenRecipe := recipe.Get(recipeName) err := chosenRecipe.EnsureExists() if err != nil { log.Fatal(err) } _, err = chosenRecipe.GetComposeConfig(nil) if err != nil { if c.Command.Name == "generate" { if strings.Contains(err.Error(), "missing a compose") { log.Fatal(err) } log.Warn(err) } else { if strings.Contains(err.Error(), "template_driver is not allowed") { log.Warnf("ensure %s recipe compose.* files include \"version: '3.8'\"", recipeName) } log.Fatalf("unable to validate recipe: %s", err) } } log.Debugf("validated %s as recipe argument", recipeName) return chosenRecipe } // ValidateApp ensures the app name arg is valid. func ValidateApp(c *cli.Context) app.App { appName := c.Args().First() if appName == "" { ShowSubcommandHelpAndError(c, errors.New("no app provided")) } app, err := app.Get(appName) if err != nil { log.Fatal(err) } log.Debugf("validated %s as app argument", appName) return app } // ValidateDomain ensures the domain name arg is valid. func ValidateDomain(c *cli.Context) string { domainName := c.Args().First() if domainName == "" && !NoInput { prompt := &survey.Input{ Message: "Specify a domain name", Default: "example.com", } if err := survey.AskOne(prompt, &domainName); err != nil { log.Fatal(err) } } if domainName == "" { ShowSubcommandHelpAndError(c, errors.New("no domain provided")) } log.Debugf("validated %s as domain argument", domainName) return domainName } // ValidateSubCmdFlags ensures flag order conforms to correct order func ValidateSubCmdFlags(c *cli.Context) bool { for argIdx, arg := range c.Args() { if !strings.HasPrefix(arg, "--") { for _, flag := range c.Args()[argIdx:] { if strings.HasPrefix(flag, "--") { return false } } } } return true } // ValidateServer ensures the server name arg is valid. func ValidateServer(c *cli.Context) string { serverName := c.Args().First() serverNames, err := config.ReadServerNames() if err != nil { log.Fatal(err) } if serverName == "" && !NoInput { prompt := &survey.Select{ Message: "Specify a server name", Options: serverNames, } if err := survey.AskOne(prompt, &serverName); err != nil { log.Fatal(err) } } matched := false for _, name := range serverNames { if name == serverName { matched = true } } if serverName == "" { ShowSubcommandHelpAndError(c, errors.New("no server provided")) } if !matched { ShowSubcommandHelpAndError(c, errors.New("server doesn't exist?")) } log.Debugf("validated %s as server argument", serverName) return serverName }