package config import ( "errors" "fmt" "io/fs" "io/ioutil" "log" "os/user" "github.com/joho/godotenv" ) // TODO: envvar const ABRA_DIR = ".abra" var ABRA_SERVER_FOLDER = fmt.Sprintf("/%s/%s", ABRA_DIR, "servers") type AppEnv = map[string]string type App struct { Name string Type string Domain string Env AppEnv } type Server struct { Name string } func GetApp(name string) (App, error) { path, err := findAppEndFile(name) if err != nil { return App{}, fmt.Errorf("could not find env file for %s: %s", name, err.Error()) } env := ReadEnv(path) app, err := makeApp(env, name) if err != nil { return App{}, fmt.Errorf("env file for '%s' has issues: %s", name, err.Error()) } return app, nil } func makeApp(env AppEnv, name string) (App, error) { // Checking for domain and type as they are required - apps wont work without them domain, ok := env["DOMAIN"] if !ok { return App{}, errors.New("missing DOMAIN variable") } apptype, ok := env["TYPE"] if !ok { return App{}, errors.New("missing TYPE variable") } return App{ Name: name, Domain: domain, Type: apptype, Env: env, }, nil } func findAppEndFile(name string) (string, error) { return "", nil // FIXME: Placeholder } func getHomeDir() string { // Future: Windows support? user, err := user.Current() if err != nil { log.Fatalf(err.Error()) } return user.HomeDir } func ReadServerNames() []string { var serverNames []string files, err := ioutil.ReadDir(getHomeDir() + ABRA_SERVER_FOLDER) if err != nil { log.Fatal(err.Error()) } for _, file := range files { // Check if file is directory or symlink to one if file.IsDir() || file.Mode()&fs.ModeSymlink != 0 { serverNames = append(serverNames, file.Name()) } } return serverNames } func ReadEnv(filePath string) AppEnv { var envFile AppEnv envFile, err := godotenv.Read(filePath) if err != nil { panic(err) // TODO: Better logging } return envFile }