package main import ( "net" "net/http" "github.com/alecthomas/kong" "github.com/rs/zerolog" ) type CLI struct { File string `arg:"" name:"file" short:"f" help:"Path to CSV redirects file." type:"path"` Host string `name:"host" help:"HTTP listen host." default:"${host}"` Port string `name:"port" short:"p" help:"HTTP listen port." default:"${port}"` } type HttpServer struct { CLI *CLI Log zerolog.Logger } func (srv *HttpServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { statusCode := 404 srv.Log.Trace().Int("result", statusCode).Msg(req.URL.Path) w.WriteHeader(statusCode) } func main() { vars := kong.Vars{ "host": "localhost", "port": "4000", } cli := &CLI{} kong.Parse(cli, vars) srv := &HttpServer{ CLI: cli, Log: zerolog.New(zerolog.NewConsoleWriter()).With().Timestamp().Logger(), } addr := net.JoinHostPort(cli.Host, cli.Port) errc := make(chan error) go func() { errc <- http.ListenAndServe(addr, srv) }() srv.Log.Info().Msgf("Listening at %s", addr) err := <-errc panic(err) }