-
Notifications
You must be signed in to change notification settings - Fork 0
/
abbr.go
128 lines (97 loc) · 2.1 KB
/
abbr.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package kennung
import (
"github.com/friedenberg/zit/src/alfa/errors"
"github.com/friedenberg/zit/src/charlie/sha"
)
type Abbr struct {
Sha struct {
Expand func(string) (string, error)
Abbreviate func(sha.Sha) (string, error)
}
Etikett abbrOne[Etikett, *Etikett]
Typ abbrOne[Typ, *Typ]
Hinweis abbrOne[Hinweis, *Hinweis]
Kasten abbrOne[Kasten, *Kasten]
}
type abbrOne[V KennungLike[V], VPtr KennungLikePtr[V]] struct {
Expand func(string) (string, error)
Abbreviate func(V) (string, error)
}
func (ao abbrOne[V, VPtr]) AbbreviateKennung(
k Kennung,
) (v string, err error) {
if ao.Abbreviate == nil {
v = k.String()
return
}
var ka1 V
switch ka := k.(type) {
case VPtr:
ka1 = *ka
case V:
ka1 = ka
default:
err = errors.Errorf("expected kennung type %T but got %T", ka, k)
return
}
if v, err = ao.Abbreviate(ka1); err != nil {
err = errors.Wrap(err)
return
}
return
}
func (a Abbr) AbbreviateHinweisOnly(
in Kennung2,
) (out Kennung2, err error) {
var getAbbr func(Kennung) (string, error)
var h Hinweis
if err = h.Set(in.String()); err != nil {
err = nil
out = in
return
}
getAbbr = a.Hinweis.AbbreviateKennung
var abbr string
if abbr, err = getAbbr(h); err != nil {
err = errors.Wrap(err)
return
}
if err = out.SetWithGattung(abbr, h); err != nil {
err = errors.Wrap(err)
return
}
return
}
func (a Abbr) AbbreviateKennung(
in Kennung,
) (out Kennung, err error) {
var getAbbr func(Kennung) (string, error)
switch in.(type) {
case Hinweis, *Hinweis:
getAbbr = a.Hinweis.AbbreviateKennung
case Etikett, *Etikett:
getAbbr = a.Etikett.AbbreviateKennung
case Typ, *Typ:
getAbbr = a.Typ.AbbreviateKennung
case Kasten, *Kasten:
getAbbr = a.Kasten.AbbreviateKennung
case Konfig, *Konfig:
out = in
return
default:
err = errors.Errorf("unsupported Kennung: %q, %T", in, in)
return
}
var abbr string
if abbr, err = getAbbr(in); err != nil {
err = errors.Wrap(err)
return
}
outPtr := &Kennung2{}
if err = outPtr.SetWithGattung(abbr, in); err != nil {
err = errors.Wrap(err)
return
}
out = outPtr
return
}