diff --git a/bringer/smb.go b/bringer/smb.go index 8a6d3c9..269e9a7 100644 --- a/bringer/smb.go +++ b/bringer/smb.go @@ -141,7 +141,7 @@ func (b *smbBringer) bring(ctx context.Context, t thing.Thing, opts ...Option) ( v.share = v.share.WithContext(ctx) v.File, err = v.share.Open(p) if err != nil { - return nil, fmt.Errorf("open: %w", err) + return v, fmt.Errorf("open: %w", err) } return v, nil diff --git a/cmd/root.go b/cmd/root.go index feda2f1..989be78 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -12,7 +12,7 @@ import ( "github.com/urfave/cli/v3" ) -func NewApp() *cli.Command { +func NewApp(l **slog.Logger) *cli.Command { root := NewCmdBring() flags := []cli.Flag{ &cli.BoolFlag{ @@ -69,17 +69,31 @@ Example: }, Before: func(ctx context.Context, cmd *cli.Command) (context.Context, error) { conf_path := "things.yaml" - if v := cmd.String("conf"); v != "" { - conf_path = v + conf_path_opt := cmd.HasName("conf") + if conf_path_opt { + conf_path = cmd.String("conf") } conf, err := config.LoadFromFilepath(conf_path) if err != nil { - if !errors.Is(err, os.ErrNotExist) { - return nil, fmt.Errorf("load config: %w", err) + conf = config.New() + if !errors.Is(err, os.ErrNotExist) || conf_path_opt { + // There is an error + // - config on default path + // - config on explicitly given path + err := fmt.Errorf("load config: %w", err) + *l = conf.Log.Logger() + return nil, err } - conf = config.New() + // There is no config on default path, so use default config. + defer func() { + (*l).Info("use default config") + }() + } else { + defer func() { + (*l).Info("load config from the file", slog.String("path", conf_path)) + }() } if cmd.Bool("verbose") { conf.Log.Level = "info" @@ -91,30 +105,12 @@ Example: conf.Log.Format = v } - l := conf.Log.Logger() - if err != nil { - l.Info("use default config") - } else { - l.Info("load config from the file", slog.String("path", conf_path)) - } + *l = conf.Log.Logger() ctx = config.Into(ctx, conf) - ctx = log.Into(ctx, l) + ctx = log.Into(ctx, *l) return ctx, nil }, Action: root.Action, - - ExitErrHandler: func(ctx context.Context, cmd *cli.Command, err error) { - l := log.From(ctx) - - var e cli.ExitCoder - if errors.As(err, &e) { - l.Error(e.Error()) - os.Exit(e.ExitCode()) - } else if err != nil { - l.Error(err.Error()) - os.Exit(1) - } - }, } } diff --git a/main.go b/main.go index 3218048..304b715 100644 --- a/main.go +++ b/main.go @@ -2,12 +2,32 @@ package main import ( "context" + "errors" + "log/slog" "os" "github.com/lesomnus/bring/cmd" + "github.com/urfave/cli/v3" ) func main() { - app := cmd.NewApp() - app.Run(context.Background(), os.Args) + var l *slog.Logger + handleError := func(err error) { + l.Error(err.Error()) + + var e cli.ExitCoder + if errors.As(err, &e) { + os.Exit(e.ExitCode()) + } else { + os.Exit(1) + } + } + + app := cmd.NewApp(&l) + app.ExitErrHandler = func(ctx context.Context, cmd *cli.Command, err error) { + handleError(err) + } + if err := app.Run(context.Background(), os.Args); err != nil { + handleError(err) + } }