Cybersecurity-Projects/PROJECTS/beginner/steganography-multi-tool/internal/tui/commands.go

85 lines
1.6 KiB
Go

/*
©AngelaMos | 2026
commands.go
Bubbletea commands and messages for engine calls, file IO, and the embed animation
*/
package tui
import (
"bytes"
"os"
"time"
"github.com/CarterPerez-dev/crypha/internal/engine"
tea "github.com/charmbracelet/bubbletea"
)
type fileLoadedMsg struct {
origin stage
path string
data []byte
err error
}
type hideDoneMsg struct {
res engine.HideResult
data []byte
err error
}
type revealDoneMsg struct {
res engine.RevealResult
err error
}
type savedMsg struct {
path string
err error
}
type tickMsg time.Time
func loadFileCmd(origin stage, path string) tea.Cmd {
return func() tea.Msg {
data, err := os.ReadFile(path)
return fileLoadedMsg{origin: origin, path: path, data: data, err: err}
}
}
func hideCmd(req engine.HideRequest, outPath string) tea.Cmd {
return func() tea.Msg {
var buf bytes.Buffer
req.Out = &buf
res, err := engine.Hide(req)
if err != nil {
return hideDoneMsg{err: err}
}
if err := os.WriteFile(outPath, buf.Bytes(), outFilePerm); err != nil {
return hideDoneMsg{err: err}
}
return hideDoneMsg{res: res, data: buf.Bytes()}
}
}
func revealCmd(format string, stego, pass []byte) tea.Cmd {
return func() tea.Msg {
res, err := engine.Reveal(engine.RevealRequest{Format: format, Stego: stego, Passphrase: pass})
return revealDoneMsg{res: res, err: err}
}
}
func saveCmd(path string, data []byte) tea.Cmd {
return func() tea.Msg {
err := os.WriteFile(path, data, outFilePerm)
return savedMsg{path: path, err: err}
}
}
func tick() tea.Cmd {
return tea.Tick(animInterval, func(t time.Time) tea.Msg {
return tickMsg(t)
})
}