67 lines
1.2 KiB
Go
67 lines
1.2 KiB
Go
package buffer
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"bytes"
|
||
|
|
"fmt"
|
||
|
|
"os"
|
||
|
|
"time"
|
||
|
|
)
|
||
|
|
|
||
|
|
// TODO: save to temporary file, then move over current file.
|
||
|
|
// TODO: autosave; track dirty buffer.
|
||
|
|
func (b *Buffer) Save() error {
|
||
|
|
var buf bytes.Buffer
|
||
|
|
switch len(b.lines) {
|
||
|
|
case 1:
|
||
|
|
if l := b.lines[0]; l.Length() != 0 {
|
||
|
|
if _, err := buf.WriteString(l.String()); err != nil {
|
||
|
|
return fmt.Errorf(
|
||
|
|
"failed to write to buffer: %v", err,
|
||
|
|
)
|
||
|
|
}
|
||
|
|
if _, err := buf.WriteRune('\n'); err != nil {
|
||
|
|
return fmt.Errorf(
|
||
|
|
"failed to write to buffer: %v", err,
|
||
|
|
)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
default:
|
||
|
|
for _, l := range b.lines {
|
||
|
|
if _, err := buf.WriteString(l.String()); err != nil {
|
||
|
|
return fmt.Errorf(
|
||
|
|
"failed to write to buffer: %v", err,
|
||
|
|
)
|
||
|
|
}
|
||
|
|
if _, err := buf.WriteRune('\n'); err != nil {
|
||
|
|
return fmt.Errorf(
|
||
|
|
"failed to write to buffer: %v", err,
|
||
|
|
)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if err := os.WriteFile(
|
||
|
|
b.name,
|
||
|
|
buf.Bytes(),
|
||
|
|
0666,
|
||
|
|
); err != nil {
|
||
|
|
return fmt.Errorf("failed to write file: %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
b.saved = time.Now()
|
||
|
|
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (b *Buffer) SaveAs(name string) error {
|
||
|
|
old := b.name
|
||
|
|
b.name = name
|
||
|
|
|
||
|
|
if err := b.Save(); err != nil {
|
||
|
|
b.name = old
|
||
|
|
return fmt.Errorf("failed to save file as %s: %w", name, err)
|
||
|
|
}
|
||
|
|
|
||
|
|
return nil
|
||
|
|
}
|