新增: u-tpl SQL 模板引擎完整实现
- Lexer/Parser/Executor 三阶段架构
- #{param} 参数化 + ${raw} 原样替换 + 白名单安全策略
- @if/@for/@tpl/@include/@namespace 控制流
- 表达式引擎: 比较、逻辑、nil 检查、len() 内置函数
- 支持 ?/$1/:1 多数据库占位符风格
- 零依赖,纯 Go 标准库实现
This commit is contained in:
30
internal/builtin.go
Normal file
30
internal/builtin.go
Normal file
@@ -0,0 +1,30 @@
|
||||
package internal
|
||||
|
||||
import "reflect"
|
||||
|
||||
type BuiltinFunc func(args []any) (any, bool)
|
||||
|
||||
var builtins = map[string]BuiltinFunc{
|
||||
"len": builtinLen,
|
||||
}
|
||||
|
||||
func builtinLen(args []any) (any, bool) {
|
||||
if len(args) != 1 {
|
||||
return nil, false
|
||||
}
|
||||
if args[0] == nil {
|
||||
return 0, true
|
||||
}
|
||||
v := reflect.ValueOf(args[0])
|
||||
switch v.Kind() {
|
||||
case reflect.Slice, reflect.Array, reflect.String, reflect.Map, reflect.Chan:
|
||||
return v.Len(), true
|
||||
default:
|
||||
return 0, false
|
||||
}
|
||||
}
|
||||
|
||||
func LookupBuiltin(name string) (BuiltinFunc, bool) {
|
||||
fn, ok := builtins[name]
|
||||
return fn, ok
|
||||
}
|
||||
Reference in New Issue
Block a user