Changed package name from github.com/lmika/audax to github.com/lmika/dynamo-browse
58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
package controllers
|
|
|
|
import (
|
|
"encoding/csv"
|
|
tea "github.com/charmbracelet/bubbletea"
|
|
"github.com/lmika/dynamo-browse/internal/common/ui/events"
|
|
"github.com/lmika/dynamo-browse/internal/dynamo-browse/models/attrutils"
|
|
"github.com/pkg/errors"
|
|
"os"
|
|
)
|
|
|
|
type ExportController struct {
|
|
state *State
|
|
columns *ColumnsController
|
|
}
|
|
|
|
func NewExportController(state *State, columns *ColumnsController) *ExportController {
|
|
return &ExportController{state, columns}
|
|
}
|
|
|
|
func (c *ExportController) ExportCSV(filename string) tea.Msg {
|
|
resultSet := c.state.ResultSet()
|
|
if resultSet == nil {
|
|
return events.Error(errors.New("no result set"))
|
|
}
|
|
|
|
f, err := os.Create(filename)
|
|
if err != nil {
|
|
return events.Error(errors.Wrapf(err, "cannot export to '%v'", filename))
|
|
}
|
|
defer f.Close()
|
|
|
|
cw := csv.NewWriter(f)
|
|
defer cw.Flush()
|
|
|
|
columns := c.columns.Columns().VisibleColumns()
|
|
|
|
colNames := make([]string, len(columns))
|
|
for i, c := range columns {
|
|
colNames[i] = c.Name
|
|
}
|
|
if err := cw.Write(colNames); err != nil {
|
|
return events.Error(errors.Wrapf(err, "cannot export to '%v'", filename))
|
|
}
|
|
|
|
row := make([]string, len(columns))
|
|
for _, item := range resultSet.Items() {
|
|
for i, col := range columns {
|
|
row[i], _ = attrutils.AttributeToString(col.Evaluator.EvaluateForItem(item))
|
|
}
|
|
if err := cw.Write(row); err != nil {
|
|
return events.Error(errors.Wrapf(err, "cannot export to '%v'", filename))
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|