Skip to content

Commit

Permalink
Modularity: module builders generator (prebid#2491)
Browse files Browse the repository at this point in the history
  • Loading branch information
4lexvav authored Dec 14, 2022
1 parent 46f8b61 commit 459fe58
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 2 deletions.
8 changes: 6 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Makefile

all: deps test build
all: deps test build-modules build

.PHONY: deps test build image
.PHONY: deps test build-modules build image

# deps will clean out the vendor directory and use go mod for a fresh install
deps:
Expand All @@ -18,6 +18,10 @@ else
go test github.com/prebid/prebid-server/adapters/$(adapter) -bench=.
endif

# build-modules generates modules/builder.go file which provides a list of all available modules
build-modules:
go generate modules/modules.go

# build will ensure all of our tests pass and then build the go binary
build: test
go build -mod=vendor ./...
Expand Down
21 changes: 21 additions & 0 deletions modules/generator/builder.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package modules

{{if .}}
import (
{{- range .}}
{{.Vendor}}{{.Module | Title}} "github.com/prebid/prebid-server/modules/{{.Vendor}}/{{.Module}}"
{{- end}}
)
{{end}}

// builders returns mapping between module name and its builder
// vendor and module names are chosen based on the module directory name
func builders() ModuleBuilders {
return ModuleBuilders{
{{- range .}}
"{{.Vendor}}": {
"{{.Module}}": {{.Vendor}}{{.Module | Title}}.Builder,
},
{{- end}}
}
}
70 changes: 70 additions & 0 deletions modules/generator/buildergen.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
//go:build ignore

package main

import (
"bytes"
"fmt"
"go/format"
"io/fs"
"os"
"path/filepath"
"regexp"
"strings"
"text/template"
)

var (
r = regexp.MustCompile("^([^/]+)/([^/]+)/module.go$")
tmplName = "builder.tmpl"
outName = "builder.go"
)

type Module struct {
Vendor string
Module string
}

func main() {
var modules []Module

filepath.WalkDir("./", func(path string, d fs.DirEntry, err error) error {
if !r.MatchString(path) {
return nil
}
match := r.FindStringSubmatch(path)
modules = append(modules, Module{
Vendor: match[1],
Module: match[2],
})
return nil
})

funcMap := template.FuncMap{"Title": strings.Title}
t, err := template.New(tmplName).Funcs(funcMap).ParseFiles(fmt.Sprintf("generator/%s", tmplName))
if err != nil {
panic(fmt.Sprintf("failed to parse builder template: %s", err))
}

f, err := os.Create(outName)
if err != nil {
panic(fmt.Sprintf("failed to create %s file: %s", outName, err))
}
defer f.Close()

var buf bytes.Buffer
if err = t.Execute(&buf, modules); err != nil {
panic(fmt.Sprintf("failed to generate %s file content: %s", outName, err))
}

content, err := format.Source(buf.Bytes())
if err != nil {
panic(fmt.Sprintf("failed to format generated code: %s", err))
}

if _, err = f.Write(content); err != nil {
panic(fmt.Sprintf("failed to write file content: %s", err))
}

fmt.Printf("%s file successfully generated\n", outName)
}
2 changes: 2 additions & 0 deletions modules/modules.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import (
"github.com/prebid/prebid-server/hooks"
)

//go:generate go run ./generator/buildergen.go

// NewBuilder returns a new module builder.
func NewBuilder() Builder {
return &builder{builders()}
Expand Down

0 comments on commit 459fe58

Please sign in to comment.