persistent.go

 1package shell
 2
 3import (
 4	"sync"
 5
 6	"github.com/charmbracelet/crush/internal/logging"
 7)
 8
 9// PersistentShell is a singleton shell instance that maintains state across the application
10type PersistentShell struct {
11	*Shell
12}
13
14var (
15	once          sync.Once
16	shellInstance *PersistentShell
17)
18
19// GetPersistentShell returns the singleton persistent shell instance
20// This maintains backward compatibility with the existing API
21func GetPersistentShell(cwd string) *PersistentShell {
22	once.Do(func() {
23		shellInstance = &PersistentShell{
24			Shell: NewShell(&Options{
25				WorkingDir: cwd,
26				Logger:     &loggingAdapter{},
27			}),
28		}
29	})
30	return shellInstance
31}
32
33// loggingAdapter adapts the internal logging package to the Logger interface
34type loggingAdapter struct{}
35
36func (l *loggingAdapter) InfoPersist(msg string, keysAndValues ...interface{}) {
37	logging.InfoPersist(msg, keysAndValues...)
38}