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  }