2021-03-01 00:40:33 +00:00
package main
import (
"context"
"flag"
2021-04-05 14:42:16 +00:00
"go/weather/internal"
2021-03-01 23:53:22 +00:00
"go/weather/internal/version"
2021-03-01 00:40:33 +00:00
"go/weather/internal/web"
"go/weather/pkg/logger"
"log"
"os"
"os/signal"
"time"
"go.uber.org/zap"
)
func main ( ) {
var wait time . Duration
2021-04-05 14:42:16 +00:00
var configFile string
2021-03-01 00:40:33 +00:00
flag . DurationVar ( & wait , "graceful-timeout" , time . Second * 15 , "the duration for which the server gracefully wait for existing connections to finish - e.g. 15s or 1m" )
2021-04-05 14:42:16 +00:00
flag . StringVar ( & configFile , "filename" , "config.hcl" , "configuration filename" )
2021-03-01 00:40:33 +00:00
flag . Parse ( )
//logger
loggerLevel := zap . NewAtomicLevel ( )
2021-03-04 02:31:29 +00:00
defaultLogger := logger . NewLogger ( "weather" , "weather.log" , loggerLevel )
2021-03-01 00:40:33 +00:00
defer defaultLogger . Sync ( )
2021-04-05 14:42:16 +00:00
//configuration parsing
config := internal . ParseConfiguration ( defaultLogger . Sugar ( ) , configFile )
2021-03-01 00:40:33 +00:00
//http
2021-03-17 22:19:05 +00:00
addr := web . NewListenAddr ( "0.0.0.0" , 8080 )
2021-03-01 00:40:33 +00:00
defaultLogger . Sugar ( ) . Infof ( "Weather server is listening on %s" , addr )
2021-03-01 23:53:22 +00:00
server := web . New ( defaultLogger , addr , version . String ( ) ) .
2021-03-01 00:40:33 +00:00
WithTLSConfigure ( ) .
2021-04-05 14:42:16 +00:00
WithHandler ( config ) .
2021-03-01 00:40:33 +00:00
WithHTTPLogging ( ) .
WithErrorLogging ( )
go func ( ) {
if err := server . Serve ( ) ; err != nil {
defaultLogger . Sugar ( ) . Info ( err )
}
} ( )
c := make ( chan os . Signal , 1 )
signal . Notify ( c , os . Interrupt )
<- c
ctx , cancel := context . WithTimeout ( context . Background ( ) , wait )
defer cancel ( )
server . Shutdown ( ctx )
log . Println ( "shutting down" )
os . Exit ( 0 )
}