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  }