From b5bb57d8dd052ca1e61287d17467cb67ca8f4a73 Mon Sep 17 00:00:00 2001 From: bnewbold Date: Wed, 18 Apr 2012 20:33:49 -0400 Subject: minor cleanup --- formats.go | 158 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 formats.go (limited to 'formats.go') diff --git a/formats.go b/formats.go new file mode 100644 index 0000000..6c10a0a --- /dev/null +++ b/formats.go @@ -0,0 +1,158 @@ +package main + +// Bom/BomStub conversion/dump/load routines + +import ( + "encoding/csv" + "encoding/json" + "encoding/xml" + "fmt" + "io" + "log" + "strings" +) + +// --------------------- text (CLI only ) ----------------------- + +func DumpBomAsText(bs *BomStub, b *Bom, out io.Writer) { + fmt.Fprintln(out) + fmt.Fprintf(out, "%s (version %s, created %s)\n", bs.Name, b.Version, b.Created) + fmt.Fprintf(out, "Creator: %s\n", bs.Owner) + if bs.Description != "" { + fmt.Fprintf(out, "Description: %s\n", bs.Description) + } + fmt.Println() + // "by line item" + fmt.Fprintf(out, "tag\tqty\tmanufacturer\tmpn\t\tdescription\t\tcomment\n") + for _, li := range b.LineItems { + fmt.Fprintf(out, "%s\t%d\t%s\t%s\t\t%s\t\t%s\n", + li.Tag, + len(li.Elements), + li.Manufacturer, + li.Mpn, + li.Description, + li.Comment) + } + /* // "by circuit element" + fmt.Fprintf(out, "tag\tsymbol\tmanufacturer\tmpn\t\tdescription\t\tcomment\n") + for _, li := range b.LineItems { + for _, elm := range li.Elements { + fmt.Fprintf(out, "%s\t%s\t%s\t%s\t\t%s\t\t%s\n", + li.Tag, + elm, + li.Manufacturer, + li.Mpn, + li.Description, + li.Comment) + } + } + */ +} + +// --------------------- csv ----------------------- + +func DumpBomAsCSV(b *Bom, out io.Writer) { + dumper := csv.NewWriter(out) + defer dumper.Flush() + // "by line item" + dumper.Write([]string{"qty", + "symbols", + "manufacturer", + "mpn", + "description", + "comment"}) + for _, li := range b.LineItems { + dumper.Write([]string{ + fmt.Sprint(len(li.Elements)), + strings.Join(li.Elements, ","), + li.Manufacturer, + li.Mpn, + li.Description, + li.Comment}) + } +} + +func LoadBomFromCSV(out io.Writer) (*Bom, error) { + + b := Bom{} + + dumper := csv.NewWriter(out) + defer dumper.Flush() + // "by line item" + dumper.Write([]string{"qty", + "symbols", + "manufacturer", + "mpn", + "description", + "comment"}) + for _, li := range b.LineItems { + dumper.Write([]string{ + fmt.Sprint(len(li.Elements)), + strings.Join(li.Elements, ","), + li.Manufacturer, + li.Mpn, + li.Description, + li.Comment}) + } + return &b, nil +} + +// --------------------- JSON ----------------------- + +func DumpBomAsJSON(bs *BomStub, b *Bom, out io.Writer) { + + obj := map[string]interface{}{ + "bom_meta": bs, + "bom": b, + } + + enc := json.NewEncoder(out) + if err := enc.Encode(&obj); err != nil { + log.Fatal(err) + } +} + +func LoadBomFromJSON(input io.Reader) (*BomStub, *Bom, error) { + + bs := BomStub{} + b := Bom{} + + obj := map[string]interface{}{ + "bom_meta": bs, + "bom": b, + } + + enc := json.NewDecoder(input) + if err := enc.Decode(&obj); err != nil { + log.Fatal(err) + } + return &bs, &b, nil +} + +// --------------------- XML ----------------------- + +func DumpBomAsXML(bs *BomStub, b *Bom, out io.Writer) { + + enc := xml.NewEncoder(out) + if err := enc.Encode(bs); err != nil { + log.Fatal(err) + } + if err := enc.Encode(b); err != nil { + log.Fatal(err) + } +} + +func LoadBomFromXML(input io.Reader) (*BomStub, *Bom, error) { + + bs := BomStub{} + b := Bom{} + + enc := xml.NewDecoder(input) + if err := enc.Decode(bs); err != nil { + log.Fatal(err) + } + if err := enc.Decode(b); err != nil { + log.Fatal(err) + } + return &bs, &b, nil +} -- cgit v1.2.3