package main import ( "encoding/csv" "fmt" "io" "github.com/nmoniz/any2anexoj/internal" ) type CSVWriter struct { w *csv.Writer } func NewCSVWriter(w io.Writer) *CSVWriter { return &CSVWriter{w: csv.NewWriter(w)} } func (cw *CSVWriter) Render(aw *internal.AggregatorWriter) error { err := cw.w.Write([]string{ "source_country", "code", "realization_year", "realization_month", "realization_day", "realization_value", "acquisition_year", "acquisition_month", "acquisition_day", "acquisition_value", "expenses", "foreign_tax_paid", "counter_country", }) if err != nil { return fmt.Errorf("write csv header: %w", err) } for ri := range aw.Iter() { err := cw.w.Write(reportItemToRow(ri)) if err != nil { return fmt.Errorf("write csv row: %w", err) } } cw.w.Flush() return cw.w.Error() } func reportItemToRow(ri internal.ReportItem) []string { return []string{ fmt.Sprintf("%d", ri.AssetCountry), string(ri.Nature), fmt.Sprintf("%d", ri.SellTimestamp.Year()), fmt.Sprintf("%d", int(ri.SellTimestamp.Month())), fmt.Sprintf("%d", ri.SellTimestamp.Day()), ri.SellValue.StringFixed(2), fmt.Sprintf("%d", ri.BuyTimestamp.Year()), fmt.Sprintf("%d", int(ri.BuyTimestamp.Month())), fmt.Sprintf("%d", ri.BuyTimestamp.Day()), ri.BuyValue.StringFixed(2), ri.Fees.StringFixed(2), ri.Taxes.StringFixed(2), fmt.Sprintf("%d", ri.BrokerCountry), } }