package exporter import ( "encoding/csv" "encoding/json" "io" "git.mchus.pro/mchus/logpile/internal/models" ) // Exporter handles data export in various formats type Exporter struct { result *models.AnalysisResult } // New creates a new exporter func New(result *models.AnalysisResult) *Exporter { return &Exporter{result: result} } // ExportCSV exports serial numbers to CSV format func (e *Exporter) ExportCSV(w io.Writer) error { writer := csv.NewWriter(w) defer writer.Flush() // Header if err := writer.Write([]string{"Component", "Serial Number", "Manufacturer", "Location"}); err != nil { return err } if e.result == nil { return nil } // FRU data for _, fru := range e.result.FRU { if fru.SerialNumber == "" { continue } name := fru.ProductName if name == "" { name = fru.Description } if err := writer.Write([]string{ name, fru.SerialNumber, fru.Manufacturer, fru.PartNumber, }); err != nil { return err } } // Hardware data if e.result.Hardware != nil { // Memory for _, mem := range e.result.Hardware.Memory { if mem.SerialNumber == "" { continue } location := mem.Location if location == "" { location = mem.Slot } if err := writer.Write([]string{ mem.PartNumber, mem.SerialNumber, mem.Manufacturer, location, }); err != nil { return err } } // Storage for _, stor := range e.result.Hardware.Storage { if stor.SerialNumber == "" { continue } if err := writer.Write([]string{ stor.Model, stor.SerialNumber, stor.Manufacturer, stor.Slot, }); err != nil { return err } } // PCIe devices for _, pcie := range e.result.Hardware.PCIeDevices { if pcie.SerialNumber == "" { continue } if err := writer.Write([]string{ pcie.DeviceClass, pcie.SerialNumber, pcie.Manufacturer, pcie.Slot, }); err != nil { return err } } } return nil } // ExportJSON exports all data to JSON format func (e *Exporter) ExportJSON(w io.Writer) error { encoder := json.NewEncoder(w) encoder.SetIndent("", " ") return encoder.Encode(e.result) }