Files
masterlog/writer.go
2025-11-10 05:20:25 +01:00

85 lines
1.5 KiB
Go

package masterlog
import (
"io"
"os"
)
// isTerminal checks if the writer is a terminal (TTY)
func isTerminal(w io.Writer) bool {
file, ok := w.(*os.File)
if !ok {
return false
}
// Check if it's a terminal by trying to get file info
stat, err := file.Stat()
if err != nil {
return false
}
// Check if it's a character device (terminal)
return (stat.Mode() & os.ModeCharDevice) != 0
}
// ConsoleWriter writes to stdout
type ConsoleWriter struct {
writer io.Writer
isTerminal bool
}
func NewConsoleWriter() *ConsoleWriter {
writer := os.Stdout
return &ConsoleWriter{
writer: writer,
isTerminal: isTerminal(writer),
}
}
func (w *ConsoleWriter) Write(data []byte) error {
_, err := w.writer.Write(data)
return err
}
func (w *ConsoleWriter) Close() error {
return nil
}
func (w *ConsoleWriter) SupportsColors() bool {
return w.isTerminal
}
// FileWriter writes to a file
type FileWriter struct {
file *os.File
writer io.Writer
}
func NewFileWriter(filename string) (*FileWriter, error) {
file, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
return nil, err
}
return &FileWriter{
file: file,
writer: file,
}, nil
}
func (w *FileWriter) Write(data []byte) error {
_, err := w.writer.Write(data)
return err
}
func (w *FileWriter) Close() error {
if w.file != nil {
return w.file.Close()
}
return nil
}
func (w *FileWriter) SupportsColors() bool {
return false // File writers never support colors
}