/
typeutil.go
107 lines (94 loc) · 2.92 KB
/
typeutil.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
package syslutil
import (
sysl "github.com/anz-bank/sysl/pkg/sysl"
)
// GetTypeDetail returns name of the type and details in string format
func GetTypeDetail(t *sysl.Type) (typeName string, typeDetail string) {
switch x := t.Type.(type) {
case *sysl.Type_Primitive_:
typeName = "primitive"
typeDetail = sysl.Type_Primitive_name[int32(x.Primitive)]
case *sysl.Type_TypeRef:
typeName = "type_ref"
if x.TypeRef.Ref != nil {
if len(x.TypeRef.Ref.Path) == 1 {
typeDetail = x.TypeRef.Ref.Path[0]
if x.TypeRef.Ref.Appname != nil {
typeDetail = x.TypeRef.Ref.Appname.Part[0] + "." + typeDetail
}
} else if x.TypeRef.Ref.Appname != nil && len(x.TypeRef.Ref.Appname.Part) > 0 {
typeDetail = x.TypeRef.Ref.Appname.Part[0]
}
}
case *sysl.Type_Sequence:
typeName = "sequence"
_, d := GetTypeDetail(x.Sequence)
typeDetail = d
case *sysl.Type_Set:
typeName = "set"
_, d := GetTypeDetail(x.Set)
typeDetail = d
case *sysl.Type_List_:
typeName = "list"
_, d := GetTypeDetail(x.List.Type)
typeDetail = d
case *sysl.Type_Tuple_:
typeName = "tuple"
case *sysl.Type_Relation_:
typeName = "relation"
case *sysl.Type_OneOf_:
typeName = "union"
}
return typeName, typeDetail
}
// TypeNone returns none-type
func TypeNone() *sysl.Type {
return &sysl.Type{Type: &sysl.Type_NoType_{NoType: &sysl.Type_NoType{}}}
}
// TypeEmpty returns empty primitive type
func TypeEmpty() *sysl.Type {
return &sysl.Type{Type: &sysl.Type_Primitive_{Primitive: sysl.Type_EMPTY}}
}
// TypeString returns string type
func TypeString() *sysl.Type {
return &sysl.Type{Type: &sysl.Type_Primitive_{Primitive: sysl.Type_STRING}}
}
// TypeInt returns integer type
func TypeInt() *sysl.Type {
return &sysl.Type{Type: &sysl.Type_Primitive_{Primitive: sysl.Type_INT}}
}
// TypeFloat returns float type
func TypeFloat() *sysl.Type {
return &sysl.Type{Type: &sysl.Type_Primitive_{Primitive: sysl.Type_FLOAT}}
}
// TypeDecimal returns decimal type
func TypeDecimal() *sysl.Type {
return &sysl.Type{Type: &sysl.Type_Primitive_{Primitive: sysl.Type_DECIMAL}}
}
// TypeBool returns boolean type
func TypeBool() *sysl.Type {
return &sysl.Type{Type: &sysl.Type_Primitive_{Primitive: sysl.Type_BOOL}}
}
// HasSameType returns true if type 2 matches with type 1
func HasSameType(type1 *sysl.Type, type2 *sysl.Type) bool {
if type1 == nil || type2 == nil {
return false
}
switch type1.GetType().(type) {
case *sysl.Type_Primitive_:
return type1.GetPrimitive() == type2.GetPrimitive()
case *sysl.Type_TypeRef:
if type2.GetTypeRef() != nil {
ref1 := type1.GetTypeRef().GetRef()
ref2 := type2.GetTypeRef().GetRef()
if ref1.GetAppname() != nil && ref2.GetAppname() != nil {
return ref1.GetAppname().GetPart()[0] == ref2.GetAppname().GetPart()[0]
} else if ref1.GetPath() != nil && ref2.GetPath() != nil {
return ref1.GetPath()[0] == ref2.GetPath()[0]
}
}
case *sysl.Type_Tuple_:
return type2.GetTuple() != nil
}
return false
}