2020-07-10 14:17:51 +00:00
|
|
|
package fix
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
|
2020-07-24 13:54:03 +00:00
|
|
|
"github.com/nspcc-dev/neofs-node/cmd/neofs-node/modules/fix/config"
|
|
|
|
"github.com/nspcc-dev/neofs-node/cmd/neofs-node/modules/fix/module"
|
2020-07-10 14:17:51 +00:00
|
|
|
"github.com/nspcc-dev/neofs-node/misc"
|
2020-07-24 13:54:03 +00:00
|
|
|
"github.com/nspcc-dev/neofs-node/pkg/util/grace"
|
|
|
|
"github.com/nspcc-dev/neofs-node/pkg/util/logger"
|
2020-07-10 14:17:51 +00:00
|
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/spf13/viper"
|
|
|
|
"go.uber.org/dig"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
)
|
|
|
|
|
|
|
|
type (
|
|
|
|
// App is an interface of executable application.
|
|
|
|
App interface {
|
|
|
|
Run() error
|
|
|
|
RunAndCatch()
|
|
|
|
}
|
|
|
|
|
|
|
|
app struct {
|
|
|
|
err error
|
|
|
|
log *zap.Logger
|
|
|
|
di *dig.Container
|
|
|
|
runner interface{}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Settings groups the application parameters.
|
|
|
|
Settings struct {
|
|
|
|
File string
|
|
|
|
Type string
|
|
|
|
Name string
|
|
|
|
Prefix string
|
|
|
|
Build string
|
|
|
|
Version string
|
|
|
|
Runner interface{}
|
|
|
|
|
|
|
|
AppDefaults func(v *viper.Viper)
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
func (a *app) RunAndCatch() {
|
|
|
|
err := a.Run()
|
|
|
|
|
|
|
|
if errors.Is(err, context.Canceled) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if ok, _ := strconv.ParseBool(misc.Debug); ok {
|
|
|
|
a.CatchTrace(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
a.Catch(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *app) Run() error {
|
|
|
|
if a.err != nil {
|
|
|
|
return a.err
|
|
|
|
}
|
|
|
|
|
|
|
|
// setup app logger:
|
|
|
|
if err := a.di.Invoke(func(l *zap.Logger) {
|
|
|
|
a.log = l
|
|
|
|
}); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return a.di.Invoke(a.runner)
|
|
|
|
}
|
|
|
|
|
|
|
|
// New is an application constructor.
|
|
|
|
func New(s *Settings, mod module.Module) App {
|
|
|
|
var (
|
|
|
|
a app
|
|
|
|
err error
|
|
|
|
)
|
|
|
|
|
|
|
|
a.di = dig.New(dig.DeferAcyclicVerification())
|
|
|
|
a.runner = s.Runner
|
|
|
|
|
|
|
|
if s.Prefix == "" {
|
|
|
|
s.Prefix = s.Name
|
|
|
|
}
|
|
|
|
|
|
|
|
mod = mod.Append(
|
|
|
|
module.Module{
|
|
|
|
{Constructor: logger.NewLogger},
|
2020-07-24 13:54:03 +00:00
|
|
|
{Constructor: grace.NewGracefulContext},
|
2020-07-10 14:17:51 +00:00
|
|
|
{Constructor: func() (*viper.Viper, error) {
|
|
|
|
return config.NewConfig(config.Params{
|
|
|
|
File: s.File,
|
|
|
|
Type: s.Type,
|
|
|
|
Prefix: strings.ToUpper(s.Prefix),
|
|
|
|
Name: s.Name,
|
|
|
|
Version: fmt.Sprintf("%s(%s)", s.Version, s.Build),
|
|
|
|
|
|
|
|
AppDefaults: s.AppDefaults,
|
|
|
|
})
|
|
|
|
}},
|
|
|
|
})
|
|
|
|
|
|
|
|
if err = module.Provide(a.di, mod); err != nil {
|
|
|
|
a.err = err
|
|
|
|
}
|
|
|
|
|
|
|
|
return &a
|
|
|
|
}
|