package helpers import ( "database/sql" "encoding/json" "xorm.io/builder" ) type StructBuilder struct { BD *builder.Builder db *sql.DB } func NewBuilder(db *sql.DB) *StructBuilder { bd := builder.Dialect(builder.POSTGRES) return &StructBuilder{db: db, BD: bd} } func (h *StructBuilder) FindOne(dest ...any) error { query, err := h.BD.ToBoundSQL() if err != nil { return err } row := h.db.QueryRow(query) if err := row.Scan(dest...); err != nil { return err } return nil } func (h *StructBuilder) FindAll(src any, dest ...any) error { var ( res []map[string]interface{} = []map[string]interface{}{} destParse []any = []any{} ) query, err := h.BD.ToBoundSQL() if err != nil { return err } rows, err := h.db.Query(query) if err != nil { return err } cols, err := rows.Columns() if err != nil { return err } for rows.Next() { data := make(map[string]interface{}) if err := rows.Scan(dest...); err != nil { return err } destByte, err := json.Marshal(dest) if err != nil { return err } if err := json.Unmarshal(destByte, &destParse); err != nil { return err } for i, v := range cols { data[v] = destParse[i] } res = append(res, data) } resByte, err := json.Marshal(&res) if err != nil { return err } if err := json.Unmarshal(resByte, src); err != nil { return err } return nil } func (h *StructBuilder) Exec() error { query, args, err := h.BD.ToSQL() if err != nil { return err } if _, err := h.db.Exec(query, args...); err != nil { return err } return nil }