github.com/mavryk-network/mvgo@v1.19.9/micheline/annots.go (about) 1 // Copyright (c) 2020-2021 Blockwatch Data Inc. 2 // Author: alex@blockwatch.cc 3 4 package micheline 5 6 import ( 7 "strings" 8 ) 9 10 const ( 11 TypeAnnoPrefix = ":" 12 VarAnnoPrefix = "%" 13 FieldAnnoPrefix = "@" 14 ) 15 16 func (p *Prim) StripAnno(name string) { 17 for i := 0; i < len(p.Anno); i++ { 18 if p.Anno[i][1:] == name { 19 p.Anno = append(p.Anno[:i], p.Anno[i+1:]...) 20 i-- 21 } 22 } 23 } 24 25 func (p Prim) HasAnno() bool { 26 if len(p.Anno) == 0 { 27 return false 28 } 29 for _, v := range p.Anno { 30 if len(v) > 0 { 31 return true 32 } 33 } 34 return false 35 } 36 37 func (p Prim) MatchesAnno(anno string) bool { 38 if len(p.Anno) == 0 { 39 return false 40 } 41 if len(anno) > 0 { 42 switch string(anno[0]) { 43 case TypeAnnoPrefix, VarAnnoPrefix, FieldAnnoPrefix: 44 anno = anno[1:] 45 } 46 } 47 for _, v := range p.Anno { 48 if v[1:] == anno { 49 return true 50 } 51 } 52 return false 53 } 54 55 func (p Prim) HasTypeAnno() bool { 56 for _, v := range p.Anno { 57 if strings.HasPrefix(v, TypeAnnoPrefix) { 58 return true 59 } 60 } 61 return false 62 } 63 64 func (p Prim) GetTypeAnno() string { 65 for _, v := range p.Anno { 66 if strings.HasPrefix(v, TypeAnnoPrefix) { 67 return v[1:] 68 } 69 } 70 return "" 71 } 72 73 // prefers TypeAnno, first anno otherwise 74 func (p Prim) GetTypeAnnoAny() string { 75 if len(p.Anno) > 0 { 76 if p.HasTypeAnno() { 77 return p.GetTypeAnno() 78 } 79 if len(p.Anno[0]) > 1 { 80 return p.Anno[0][1:] 81 } 82 } 83 return "" 84 } 85 86 func (p Prim) HasVarAnno() bool { 87 for _, v := range p.Anno { 88 if strings.HasPrefix(v, VarAnnoPrefix) { 89 return true 90 } 91 } 92 return false 93 } 94 95 func (p Prim) GetVarAnno() string { 96 for _, v := range p.Anno { 97 if strings.HasPrefix(v, VarAnnoPrefix) { 98 return v[1:] 99 } 100 } 101 return "" 102 } 103 104 // prefers VarAnno, first anno otherwise 105 func (p Prim) GetVarAnnoAny() string { 106 if len(p.Anno) > 0 { 107 if p.HasVarAnno() { 108 return p.GetVarAnno() 109 } 110 if len(p.Anno[0]) > 1 { 111 return p.Anno[0][1:] 112 } 113 } 114 return "" 115 } 116 117 func (p Prim) HasFieldAnno() bool { 118 for _, v := range p.Anno { 119 if strings.HasPrefix(v, FieldAnnoPrefix) { 120 return true 121 } 122 } 123 return false 124 } 125 126 func (p Prim) GetFieldAnno() string { 127 for _, v := range p.Anno { 128 if strings.HasPrefix(v, FieldAnnoPrefix) { 129 return v[1:] 130 } 131 } 132 return "" 133 } 134 135 // prefers FieldAnno, first anno otherwise 136 func (p Prim) GetFieldAnnoAny() string { 137 if len(p.Anno) > 0 { 138 if p.HasFieldAnno() { 139 return p.GetFieldAnno() 140 } 141 if len(p.Anno[0]) > 1 { 142 return p.Anno[0][1:] 143 } 144 } 145 return "" 146 } 147 148 func (p Prim) HasVarOrFieldAnno() bool { 149 for _, v := range p.Anno { 150 if strings.HasPrefix(v, FieldAnnoPrefix) || strings.HasPrefix(v, VarAnnoPrefix) { 151 return true 152 } 153 } 154 return false 155 } 156 157 func (p Prim) GetVarOrFieldAnno() string { 158 for _, v := range p.Anno { 159 if strings.HasPrefix(v, FieldAnnoPrefix) || strings.HasPrefix(v, VarAnnoPrefix) { 160 return v[1:] 161 } 162 } 163 return "" 164 }