Skip to content

Commit 4fea658

Browse files
authored
Add New and BuildFn (#29)
1 parent c0f250f commit 4fea658

File tree

3 files changed

+74
-20
lines changed

3 files changed

+74
-20
lines changed

README.md

+7-7
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ This tiny library helps to build queries and handles parameter indexing.
1717
## Features
1818

1919
* Simple and easy.
20-
* Safe & fast.
20+
* Safe and fast.
2121
* Tested.
2222
* Dependency-free.
2323

24-
See [these docs][pkg-url] or [GUIDE.md](GUIDE.md) for more details.
24+
See [docs][pkg-url] or [GUIDE.md](GUIDE.md) for more details.
2525

2626
## Install
2727

@@ -36,12 +36,12 @@ go get github.com/cristalhq/builq
3636
```go
3737
cols := builq.Columns{"foo, bar"}
3838

39-
var b builq.Builder
40-
b.Addf("SELECT %s FROM %s", cols, "users").
41-
Addf("WHERE active IS TRUE").
42-
Addf("AND user_id = %$ OR user = %$", 42, "root")
39+
q := builq.New()
40+
q("SELECT %s FROM %s", cols, "users")
41+
q("WHERE active IS TRUE")
42+
q("AND user_id = %$ OR user = %$", 42, "root")
4343

44-
query, args, err := b.Build()
44+
query, args, err := q.Build()
4545
if err != nil {
4646
panic(err)
4747
}

builq.go

+40-13
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,31 @@ type OnelineBuilder struct {
3838
Builder
3939
}
4040

41+
// BuildFn represents [Builder.Addf]. Just for the easier BuilderFunc declaration.
42+
type BuildFn func(format constString, args ...any) *Builder
43+
44+
// Build the query and arguments.
45+
func (q BuildFn) Build() (query string, args []any, err error) {
46+
return q("").Build()
47+
}
48+
49+
// DebugBuild the query, good for debugging but not for REAL usage.
50+
func (q BuildFn) DebugBuild() string {
51+
return q("").DebugBuild()
52+
}
53+
54+
// New returns a new query builder, same as [Builder].
55+
func New() BuildFn {
56+
var b Builder
57+
return b.Addf
58+
}
59+
60+
// New returns a new query builder, same as [OnelineBuilder].
61+
func NewOneline() BuildFn {
62+
var b OnelineBuilder
63+
return b.Addf
64+
}
65+
4166
// Addf formats according to a format specifier, writes to query and appends args.
4267
// Format param must be a constant string.
4368
func (b *OnelineBuilder) Addf(format constString, args ...any) *Builder {
@@ -56,30 +81,32 @@ func (b *Builder) Addf(format constString, args ...any) *Builder {
5681
return b.addf(format, args...)
5782
}
5883

59-
func (b *Builder) addf(format constString, args ...any) *Builder {
60-
if len(b.parts) == 0 {
61-
// TODO: better defaults
62-
b.parts = make([]string, 0, 10)
63-
b.args = make([][]any, 0, 10)
64-
}
65-
b.parts = append(b.parts, string(format))
66-
b.args = append(b.args, args)
67-
return b
68-
}
69-
84+
// Build the query and arguments.
7085
func (b *Builder) Build() (query string, args []any, err error) {
7186
query, args = b.build()
7287
return query, args, b.err
7388
}
7489

90+
// DebugBuild the query, good for debugging but not for REAL usage.
7591
func (b *Builder) DebugBuild() (query string) {
7692
b.debug = true
7793
query, _ = b.build()
7894
b.debug = false
7995
return query
8096
}
8197

82-
func (b *Builder) build() (string, []any) {
98+
func (b *Builder) addf(format constString, args ...any) *Builder {
99+
if len(b.parts) == 0 {
100+
// TODO: better defaults
101+
b.parts = make([]string, 0, 10)
102+
b.args = make([][]any, 0, 10)
103+
}
104+
b.parts = append(b.parts, string(format))
105+
b.args = append(b.args, args)
106+
return b
107+
}
108+
109+
func (b *Builder) build() (_ string, _ []any) {
83110
var query strings.Builder
84111
// TODO: better default (sum of parts + est len of indexes)
85112
query.Grow(100)
@@ -121,7 +148,7 @@ var (
121148
// errUnsupportedVerb when %X is found and X isn't supported.
122149
errUnsupportedVerb = errors.New("unsupported verb")
123150

124-
// errIncorrectVerb is passed like `%+`.`
151+
// errIncorrectVerb is passed like `%+`.
125152
errIncorrectVerb = errors.New("incorrect verb")
126153

127154
// errMixedPlaceholders when $ AND ? are mixed in 1 query.

example_test.go

+27
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,33 @@ import (
88
"github.com/cristalhq/builq"
99
)
1010

11+
func ExampleNew() {
12+
cols := builq.Columns{"foo, bar"}
13+
14+
q := builq.New()
15+
q("SELECT %s FROM %s", cols, "users")
16+
q("WHERE active IS TRUE")
17+
q("AND user_id = %$ OR user = %$", 42, "root")
18+
19+
query, args, err := q.Build()
20+
if err != nil {
21+
panic(err)
22+
}
23+
24+
fmt.Printf("query:\n%v", query)
25+
fmt.Printf("args:\n%v", args)
26+
27+
// Output:
28+
//
29+
// query:
30+
// SELECT foo, bar FROM users
31+
// WHERE active IS TRUE
32+
// AND user_id = $1 OR user = $2
33+
//
34+
// args:
35+
// [42 root]
36+
}
37+
1138
func ExampleBuilder() {
1239
cols := builq.Columns{"foo", "bar"}
1340

0 commit comments

Comments
 (0)