github.com/RevenueMonster/sqlike@v1.0.6/sql/stmt/builder.go (about) 1 package sqlstmt 2 3 import ( 4 "fmt" 5 "sync" 6 7 "reflect" 8 9 "github.com/RevenueMonster/sqlike/reflext" 10 ) 11 12 // BuildStatementFunc : 13 type BuildStatementFunc func(stmt Stmt, it interface{}) error 14 15 // StatementBuilder : 16 type StatementBuilder struct { 17 mutex *sync.Mutex 18 builders map[interface{}]BuildStatementFunc 19 } 20 21 // NewStatementBuilder : 22 func NewStatementBuilder() *StatementBuilder { 23 return &StatementBuilder{ 24 mutex: new(sync.Mutex), 25 builders: make(map[interface{}]BuildStatementFunc), 26 } 27 } 28 29 // SetBuilder : 30 func (sb *StatementBuilder) SetBuilder(it interface{}, p BuildStatementFunc) { 31 sb.mutex.Lock() 32 defer sb.mutex.Unlock() 33 sb.builders[it] = p 34 } 35 36 // LookupBuilder : 37 func (sb *StatementBuilder) LookupBuilder(t reflect.Type) (blr BuildStatementFunc, ok bool) { 38 blr, ok = sb.builders[t] 39 return 40 } 41 42 // BuildStatement : 43 func (sb *StatementBuilder) BuildStatement(stmt Stmt, it interface{}) error { 44 v := reflext.ValueOf(it) 45 if x, ok := sb.builders[v.Type()]; ok { 46 return x(stmt, it) 47 } 48 if x, ok := sb.builders[v.Kind()]; ok { 49 return x(stmt, it) 50 } 51 52 return fmt.Errorf("sqlstmt: invalid data type support %v", v.Type()) 53 }