1package csvutil_test 2 3import ( 4 "bytes" 5 "encoding/csv" 6 "fmt" 7 "strconv" 8 "time" 9 10 "github.com/jszwec/csvutil" 11) 12 13func ExampleEncoder_Encode_streaming() { 14 type Address struct { 15 City string 16 Country string 17 } 18 19 type User struct { 20 Name string 21 Address 22 Age int `csv:"age,omitempty"` 23 } 24 25 users := []User{ 26 {Name: "John", Address: Address{"Boston", "USA"}, Age: 26}, 27 {Name: "Bob", Address: Address{"LA", "USA"}, Age: 27}, 28 {Name: "Alice", Address: Address{"SF", "USA"}}, 29 } 30 31 var buf bytes.Buffer 32 w := csv.NewWriter(&buf) 33 enc := csvutil.NewEncoder(w) 34 35 for _, u := range users { 36 if err := enc.Encode(u); err != nil { 37 fmt.Println("error:", err) 38 } 39 } 40 41 w.Flush() 42 if err := w.Error(); err != nil { 43 fmt.Println("error:", err) 44 } 45 46 fmt.Println(buf.String()) 47 48 // Output: 49 // Name,City,Country,age 50 // John,Boston,USA,26 51 // Bob,LA,USA,27 52 // Alice,SF,USA, 53} 54 55func ExampleEncoder_Encode_all() { 56 type Address struct { 57 City string 58 Country string 59 } 60 61 type User struct { 62 Name string 63 Address 64 Age int `csv:"age,omitempty"` 65 } 66 67 users := []User{ 68 {Name: "John", Address: Address{"Boston", "USA"}, Age: 26}, 69 {Name: "Bob", Address: Address{"LA", "USA"}, Age: 27}, 70 {Name: "Alice", Address: Address{"SF", "USA"}}, 71 } 72 73 var buf bytes.Buffer 74 w := csv.NewWriter(&buf) 75 if err := csvutil.NewEncoder(w).Encode(users); err != nil { 76 fmt.Println("error:", err) 77 } 78 79 w.Flush() 80 if err := w.Error(); err != nil { 81 fmt.Println("error:", err) 82 } 83 84 fmt.Println(buf.String()) 85 86 // Output: 87 // Name,City,Country,age 88 // John,Boston,USA,26 89 // Bob,LA,USA,27 90 // Alice,SF,USA, 91} 92 93func ExampleEncoder_EncodeHeader() { 94 type User struct { 95 Name string 96 Age int `csv:"age,omitempty"` 97 } 98 99 var buf bytes.Buffer 100 w := csv.NewWriter(&buf) 101 enc := csvutil.NewEncoder(w) 102 103 if err := enc.EncodeHeader(User{}); err != nil { 104 fmt.Println("error:", err) 105 } 106 107 w.Flush() 108 if err := w.Error(); err != nil { 109 fmt.Println("error:", err) 110 } 111 112 fmt.Println(buf.String()) 113 114 // Output: 115 // Name,age 116} 117 118func ExampleEncoder_Encode_inline() { 119 type Address struct { 120 Street string `csv:"street"` 121 City string `csv:"city"` 122 } 123 124 type User struct { 125 Name string `csv:"name"` 126 Address Address `csv:",inline"` 127 HomeAddress Address `csv:"home_address_,inline"` 128 WorkAddress Address `csv:"work_address_,inline"` 129 Age int `csv:"age,omitempty"` 130 } 131 132 users := []User{ 133 { 134 Name: "John", 135 Address: Address{"Washington", "Boston"}, 136 HomeAddress: Address{"Boylston", "Boston"}, 137 WorkAddress: Address{"River St", "Cambridge"}, 138 Age: 26, 139 }, 140 } 141 142 b, err := csvutil.Marshal(users) 143 if err != nil { 144 fmt.Println("error:", err) 145 } 146 147 fmt.Printf("%s\n", b) 148 149 // Output: 150 // name,street,city,home_address_street,home_address_city,work_address_street,work_address_city,age 151 // John,Washington,Boston,Boylston,Boston,River St,Cambridge,26 152} 153 154func ExampleEncoder_Register() { 155 type Foo struct { 156 Time time.Time `csv:"time"` 157 Hex int `csv:"hex"` 158 PtrHex *int `csv:"ptr_hex"` 159 Buffer *bytes.Buffer `csv:"buffer"` 160 } 161 162 foos := []Foo{ 163 { 164 Time: time.Date(2020, 6, 20, 12, 0, 0, 0, time.UTC), 165 Hex: 15, 166 Buffer: bytes.NewBufferString("hello"), 167 }, 168 } 169 170 marshalInt := func(n *int) ([]byte, error) { 171 if n == nil { 172 return []byte("NULL"), nil 173 } 174 return strconv.AppendInt(nil, int64(*n), 16), nil 175 } 176 177 marshalTime := func(t time.Time) ([]byte, error) { 178 return t.AppendFormat(nil, time.Kitchen), nil 179 } 180 181 // all fields which implement String method will use this, unless their 182 // concrete type was already overriden. 183 marshalStringer := func(s fmt.Stringer) ([]byte, error) { 184 return []byte(s.String()), nil 185 } 186 187 var buf bytes.Buffer 188 w := csv.NewWriter(&buf) 189 enc := csvutil.NewEncoder(w) 190 191 enc.Register(marshalInt) 192 enc.Register(marshalTime) 193 enc.Register(marshalStringer) 194 195 if err := enc.Encode(foos); err != nil { 196 fmt.Println("error:", err) 197 } 198 199 w.Flush() 200 if err := w.Error(); err != nil { 201 fmt.Println("error:", err) 202 } 203 204 fmt.Println(buf.String()) 205 206 // Output: 207 // time,hex,ptr_hex,buffer 208 // 12:00PM,f,NULL,hello 209} 210