From 0be635cf13c1b14aeddce3d657f1d74e1a8683a7 Mon Sep 17 00:00:00 2001 From: Duc Nguyen Date: Sun, 11 Aug 2024 22:52:45 +0700 Subject: [PATCH] Apply go 18 --- go.mod | 3 +++ go.sum | 0 reader/csv_transformer.go | 15 +++++++++------ reader/delimiter_transformer.go | 16 +++++++++------- reader/fixedlength_transformer.go | 16 +++++++++------- writer/delimiter_transformer.go | 20 ++++++++++++-------- writer/fixedlength_transformer.go | 18 +++++++++++------- 7 files changed, 53 insertions(+), 35 deletions(-) create mode 100644 go.mod create mode 100644 go.sum diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..708df47 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/core-go/io + +go 1.18 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..e69de29 diff --git a/reader/csv_transformer.go b/reader/csv_transformer.go index 673d270..7392492 100644 --- a/reader/csv_transformer.go +++ b/reader/csv_transformer.go @@ -5,19 +5,22 @@ import ( "reflect" ) -func NewCSVTransformer(modelType reflect.Type) (*CSVTransformer, error) { +func NewCSVTransformer[T any]() (*CSVTransformer[T], error) { + var t T + modelType := reflect.TypeOf(t) formatCols, err := GetIndexesByTag(modelType, "format") if err != nil { return nil, err } - return &CSVTransformer{modelType: modelType, formatCols: formatCols}, nil + return &CSVTransformer[T]{formatCols: formatCols}, nil } -type CSVTransformer struct { - modelType reflect.Type +type CSVTransformer[T any] struct { formatCols map[int]Delimiter } -func (f CSVTransformer) Transform(ctx context.Context, record []string, res interface{}) error { - return ScanLine(record, res, f.formatCols) +func (f CSVTransformer[T]) Transform(ctx context.Context, record []string) (T, error) { + var res T + err := ScanLine(record, &res, f.formatCols) + return res, err } diff --git a/reader/delimiter_transformer.go b/reader/delimiter_transformer.go index 737be94..e421247 100644 --- a/reader/delimiter_transformer.go +++ b/reader/delimiter_transformer.go @@ -15,7 +15,9 @@ type Delimiter struct { Handle func(f reflect.Value, line string, format string, scale int) error } -func NewDelimiterTransformer(modelType reflect.Type, options ...string) (*DelimiterTransformer, error) { +func NewDelimiterTransformer[T any](options ...string) (*DelimiterTransformer[T], error) { + var t T + modelType := reflect.TypeOf(t) formatCols, err := GetIndexesByTag(modelType, "format") if err != nil { return nil, err @@ -26,19 +28,19 @@ func NewDelimiterTransformer(modelType reflect.Type, options ...string) (*Delimi } else { separator = "|" } - return &DelimiterTransformer{modelType: modelType, formatCols: formatCols, separator: separator}, nil + return &DelimiterTransformer[T]{formatCols: formatCols, separator: separator}, nil } -type DelimiterTransformer struct { - modelType reflect.Type +type DelimiterTransformer[T any] struct { formatCols map[int]Delimiter separator string } -func (f DelimiterTransformer) Transform(ctx context.Context, lineStr string, res interface{}) error { +func (f DelimiterTransformer[T]) Transform(ctx context.Context, lineStr string) (T, error) { lines := strings.Split(lineStr, f.separator) - err := ScanLine(lines, res, f.formatCols) - return err + var res T + err := ScanLine(lines, &res, f.formatCols) + return res, err } func GetIndexesByTag(modelType reflect.Type, tagName string) (map[int]Delimiter, error) { diff --git a/reader/fixedlength_transformer.go b/reader/fixedlength_transformer.go index 5f03146..908781d 100644 --- a/reader/fixedlength_transformer.go +++ b/reader/fixedlength_transformer.go @@ -18,22 +18,24 @@ type FixedLength struct { Handle func(f reflect.Value, line string, format string, scale int) error } -func NewFixedLengthTransformer(modelType reflect.Type) (*FixedLengthTransformer, error) { +func NewFixedLengthTransformer[T any]() (*FixedLengthTransformer[T], error) { + var t T + modelType := reflect.TypeOf(t) formatCols, err := GetIndexes(modelType, "format") if err != nil { return nil, err } - return &FixedLengthTransformer{modelType: modelType, formatCols: formatCols}, nil + return &FixedLengthTransformer[T]{formatCols: formatCols}, nil } -type FixedLengthTransformer struct { - modelType reflect.Type +type FixedLengthTransformer[T any] struct { formatCols map[int]*FixedLength } -func (f FixedLengthTransformer) Transform(ctx context.Context, line string, res interface{}) error { - err := ScanLineFixLength(line, res, f.formatCols) - return err +func (f FixedLengthTransformer[T]) Transform(ctx context.Context, line string) (T, error) { + var res T + err := ScanLineFixLength(line, &res, f.formatCols) + return res, err } func GetIndexes(modelType reflect.Type, tagName string) (map[int]*FixedLength, error) { diff --git a/writer/delimiter_transformer.go b/writer/delimiter_transformer.go index b098f0c..59a8023 100644 --- a/writer/delimiter_transformer.go +++ b/writer/delimiter_transformer.go @@ -18,7 +18,12 @@ type Delimiter struct { Scale int } -func NewDelimiterTransformer(modelType reflect.Type, opts ...string) (*DelimiterTransformer, error) { +type DelimiterTransformer[T any] struct { + Delimiter string + formatCols map[int]Delimiter +} + +func NewDelimiterTransformer[T any](opts ...string) (*DelimiterTransformer[T], error) { sep := "|" if len(opts) > 0 && len(opts[0]) > 0 { sep = opts[0] @@ -27,20 +32,19 @@ func NewDelimiterTransformer(modelType reflect.Type, opts ...string) (*Delimiter if len(opts) > 1 && len(opts[1]) > 0 { skipTag = opts[1] } + var t T + modelType := reflect.TypeOf(t) formatCols, err := GetIndexesByTag(modelType, "format", skipTag) if err != nil { return nil, err } - return &DelimiterTransformer{modelType: modelType, formatCols: formatCols, Delimiter: sep}, nil + return &DelimiterTransformer[T]{formatCols: formatCols, Delimiter: sep}, nil } - -type DelimiterTransformer struct { - Delimiter string - modelType reflect.Type - formatCols map[int]Delimiter +func NewDelimiterFormatter[T any](opts ...string) (*DelimiterTransformer[T], error) { + return NewDelimiterTransformer[T](opts...) } -func (f *DelimiterTransformer) Transform(ctx context.Context, model interface{}) string { +func (f *DelimiterTransformer[T]) Transform(ctx context.Context, model *T) string { return ToTextWithDelimiter(model, f.Delimiter, f.formatCols) } diff --git a/writer/fixedlength_transformer.go b/writer/fixedlength_transformer.go index ba050bd..5238f93 100644 --- a/writer/fixedlength_transformer.go +++ b/writer/fixedlength_transformer.go @@ -17,20 +17,24 @@ type FixedLength struct { Length int } -func NewFixedLengthTransformer(modelType reflect.Type) (*FixedLengthTransformer, error) { +type FixedLengthTransformer[T any] struct { + formatCols map[int]*FixedLength +} + +func NewFixedLengthTransformer[T any]() (*FixedLengthTransformer[T], error) { + var t T + modelType := reflect.TypeOf(t) formatCols, err := GetIndexes(modelType, "format") if err != nil { return nil, err } - return &FixedLengthTransformer{modelType: modelType, formatCols: formatCols}, nil + return &FixedLengthTransformer[T]{formatCols: formatCols}, nil } -type FixedLengthTransformer struct { - modelType reflect.Type - formatCols map[int]*FixedLength +func NewFixedLengthFormatter[T any]() (*FixedLengthTransformer[T], error) { + return NewFixedLengthTransformer[T]() } - -func (f *FixedLengthTransformer) Transform(ctx context.Context, model interface{}) string { +func (f *FixedLengthTransformer[T]) Transform(ctx context.Context, model *T) string { return ToFixedLength(model, f.formatCols) }