/
match_fields_enums.go
55 lines (44 loc) · 1.92 KB
/
match_fields_enums.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
package generator
import "go/types"
type enumMatchState int
const (
// enumMatchStateNotEnums оба типа не являются енумиями
enumMatchStateNotEnums enumMatchState = iota
// enumMatchStateOneIsNotEnum один из типов является енумием, а другой нет, такие типы не могут быть эквивалентными
enumMatchStateOneIsNotEnum
// enumMatchStateDifferentEnums оба являются перечислениями, но их значения не совпадают, такие типы не могут быть
// эквивалентными.
enumMatchStateDifferentEnums
// enumMatchStateMatched совпадающие енумии
enumMatchStateMatched
)
func (g *Generator) matchEnums(prim, sec types.Type) (*enumDescription, *enumDescription, enumMatchState) {
p := g.getEnumInfo(prim)
firstIsEnum := p != nil
s := g.getEnumInfo(sec)
secondIsEnum := s != nil
if (firstIsEnum || secondIsEnum) && !(firstIsEnum && secondIsEnum) {
// случай, когда одно является енумием а другое нет автоматически означает
// что конвертации никакой не возможно
return nil, nil, enumMatchStateOneIsNotEnum
}
if !firstIsEnum && !secondIsEnum {
// оба не являются енумиями и это означает что проверять можно дальше
return nil, nil, enumMatchStateNotEnums
}
if len(p.values) != len(s.values) {
return nil, nil, enumMatchStateDifferentEnums
}
outer:
// каждое значение из p.values должно быть в s.values
for _, pv := range p.values {
for _, qv := range s.values {
if pv.Val().String() == qv.Val().String() {
continue outer
}
}
// не нашли значения pv, выходим
return nil, nil, enumMatchStateDifferentEnums
}
return p, s, enumMatchStateMatched
}