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}