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