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 }