Skip to content

Commit 169fd8e

Browse files
committed
more wrapper cleanup
1 parent 91856cc commit 169fd8e

7 files changed

Lines changed: 101 additions & 153 deletions

File tree

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,5 @@ sql:
8484

8585
# Go gen
8686
generate:
87+
go run ./gen
8788
go generate ./internal/repository/...

cmd/gen/sqlc-wrapper/store.tmpl

Lines changed: 0 additions & 46 deletions
This file was deleted.

docker-compose.dev.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
services:
22
traefik:
33
image: traefik:v3.6
4-
command: --api.insecure=true --providers.docker
4+
command: --api.insecure=true --providers.docker --entrypoints.web.address=:80 --entrypoints.websecure.address=:443
55
ports:
66
- 80:80
7+
- 443:443
78
volumes:
89
- /var/run/docker.sock:/var/run/docker.sock
910

@@ -25,6 +26,8 @@ services:
2526
labels:
2627
traefik.enable: true
2728
traefik.http.routers.tinyauth.rule: Host(`tinyauth.127.0.0.1.sslip.io`)
29+
traefik.http.routers.tinyauth.entrypoints: websecure
30+
traefik.http.routers.tinyauth.tls: true
2831

2932
tinyauth-backend:
3033
build:
Lines changed: 14 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
var storeSrc string
3333

3434
func main() {
35+
fmt.Println("sqlc-wrapper: generating store.go files for sqlc driver packages...")
3536
if err := run(); err != nil {
3637
log.Fatal(err)
3738
}
@@ -88,13 +89,11 @@ func run() error {
8889
if err != nil {
8990
return err
9091
}
91-
models, _ := collectTypes(driverTypePkg)
9292

9393
src, err := render(tmplData{
94-
PkgName: driverTypePkg.Name(),
95-
RepoPkg: repoPkgPath,
96-
ModelTypes: models,
97-
Methods: renderMethods(methods),
94+
PkgName: driverTypePkg.Name(),
95+
RepoPkg: repoPkgPath,
96+
Methods: renderMethods(methods),
9897
})
9998
if err != nil {
10099
return fmt.Errorf("render: %w", err)
@@ -260,19 +259,6 @@ func compareStructs(name string, driver, repo *types.Struct) error {
260259
return nil
261260
}
262261

263-
// collectTypes returns model and params struct names from the driver package.
264-
func collectTypes(pkg *types.Package) (models []string, params []string) {
265-
names, _ := scopeStructs(pkg)
266-
for _, name := range names {
267-
if strings.HasSuffix(name, "Params") {
268-
params = append(params, name)
269-
} else {
270-
models = append(models, name)
271-
}
272-
}
273-
return
274-
}
275-
276262
type methodInfo struct {
277263
Name string
278264
Params []paramInfo
@@ -369,14 +355,6 @@ func repoName(t types.Type, driverPath string) string {
369355
return ""
370356
}
371357

372-
// converterFn maps a type name to its converter function name: "Session" → "sessionToRepo".
373-
func converterFn(s string) string {
374-
if s == "" {
375-
return ""
376-
}
377-
return strings.ToLower(s[:1]) + s[1:] + "ToRepo"
378-
}
379-
380358
// renderedMethod holds pre-built signature and body strings passed to the template.
381359
type renderedMethod struct {
382360
Signature string
@@ -441,35 +419,11 @@ func callArgs(m methodInfo) string {
441419
return "ctx, " + strings.Join(args, ", ")
442420
}
443421

444-
// bodyTemplates holds the per-shape method body templates, parsed once at init.
445-
var bodyTemplates = template.Must(
446-
template.New("bodies").Parse(`
447-
{{define "void"}} return mapErr({{.Call}})
448-
{{end}}
449-
450-
{{define "scalar"}} r, err := {{.Call}}
451-
if err != nil {
452-
return {{.RepoType}}{}, mapErr(err)
453-
}
454-
return {{.Converter}}(r), nil
455-
{{end}}
456-
457-
{{define "slice"}} rows, err := {{.Call}}
458-
if err != nil {
459-
return nil, mapErr(err)
460-
}
461-
out := make([]{{.RepoType}}, len(rows))
462-
for i, row := range rows {
463-
out[i] = {{.Converter}}(row)
464-
}
465-
return out, nil
466-
{{end}}`),
467-
)
422+
var bodyTmpl = template.Must(template.New("store").Parse(storeSrc))
468423

469424
type bodyData struct {
470-
Call string
471-
RepoType string
472-
Converter string
425+
Call string
426+
RepoType string
473427
}
474428

475429
func buildBody(m methodInfo) string {
@@ -486,36 +440,28 @@ func buildBody(m methodInfo) string {
486440
data = bodyData{Call: call}
487441
case m.Results[0].IsSlice:
488442
name = "slice"
489-
data = bodyData{Call: call, RepoType: m.Results[0].RepoType, Converter: converterFn(m.Results[0].TypeStr)}
443+
data = bodyData{Call: call, RepoType: m.Results[0].RepoType}
490444
default:
491445
name = "scalar"
492-
data = bodyData{Call: call, RepoType: m.Results[0].RepoType, Converter: converterFn(m.Results[0].TypeStr)}
446+
data = bodyData{Call: call, RepoType: m.Results[0].RepoType}
493447
}
494448

495449
var buf bytes.Buffer
496-
if err := bodyTemplates.ExecuteTemplate(&buf, name, data); err != nil {
450+
if err := bodyTmpl.ExecuteTemplate(&buf, name, data); err != nil {
497451
panic(fmt.Sprintf("buildBody %s: %v", name, err))
498452
}
499453
return buf.String()
500454
}
501455

502456
type tmplData struct {
503-
PkgName string
504-
RepoPkg string
505-
ModelTypes []string
506-
Methods []renderedMethod
457+
PkgName string
458+
RepoPkg string
459+
Methods []renderedMethod
507460
}
508461

509462
func render(data tmplData) ([]byte, error) {
510-
t, err := template.New("store").Funcs(template.FuncMap{
511-
"converterFn": converterFn,
512-
}).Parse(storeSrc)
513-
if err != nil {
514-
return nil, fmt.Errorf("parse template: %w", err)
515-
}
516-
517463
var buf bytes.Buffer
518-
if err := t.Execute(&buf, data); err != nil {
464+
if err := bodyTmpl.Execute(&buf, data); err != nil {
519465
return nil, fmt.Errorf("execute template: %w", err)
520466
}
521467

gen/sqlc-wrapper/store.tmpl

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Code generated by cmd/gen/sqlc-wrapper. DO NOT EDIT.
2+
package {{.PkgName}}
3+
4+
import (
5+
"context"
6+
"database/sql"
7+
"errors"
8+
9+
"{{.RepoPkg}}"
10+
)
11+
12+
// Store wraps *Queries and implements repository.Store.
13+
type Store struct {
14+
q *Queries
15+
}
16+
17+
// NewStore wraps a *Queries to satisfy repository.Store.
18+
func NewStore(q *Queries) repository.Store {
19+
return &Store{q: q}
20+
}
21+
22+
var errorMap = map[error]error{
23+
sql.ErrNoRows: repository.ErrNotFound,
24+
}
25+
26+
func mapErr(err error) error {
27+
for from, to := range errorMap {
28+
if errors.Is(err, from) {
29+
return to
30+
}
31+
}
32+
return err
33+
}
34+
35+
{{range .Methods}}{{.Signature}} {
36+
{{.Body}}}
37+
38+
{{end}}
39+
40+
{{- define "void"}} return mapErr({{.Call}})
41+
{{end}}
42+
43+
{{- define "scalar"}} r, err := {{.Call}}
44+
if err != nil {
45+
return {{.RepoType}}{}, mapErr(err)
46+
}
47+
return {{.RepoType}}(r), nil
48+
{{end}}
49+
50+
{{- define "slice"}} rows, err := {{.Call}}
51+
if err != nil {
52+
return nil, mapErr(err)
53+
}
54+
out := make([]{{.RepoType}}, len(rows))
55+
for i, row := range rows {
56+
out[i] = {{.RepoType}}(row)
57+
}
58+
return out, nil
59+
{{end}}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
package sqlite
22

3-
//go:generate go run github.com/tinyauthapp/tinyauth/cmd/gen/sqlc-wrapper -pkg github.com/tinyauthapp/tinyauth/internal/repository/sqlite
3+
//go:generate go run github.com/tinyauthapp/tinyauth/gen/sqlc-wrapper -pkg github.com/tinyauthapp/tinyauth/internal/repository/sqlite

0 commit comments

Comments
 (0)