github.com/packtpublishing/learning-functional-programming-in-go@v0.0.0-20230130084745-8b849f6d58c4/Chapter07/func-param/main.go (about) 1 package main 2 3 import ( 4 "server" 5 . "utils" 6 "context" 7 "io/ioutil" 8 "net/http" 9 "os" 10 "os/signal" 11 "time" 12 "fmt" 13 ) 14 15 func init() { 16 GetOptions() 17 InitLog("trace-log.txt", ioutil.Discard, os.Stdout, os.Stderr) 18 } 19 20 func main() { 21 quit := make(chan os.Signal, 1) 22 signal.Notify(quit, os.Interrupt) 23 Info.Printf("Config %+v", Config) 24 newServer, err := server.New( 25 server.MaxConcurrentConnections(4), 26 server.MaxNumber(256), // Config.MaxNumber 27 server.UseNumberHandler(true), 28 server.FormatNumber(func(x int) (string, error) { return fmt.Sprintf("%x", x), nil }), // anonymous fcn 29 //server.FormatNumber(func(x int) (string, error) { return "", errors.New("FormatNumber error") }), // anonymous fcn 30 ) 31 if err != nil { 32 Error.Printf("unable to initialize server: %v", err) 33 os.Exit(1) 34 } 35 srv := &http.Server{ 36 Addr: ":"+Config.Port, 37 Handler: newServer, 38 } 39 40 go func() { 41 <-quit 42 ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(2 * time.Second)) 43 defer cancel() 44 Info.Println("shutting down server...") 45 if err := srv.Shutdown( ctx ); err != nil { 46 Error.Printf("unable to shutdown server: %v", err) 47 } 48 }() 49 Error.Println("server started at localhost:"+Config.Port) 50 err = srv.ListenAndServe() 51 if err != nil && err != http.ErrServerClosed { 52 Error.Printf("ListenAndServe error: %v", err) 53 } 54 Info.Println("server shutdown gracefully") 55 }