github.com/profzone/eden-framework@v1.0.10/pkg/codegen/snippet_expr.go (about) 1 package codegen 2 3 import ( 4 "bytes" 5 "go/token" 6 "regexp" 7 ) 8 9 type SnippetExpr string 10 11 func (tpe SnippetExpr) Bytes() []byte { 12 return []byte(string(tpe)) 13 } 14 15 var Expr = createExpr(LowerSnakeCase) 16 17 func createExpr(aliaser ImportPathAliaser) func(f string, args ...interface{}) SnippetExpr { 18 val := createVal(aliaser) 19 20 return func(f string, args ...interface{}) SnippetExpr { 21 idx := 0 22 return SnippetExpr(reExprHolder.ReplaceAllStringFunc(f, func(i string) string { 23 arg := args[idx] 24 idx++ 25 if s, ok := arg.(Snippet); ok { 26 return Stringify(s) 27 } 28 return Stringify(val(arg)) 29 })) 30 } 31 } 32 33 var reExprHolder = regexp.MustCompile(`(\$\d+)|\?`) 34 35 func KeyValue(key Snippet, value Snippet) *SnippetKeyValueExpr { 36 return &SnippetKeyValueExpr{ 37 Key: key, 38 Value: value, 39 } 40 } 41 42 type SnippetKeyValueExpr struct { 43 Snippet 44 Key Snippet 45 Value Snippet 46 } 47 48 func (tpe *SnippetKeyValueExpr) Bytes() []byte { 49 buf := &bytes.Buffer{} 50 51 buf.Write(tpe.Key.Bytes()) 52 buf.WriteString(token.COLON.String()) 53 buf.WriteRune(' ') 54 buf.Write(tpe.Value.Bytes()) 55 56 return buf.Bytes() 57 } 58 59 func Sel(x Snippet, selectors ...Snippet) *SnippetSelectorExpr { 60 return &SnippetSelectorExpr{ 61 X: x, 62 Selectors: selectors, 63 } 64 } 65 66 type SnippetSelectorExpr struct { 67 X Snippet 68 Selectors []Snippet 69 } 70 71 func (expr *SnippetSelectorExpr) Bytes() []byte { 72 buf := &bytes.Buffer{} 73 74 buf.Write(expr.X.Bytes()) 75 76 for _, selectorExpr := range expr.Selectors { 77 buf.WriteRune('.') 78 buf.Write(selectorExpr.Bytes()) 79 } 80 81 return buf.Bytes() 82 } 83 84 type SnippetCanAddr interface { 85 Snippet 86 snippetCanAddr() 87 } 88 89 func Star(tpe SnippetType) *SnippetStarExpr { 90 return &SnippetStarExpr{ 91 X: tpe, 92 } 93 } 94 95 type SnippetStarExpr struct { 96 SnippetCanAddr 97 SnippetType 98 X SnippetType 99 } 100 101 func (expr *SnippetStarExpr) Bytes() []byte { 102 buf := &bytes.Buffer{} 103 104 buf.WriteString(token.MUL.String()) 105 buf.Write(expr.X.Bytes()) 106 107 return buf.Bytes() 108 } 109 110 func Unary(addr SnippetCanAddr) *SnippetUnaryExpr { 111 return &SnippetUnaryExpr{ 112 Elem: addr, 113 } 114 } 115 116 type SnippetUnaryExpr struct { 117 Elem SnippetCanAddr 118 } 119 120 func (tpe *SnippetUnaryExpr) Bytes() []byte { 121 buf := &bytes.Buffer{} 122 123 buf.WriteString(token.AND.String()) 124 buf.Write(tpe.Elem.Bytes()) 125 126 return buf.Bytes() 127 } 128 129 func Paren(s Snippet) *SnippetParenExpr { 130 return &SnippetParenExpr{ 131 Elem: s, 132 } 133 } 134 135 type SnippetParenExpr struct { 136 SnippetCanAddr 137 Elem Snippet 138 } 139 140 func (tpe *SnippetParenExpr) Bytes() []byte { 141 buf := &bytes.Buffer{} 142 143 buf.WriteRune('(') 144 buf.Write(tpe.Elem.Bytes()) 145 buf.WriteRune(')') 146 147 return buf.Bytes() 148 } 149 150 func Convert(tpe SnippetType, target Snippet) *SnippetCallExpr { 151 return CallWith(tpe, target) 152 } 153 154 func CallWith(s Snippet, params ...Snippet) *SnippetCallExpr { 155 return &SnippetCallExpr{ 156 X: s, 157 Params: params, 158 } 159 } 160 161 func Call(name string, params ...Snippet) *SnippetCallExpr { 162 if isBuiltInFunc(name) { 163 return &SnippetCallExpr{ 164 X: SnippetIdent(name), 165 Params: params, 166 } 167 } 168 return &SnippetCallExpr{ 169 X: Id(name), 170 Params: params, 171 } 172 } 173 174 type SnippetCallExpr struct { 175 X Snippet 176 Params []Snippet 177 Ellipsis bool 178 Modifier token.Token 179 } 180 181 func (expr SnippetCallExpr) AsDefer() *SnippetCallExpr { 182 expr.Modifier = token.DEFER 183 return &expr 184 } 185 186 func (expr SnippetCallExpr) AsGo() *SnippetCallExpr { 187 expr.Modifier = token.GO 188 return &expr 189 } 190 191 func (expr SnippetCallExpr) WithEllipsis() *SnippetCallExpr { 192 expr.Ellipsis = true 193 return &expr 194 } 195 196 func (expr *SnippetCallExpr) Bytes() []byte { 197 buf := &bytes.Buffer{} 198 199 if expr.Modifier > 0 { 200 buf.WriteString(expr.Modifier.String()) 201 buf.WriteRune(' ') 202 } 203 204 buf.Write(expr.X.Bytes()) 205 206 buf.WriteRune('(') 207 208 for i, p := range expr.Params { 209 if i > 0 { 210 buf.WriteString(", ") 211 } 212 buf.Write(p.Bytes()) 213 } 214 215 if expr.Ellipsis { 216 buf.WriteString(token.ELLIPSIS.String()) 217 } 218 219 buf.WriteRune(')') 220 221 return buf.Bytes() 222 } 223 224 func TypeAssert(tpe SnippetType, x Snippet) *SnippetTypeAssertExpr { 225 return &SnippetTypeAssertExpr{ 226 X: x, 227 Type: tpe, 228 } 229 } 230 231 type SnippetTypeAssertExpr struct { 232 X Snippet 233 Type SnippetType 234 } 235 236 func (expr *SnippetTypeAssertExpr) Bytes() []byte { 237 buf := &bytes.Buffer{} 238 239 buf.Write(expr.X.Bytes()) 240 241 buf.WriteRune('.') 242 buf.WriteRune('(') 243 buf.Write(expr.Type.Bytes()) 244 buf.WriteRune(')') 245 246 return buf.Bytes() 247 }