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"
2021-04-07 21:02:36 +00:00
"strings"
2021-03-01 00:40:33 +00:00
"time"
"go.uber.org/zap"
2021-04-07 21:02:36 +00:00
"go.uber.org/zap/zapcore"
2021-03-01 00:40:33 +00:00
)
2021-04-07 21:02:36 +00:00
type flagParameter struct {
configFile string
logLevel zapcore . Level
logOutput string
wait time . Duration
}
2021-03-01 00:40:33 +00:00
func main ( ) {
2021-04-07 21:02:36 +00:00
f := flagParameter { }
var logLevel string
flag . DurationVar ( & f . wait , "graceful-timeout" , time . Second * 15 , "the duration for which the server gracefully wait for existing connections to finish - e.g. 15s or 1m" )
flag . StringVar ( & f . configFile , "filename" , "config.hcl" , "configuration filename" )
flag . StringVar ( & logLevel , "logLevel" , "info" , "Log level" )
flag . StringVar ( & f . logOutput , "logOutput" , "logs/weather.log" , "Output log path" )
2021-03-01 00:40:33 +00:00
flag . Parse ( )
2021-04-07 21:02:36 +00:00
f . logLevel = parseLogLevel ( logLevel )
2021-03-01 00:40:33 +00:00
//logger
2021-04-07 21:02:36 +00:00
loggerLevel := zap . NewAtomicLevelAt ( f . logLevel )
defaultLogger := logger . NewLogger ( "weather" , f . logOutput , loggerLevel )
2021-03-01 00:40:33 +00:00
defer defaultLogger . Sync ( )
2021-04-05 14:42:16 +00:00
//configuration parsing
2021-04-07 21:02:36 +00:00
config := internal . ParseConfiguration ( defaultLogger . Sugar ( ) , f . configFile )
2021-04-05 14:42:16 +00:00
2021-03-01 00:40:33 +00:00
//http
2021-04-07 21:02:36 +00:00
addr := web . NewListenAddr ( config . Listen , config . Port )
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
2021-04-07 21:02:36 +00:00
ctx , cancel := context . WithTimeout ( context . Background ( ) , f . wait )
2021-03-01 00:40:33 +00:00
defer cancel ( )
server . Shutdown ( ctx )
log . Println ( "shutting down" )
os . Exit ( 0 )
}
2021-04-07 21:02:36 +00:00
func parseLogLevel ( logLevel string ) zapcore . Level {
zapLevel := zap . InfoLevel
switch strings . ToUpper ( logLevel ) {
case "DEBUG" :
zapLevel = zapcore . DebugLevel
case "INFO" :
zapLevel = zapcore . InfoLevel
case "WARN" :
zapLevel = zapcore . WarnLevel
case "ERROR" :
zapLevel = zapcore . ErrorLevel
case "PANIC" :
zapLevel = zapcore . PanicLevel
case "FATAL" :
zapLevel = zapcore . FatalLevel
}
return zapLevel
}