diff --git a/hooks/initial.go b/hooks/initial.go index 64df58b..9a100d8 100644 --- a/hooks/initial.go +++ b/hooks/initial.go @@ -193,8 +193,10 @@ func InitConfigReplHook(_ context.Context, cs *corestate.CoreState, x *app.AppX) replacements := map[string]any{ "%tmp%": filepath.Clean(run_manager.RuntimeDir()), "%path%": *x.Config.Env.NodePath, - "%stdout%": os.Stdout, - "%stderr%": os.Stderr, + "%stdout%": "_1STDout", + "%stderr%": "_2STDerr", + "%1%": "_1STDout", + "%2%": "_2STDerr", } processConfig(&x.Config.Conf, replacements) @@ -301,10 +303,32 @@ func processConfig(conf any, replacements map[string]any) error { case reflect.Ptr: if !val.IsNil() { - return processConfig(val.Interface(), replacements) + elem := val.Elem() + if elem.Kind() == reflect.String { + str := elem.String() + if replacement, exists := replacements[str]; exists { + strVal, err := toString(replacement) + if err != nil { + return fmt.Errorf("cannot convert replacement to string: %v", err) + } + elem.SetString(strVal) + } else { + for placeholder, replacement := range replacements { + if strings.Contains(str, placeholder) { + replacementStr, err := toString(replacement) + if err != nil { + return fmt.Errorf("invalid replacement for %q: %v", placeholder, err) + } + newStr := strings.ReplaceAll(str, placeholder, replacementStr) + elem.SetString(newStr) + } + } + } + } else { + return processConfig(elem.Addr().Interface(), replacements) + } } } - return nil } diff --git a/internal/engine/config/compositor.go b/internal/engine/config/compositor.go index c1454c0..88cfb20 100644 --- a/internal/engine/config/compositor.go +++ b/internal/engine/config/compositor.go @@ -60,7 +60,7 @@ func (c *Compositor) LoadConf(path string) error { v.SetDefault("updates.wanted_version", "latest-stable") v.SetDefault("log.json_format", "false") v.SetDefault("log.level", "info") - v.SetDefault("log.output", "%stdout%") + v.SetDefault("log.output", "%1%") if err := v.ReadInConfig(); err != nil { return fmt.Errorf("error reading config: %w", err) diff --git a/internal/engine/config/config.go b/internal/engine/config/config.go index 7cc5afe..3de5399 100644 --- a/internal/engine/config/config.go +++ b/internal/engine/config/config.go @@ -57,7 +57,7 @@ type Updates struct { type Log struct { JSON *bool `mapstructure:"json_format"` Level *string `mapstructure:"level"` - OutPath any `mapstructure:"output"` + OutPath *string `mapstructure:"output"` } // ConfigEnv structure for environment variables diff --git a/internal/engine/logs/logger.go b/internal/engine/logs/logger.go index d268b50..66872f4 100644 --- a/internal/engine/logs/logger.go +++ b/internal/engine/logs/logger.go @@ -6,7 +6,6 @@ package logs import ( "bytes" "context" - "fmt" "io" "log/slog" "os" @@ -58,30 +57,14 @@ func SetupLogger(o *config.Log) (*slog.Logger, error) { handlerOpts.Level = slog.LevelInfo } - switch o.OutPath { - case 1: + switch *o.OutPath { + case "_1STDout": writer = os.Stdout - case 2: - writer = os.Stderr - case os.Stdout: - writer = os.Stdout - case os.Stderr: + case "_2STDerr": writer = os.Stderr default: - var path string - switch v := o.OutPath.(type) { - case string: - path = v - case int, int64, float64: - path = fmt.Sprint(v) - case fmt.Stringer: - path = v.String() - default: - path = fmt.Sprint(v) - } - logFile := &lumberjack.Logger{ - Filename: filepath.Join(path, "event.log"), + Filename: filepath.Join(*o.OutPath, "event.log"), MaxSize: 10, MaxBackups: 5, MaxAge: 28,