package args import ( "flag" "fmt" "os" "strings" "sync" ) type Arguments struct { DatabasePath string TemplatePath string StaticPath string Migrate bool Scheduler bool NtfyEndpoint string NtfyTopics []string NtfyListener bool Port int Server bool } func isDirectory(path string) (bool, error) { fileInfo, err := os.Stat(path) if err != nil { return false, err } return fileInfo.IsDir(), err } func validateArgs(args *Arguments) error { templateIsDir, err := isDirectory(args.TemplatePath) if err != nil || !templateIsDir { return fmt.Errorf("template path is not an accessible directory %s", err) } staticPathIsDir, err := isDirectory(args.StaticPath) if err != nil || !staticPathIsDir { return fmt.Errorf("static path is not an accessible directory %s", err) } return nil } var lock = &sync.Mutex{} var args *Arguments func GetArgs() (*Arguments, error) { lock.Lock() defer lock.Unlock() if args != nil { return args, nil } databasePath := flag.String("database-path", "./whois.db", "Path to the SQLite database") templatePath := flag.String("template-path", "./templates", "Path to the template directory") staticPath := flag.String("static-path", "./static", "Path to the static directory") ntfyEndpoint := flag.String("ntfy-endpoint", "https://ntfy.simponic.hatecomputers.club", "NTFY Endpoint") ntfyTopics := flag.String("ntfy-topics", "testtopic", "Comma-separated NTFY Topics") ntfyListener := flag.Bool("ntfy-listener", false, "Listen to NTFY Topic and propagate messages") scheduler := flag.Bool("scheduler", false, "Run scheduled jobs via cron") migrate := flag.Bool("migrate", false, "Run the migrations") port := flag.Int("port", 8080, "Port to listen on") server := flag.Bool("server", false, "Run the server") flag.Parse() args = &Arguments{ DatabasePath: *databasePath, TemplatePath: *templatePath, StaticPath: *staticPath, Port: *port, Server: *server, Migrate: *migrate, Scheduler: *scheduler, NtfyEndpoint: *ntfyEndpoint, NtfyTopics: strings.Split(*ntfyTopics, ","), NtfyListener: *ntfyListener, } err := validateArgs(args) if err != nil { return nil, err } return args, nil }