Skip to content

Commit

Permalink
Apply go 18
Browse files Browse the repository at this point in the history
  • Loading branch information
minhduc140583 committed Aug 11, 2024
1 parent 44b97aa commit 0be635c
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 35 deletions.
3 changes: 3 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module github.com/core-go/io

go 1.18
Empty file added go.sum
Empty file.
15 changes: 9 additions & 6 deletions reader/csv_transformer.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
16 changes: 9 additions & 7 deletions reader/delimiter_transformer.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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) {
Expand Down
16 changes: 9 additions & 7 deletions reader/fixedlength_transformer.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
20 changes: 12 additions & 8 deletions writer/delimiter_transformer.go
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand All @@ -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)
}

Expand Down
18 changes: 11 additions & 7 deletions writer/fixedlength_transformer.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down

0 comments on commit 0be635c

Please sign in to comment.