main
1package mapper
2
3import (
4 "fmt"
5 "reflect"
6)
7
8type Mapping[TInput any, TOutput any] func(TInput) TOutput
9
10var mappings map[string]interface{}
11
12func init() {
13 mappings = map[string]interface{}{}
14}
15
16func Register[Input any, Output any](mapping Mapping[Input, Output]) {
17 mappings[keyFor[Input, Output]()] = mapping
18}
19
20func MapFrom[Input any, Output any](input Input) Output {
21 if mapping, ok := mappings[keyFor[Input, Output]()]; ok {
22 return mapping.(Mapping[Input, Output])(input)
23 }
24 var output Output
25 return output
26}
27
28func MapEachFrom[Input any, Output any](input []Input) []Output {
29 var zero Output
30 zeroValue := reflect.Zero(reflect.TypeOf(zero))
31
32 results := []Output{}
33 for _, item := range input {
34 tmp := MapFrom[Input, Output](item)
35 if zeroValue != reflect.ValueOf(tmp) {
36 results = append(results, tmp)
37 }
38 }
39 return results
40}
41
42func keyFor[Input any, Output any]() string {
43 var input Input
44 var output Output
45 return fmt.Sprintf("%v-%v", reflect.TypeOf(input), reflect.TypeOf(output))
46}