package editor import ( "fmt" "log/slog" "os" "sync" "code.chimeric.al/dwrz/wen/internal/editor/buffer" "code.chimeric.al/dwrz/wen/internal/editor/canvas" "code.chimeric.al/dwrz/wen/internal/editor/event" "code.chimeric.al/dwrz/wen/internal/editor/prompt" "code.chimeric.al/dwrz/wen/pkg/terminal" "code.chimeric.al/dwrz/wen/pkg/terminal/input" ) // TODO: add undo and redo. // TODO: add search and replace. type Editor struct { canvas *canvas.Canvas input chan *input.Event log *slog.Logger events chan event.Event reader *input.Reader terminal *terminal.Terminal tmpdir string mu sync.Mutex active *buffer.Buffer buffers map[string]*buffer.Buffer prompt *prompt.Prompt } type Parameters struct { In *os.File Log *slog.Logger Out *os.File TempDir string Terminal *terminal.Terminal } // TODO: read text piped in from stdin. // TODO: pipe buffer texts through shell command. func New(p Parameters) (*Editor, error) { var editor = &Editor{ buffers: map[string]*buffer.Buffer{}, events: make(chan event.Event), input: make(chan *input.Event), log: p.Log, terminal: p.Terminal, tmpdir: p.TempDir, prompt: prompt.New(prompt.Parameters{Log: p.Log}), } // Setup user input. editor.reader = input.New(input.Parameters{ Chan: editor.input, In: p.In, Log: p.Log, }) // Setup the canvas. editor.canvas = canvas.New(canvas.Parameters{ Log: p.Log, Out: p.Out, Terminal: p.Terminal, }) // Create the initial scratch buffer. scratch, err := buffer.Create(buffer.NewBufferParams{ Name: editor.tmpdir + "/scratch", Log: editor.log, }) if err != nil { return nil, fmt.Errorf( "failed to create scratch buffer: %v", err, ) } editor.active = scratch editor.buffers[scratch.Name()] = scratch return editor, nil }