Skip to content

Commit 0f17683

Browse files
committed
Restrict user to create encode column config directly
1 parent 8641e46 commit 0f17683

File tree

4 files changed

+59
-61
lines changed

4 files changed

+59
-61
lines changed

docs/DECODING.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ tom ,26,new york`)
7070
})
7171

7272
cfg.ConfigureColumn("age", func(cfg *csvlib.DecodeColumnConfig) {
73-
cfg.alidatorFuncs = []csvlib.ValidatorFunc{csvlib.ValidatorRange(20, 30)}
73+
cfg.ValidatorFuncs = []csvlib.ValidatorFunc{csvlib.ValidatorRange(20, 30)}
7474
})
7575
})
7676
if err != nil {

docs/ENCODING.md

+7-11
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,9 @@
8080
{Name: " tom ", Age: 19, Address: "new york"},
8181
}
8282
data, err := csvlib.Marshal(students, func(cfg *csvlib.EncodeConfig) {
83-
cfg.ColumnConfigMap = csvlib.EncodeColumnConfigMap{
84-
"name": {
85-
PostprocessorFuncs: []csvlib.ProcessorFunc{csvlib.ProcessorTrim, csvlib.ProcessorUpper},
86-
},
87-
}
83+
cfg.ConfigureColumn("name", func(cfg *csvlib.EncodeColumnConfig) {
84+
cfg.PostprocessorFuncs = []csvlib.ProcessorFunc{csvlib.ProcessorTrim, csvlib.ProcessorUpper}
85+
})
8886
})
8987
if err != nil {
9088
fmt.Println("error:", err)
@@ -113,11 +111,9 @@
113111
{Name: "tom", Age: 19, Address: "new york"},
114112
}
115113
data, err := csvlib.Marshal(students, func(cfg *csvlib.EncodeConfig) {
116-
cfg.ColumnConfigMap = csvlib.EncodeColumnConfigMap{
117-
"address": {
118-
Skip: true,
119-
},
120-
}
114+
cfg.ConfigureColumn("address", func(cfg *csvlib.EncodeColumnConfig) {
115+
cfg.Skip = true
116+
})
121117
})
122118
if err != nil {
123119
fmt.Println("error:", err)
@@ -245,7 +241,7 @@ func (d BirthDate) MarshalCSV() ([]byte, error) {
245241
var buf bytes.Buffer
246242
writer := csv.NewWriter(&buf)
247243
writer.Comma = '\t'
248-
244+
249245
err := csvlib.NewEncoder(writer).Encode(students)
250246
if err != nil {
251247
fmt.Println("error:", err)

encoder.go

+27-13
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,27 @@ type EncodeConfig struct {
2222
// LocalizationFunc localization function, required when LocalizeHeader is true
2323
LocalizationFunc LocalizationFunc
2424

25-
// ColumnConfigMap a map consists of configuration for specific columns (optional)
26-
ColumnConfigMap EncodeColumnConfigMap
25+
// columnConfigMap a map consists of configuration for specific columns (optional)
26+
columnConfigMap map[string]*EncodeColumnConfig
2727
}
2828

29-
type EncodeColumnConfigMap map[string]*EncodeColumnConfig
29+
func defaultEncodeConfig() *EncodeConfig {
30+
return &EncodeConfig{
31+
TagName: DefaultTagName,
32+
}
33+
}
34+
35+
func (c *EncodeConfig) ConfigureColumn(name string, fn func(*EncodeColumnConfig)) {
36+
if c.columnConfigMap == nil {
37+
c.columnConfigMap = map[string]*EncodeColumnConfig{}
38+
}
39+
columnCfg, ok := c.columnConfigMap[name]
40+
if !ok {
41+
columnCfg = defaultEncodeColumnConfig()
42+
c.columnConfigMap[name] = columnCfg
43+
}
44+
fn(columnCfg)
45+
}
3046

3147
type EncodeColumnConfig struct {
3248
// Skip whether skip encoding the column or not (this is equivalent to use `csv:"-"` in struct tag)
@@ -40,10 +56,8 @@ type EncodeColumnConfig struct {
4056
PostprocessorFuncs []ProcessorFunc
4157
}
4258

43-
func defaultEncodeConfig() *EncodeConfig {
44-
return &EncodeConfig{
45-
TagName: DefaultTagName,
46-
}
59+
func defaultEncodeColumnConfig() *EncodeColumnConfig {
60+
return &EncodeColumnConfig{}
4761
}
4862

4963
type EncodeOption func(cfg *EncodeConfig)
@@ -291,7 +305,7 @@ func (e *Encoder) parseColumnsMeta(itemType reflect.Type, val reflect.Value) err
291305
func (e *Encoder) validateColumnsMeta(colsMeta []*encodeColumnMeta) error {
292306
cfg := e.cfg
293307
// Make sure all column options valid
294-
for colKey := range cfg.ColumnConfigMap {
308+
for colKey := range cfg.columnConfigMap {
295309
if !gofn.ContainPred(colsMeta, func(colMeta *encodeColumnMeta) bool {
296310
return colMeta.headerKey == colKey || colMeta.parentKey == colKey
297311
}) {
@@ -348,7 +362,7 @@ func (e *Encoder) parseColumnsMetaFromStructType(itemType reflect.Type, val refl
348362
continue
349363
}
350364

351-
colMeta.copyConfig(cfg.ColumnConfigMap[colMeta.headerKey])
365+
colMeta.copyConfig(cfg.columnConfigMap[colMeta.headerKey])
352366
if err = colMeta.localizeHeader(cfg); err != nil {
353367
return nil, err
354368
}
@@ -412,9 +426,9 @@ func (e *Encoder) parseInlineColumnFixedType(typ reflect.Type, parent *encodeCol
412426
},
413427
}
414428

415-
columnCfg := cfg.ColumnConfigMap[headerKey]
429+
columnCfg := cfg.columnConfigMap[headerKey]
416430
if columnCfg == nil {
417-
columnCfg = cfg.ColumnConfigMap[colMeta.parentKey]
431+
columnCfg = cfg.columnConfigMap[colMeta.parentKey]
418432
}
419433
colMeta.copyConfig(columnCfg)
420434
if err = colMeta.localizeHeader(cfg); err != nil {
@@ -470,9 +484,9 @@ func (e *Encoder) parseInlineColumnDynamicType(inlineStruct reflect.Value, paren
470484
colMeta.parentKey = parent.headerKey
471485
colMeta.inlineColumnMeta = inlineColumnMeta
472486

473-
columnCfg := cfg.ColumnConfigMap[colMeta.headerKey]
487+
columnCfg := cfg.columnConfigMap[colMeta.headerKey]
474488
if columnCfg == nil {
475-
columnCfg = cfg.ColumnConfigMap[colMeta.parentKey]
489+
columnCfg = cfg.columnConfigMap[colMeta.parentKey]
476490
}
477491
colMeta.copyConfig(columnCfg)
478492

encoder_test.go

+24-36
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,9 @@ func Test_Encode_configOption(t *testing.T) {
2121
v := []Item{}
2222
buf := bytes.NewBuffer([]byte{})
2323
err := NewEncoder(csv.NewWriter(buf), func(cfg *EncodeConfig) {
24-
cfg.ColumnConfigMap = EncodeColumnConfigMap{
25-
"ColX": {},
26-
"col1": {},
27-
"colX": {},
28-
}
24+
cfg.ConfigureColumn("ColX", func(cfg *EncodeColumnConfig) {})
25+
cfg.ConfigureColumn("col1", func(cfg *EncodeColumnConfig) {})
26+
cfg.ConfigureColumn("colX", func(cfg *EncodeColumnConfig) {})
2927
}).Encode(v)
3028
assert.ErrorIs(t, err, ErrConfigOptionInvalid)
3129
})
@@ -113,11 +111,9 @@ func Test_Encode_withPostprocessor(t *testing.T) {
113111
}
114112
buf := bytes.NewBuffer([]byte{})
115113
err := NewEncoder(csv.NewWriter(buf), func(cfg *EncodeConfig) {
116-
cfg.ColumnConfigMap = EncodeColumnConfigMap{
117-
"col2": {
118-
PostprocessorFuncs: []ProcessorFunc{ProcessorTrim, ProcessorUpper},
119-
},
120-
}
114+
cfg.ConfigureColumn("col2", func(cfg *EncodeColumnConfig) {
115+
cfg.PostprocessorFuncs = []ProcessorFunc{ProcessorTrim, ProcessorUpper}
116+
})
121117
}).Encode(v)
122118
assert.Nil(t, err)
123119
assert.Equal(t, gofn.MultilineString(
@@ -140,14 +136,12 @@ func Test_Encode_withPostprocessor(t *testing.T) {
140136
}
141137
buf := bytes.NewBuffer([]byte{})
142138
err := NewEncoder(csv.NewWriter(buf), func(cfg *EncodeConfig) {
143-
cfg.ColumnConfigMap = EncodeColumnConfigMap{
144-
"col1": {
145-
PostprocessorFuncs: []ProcessorFunc{ProcessorNumberGroupComma},
146-
},
147-
"col2": {
148-
PostprocessorFuncs: []ProcessorFunc{ProcessorNumberGroupComma},
149-
},
150-
}
139+
cfg.ConfigureColumn("col1", func(cfg *EncodeColumnConfig) {
140+
cfg.PostprocessorFuncs = []ProcessorFunc{ProcessorNumberGroupComma}
141+
})
142+
cfg.ConfigureColumn("col2", func(cfg *EncodeColumnConfig) {
143+
cfg.PostprocessorFuncs = []ProcessorFunc{ProcessorNumberGroupComma}
144+
})
151145
}).Encode(v)
152146
assert.Nil(t, err)
153147
assert.Equal(t, gofn.MultilineString(
@@ -173,11 +167,9 @@ func Test_Encode_withSpecialChars(t *testing.T) {
173167
}
174168
buf := bytes.NewBuffer([]byte{})
175169
err := NewEncoder(csv.NewWriter(buf), func(cfg *EncodeConfig) {
176-
cfg.ColumnConfigMap = EncodeColumnConfigMap{
177-
"col2": {
178-
PostprocessorFuncs: []ProcessorFunc{ProcessorTrim, ProcessorUpper},
179-
},
180-
}
170+
cfg.ConfigureColumn("col2", func(cfg *EncodeColumnConfig) {
171+
cfg.PostprocessorFuncs = []ProcessorFunc{ProcessorTrim, ProcessorUpper}
172+
})
181173
}).Encode(v)
182174
assert.Nil(t, err)
183175
assert.Equal(t, gofn.MultilineString(
@@ -437,14 +429,12 @@ func Test_Encode_withFixedInlineColumn(t *testing.T) {
437429
}
438430
buf := bytes.NewBuffer([]byte{})
439431
err := NewEncoder(csv.NewWriter(buf), func(cfg *EncodeConfig) {
440-
cfg.ColumnConfigMap = EncodeColumnConfigMap{
441-
"sub_sub1": {
442-
PostprocessorFuncs: []ProcessorFunc{ProcessorNumberGroupComma},
443-
},
444-
"sub1": {
445-
PostprocessorFuncs: []ProcessorFunc{ProcessorUpper},
446-
},
447-
}
432+
cfg.ConfigureColumn("sub_sub1", func(cfg *EncodeColumnConfig) {
433+
cfg.PostprocessorFuncs = []ProcessorFunc{ProcessorNumberGroupComma}
434+
})
435+
cfg.ConfigureColumn("sub1", func(cfg *EncodeColumnConfig) {
436+
cfg.PostprocessorFuncs = []ProcessorFunc{ProcessorUpper}
437+
})
448438
}).Encode(v)
449439
assert.Nil(t, err)
450440
assert.Equal(t, gofn.MultilineString(
@@ -540,11 +530,9 @@ func Test_Encode_withDynamicInlineColumn(t *testing.T) {
540530
err := NewEncoder(csv.NewWriter(buf), func(cfg *EncodeConfig) {
541531
cfg.LocalizeHeader = true
542532
cfg.LocalizationFunc = localizeViVn
543-
cfg.ColumnConfigMap = EncodeColumnConfigMap{
544-
"sub_col1": {
545-
PostprocessorFuncs: []ProcessorFunc{ProcessorNumberGroupComma},
546-
},
547-
}
533+
cfg.ConfigureColumn("sub_col1", func(cfg *EncodeColumnConfig) {
534+
cfg.PostprocessorFuncs = []ProcessorFunc{ProcessorNumberGroupComma}
535+
})
548536
}).Encode(v)
549537
assert.Nil(t, err)
550538
assert.Equal(t, gofn.MultilineString(

0 commit comments

Comments
 (0)