Skip to content

Commit

Permalink
Implement excluded services
Browse files Browse the repository at this point in the history
  • Loading branch information
Willyham authored and eandre committed Apr 12, 2024
1 parent 540bb5a commit e104f33
Show file tree
Hide file tree
Showing 8 changed files with 410 additions and 367 deletions.
21 changes: 12 additions & 9 deletions cli/cmd/encore/gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,15 @@ func init() {
rootCmd.AddCommand(genCmd)

var (
output string
lang string
envName string
genServiceNames []string
output string
lang string
envName string
genServiceNames []string
excludedServices []string
)

genClientCmd := &cobra.Command{
Use: "client [<app-id>] [--env=<name>] [--services=foo,bar]",
Use: "client [<app-id>] [--env=<name>] [--services=foo,bar] [--excluded-services=baz,qux]",
Short: "Generates an API client for your app",
Long: `Generates an API client for your app.
Expand Down Expand Up @@ -83,10 +84,11 @@ To further narrow down the services to generate, use the '--services' flag.
genServiceNames = []string{"*"}
}
resp, err := daemon.GenClient(ctx, &daemonpb.GenClientRequest{
AppId: appID,
EnvName: envName,
Lang: lang,
Services: genServiceNames,
AppId: appID,
EnvName: envName,
Lang: lang,
Services: genServiceNames,
ExcludedServices: excludedServices,
})
if err != nil {
fatal(err)
Expand Down Expand Up @@ -148,4 +150,5 @@ which may require the user-facing wrapper code to be manually generated.`,
_ = genClientCmd.RegisterFlagCompletionFunc("env", cmdutil.AutoCompleteEnvSlug)

genClientCmd.Flags().StringSliceVarP(&genServiceNames, "services", "s", nil, "The names of the services to include in the output")
genClientCmd.Flags().StringSliceVarP(&excludedServices, "excluded-services", "x", nil, "The names of the services to exclude in the output")
}
10 changes: 4 additions & 6 deletions cli/daemon/daemon.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"bytes"
"context"
"io"
"slices"
"strings"
"sync"
"sync/atomic"
Expand All @@ -27,6 +26,7 @@ import (
"encr.dev/cli/internal/platform"
"encr.dev/cli/internal/update"
"encr.dev/internal/clientgen"
"encr.dev/internal/clientgen/clientgentypes"
"encr.dev/internal/version"
"encr.dev/pkg/builder"
"encr.dev/pkg/builder/builderimpl"
Expand Down Expand Up @@ -138,11 +138,9 @@ func (s *Server) GenClient(ctx context.Context, params *daemonpb.GenClientReques
}

lang := clientgen.Lang(params.Lang)
serviceNames := params.Services
if slices.Contains(serviceNames, "*") {
serviceNames = nil
}
code, err := clientgen.Client(lang, params.AppId, md, serviceNames)

servicesToGenerate := clientgentypes.NewServiceSet(md, params.Services, params.ExcludedServices)
code, err := clientgen.Client(lang, params.AppId, md, servicesToGenerate)
if err != nil {
return nil, status.Error(codes.InvalidArgument, err.Error())
}
Expand Down
4 changes: 3 additions & 1 deletion e2e-tests/echo_app_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
. "encr.dev/cli/daemon/run"
"encr.dev/cli/daemon/run/infra"
"encr.dev/internal/clientgen"
"encr.dev/internal/clientgen/clientgentypes"
. "encr.dev/internal/optracker"
"encr.dev/pkg/golden"
"encr.dev/pkg/svcproxy"
Expand Down Expand Up @@ -95,7 +96,8 @@ func doTestEndToEndWithApp(t *testing.T, env []string) {
clientgen.LangTypeScript: "ts/client.ts",
clientgen.LangJavascript: "js/client.js",
} {
client, err := clientgen.Client(lang, "slug", app.Meta, nil)
services := clientgentypes.AllServices(app.Meta)
client, err := clientgen.Client(lang, "slug", app.Meta, services)
if err != nil {
fmt.Println(err.Error())
c.FailNow()
Expand Down
16 changes: 5 additions & 11 deletions internal/clientgen/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ func Detect(path string) (lang Lang, ok bool) {
// Client generates an API client based on the given app metadata.
// ServiceNames are the services to include in the output.
// If it's nil, all services are included.
func Client(lang Lang, appSlug string, md *meta.Data, serviceNames []string) (code []byte, err error) {
func Client(lang Lang, appSlug string, md *meta.Data, services clientgentypes.ServiceSet) (code []byte, err error) {
defer func() {
if e := recover(); e != nil {
err = srcerrors.UnhandledPanic(e)
Expand All @@ -75,17 +75,11 @@ func Client(lang Lang, appSlug string, md *meta.Data, serviceNames []string) (co

var buf bytes.Buffer
params := clientgentypes.GenerateParams{
Buf: &buf,
AppSlug: appSlug,
Meta: md,
Buf: &buf,
AppSlug: appSlug,
Meta: md,
Services: services,
}
if serviceNames == nil {
serviceNames = make([]string, 0, len(md.Svcs))
for _, svc := range md.Svcs {
serviceNames = append(serviceNames, svc.Name)
}
}
params.Services = clientgentypes.NewServiceSet(serviceNames...)

if err := gen.Generate(params); err != nil {
return nil, fmt.Errorf("genclient.Generate %s %s: %v", lang, appSlug, err)
Expand Down
4 changes: 3 additions & 1 deletion internal/clientgen/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/rogpeppe/go-internal/txtar"

"encr.dev/cli/daemon/apps"
"encr.dev/internal/clientgen/clientgentypes"
"encr.dev/pkg/builder"
"encr.dev/pkg/golden"
"encr.dev/v2/v2builder"
Expand Down Expand Up @@ -69,7 +70,8 @@ func TestClientCodeGeneration(t *testing.T) {
}
c.Assert(ok, qt.IsTrue, qt.Commentf("Unable to detect language type for %s", file.Name()))

generatedClient, err := Client(language, "app", res.Meta, nil)
services := clientgentypes.AllServices(res.Meta)
generatedClient, err := Client(language, "app", res.Meta, services)
c.Assert(err, qt.IsNil)

golden.TestAgainst(c, file.Name(), string(generatedClient))
Expand Down
37 changes: 32 additions & 5 deletions internal/clientgen/clientgentypes/clientgentypes.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package clientgentypes

import (
"bytes"
"slices"

meta "encr.dev/proto/encore/parser/meta/v1"
)
Expand All @@ -26,13 +27,39 @@ func (s ServiceSet) Has(svc string) bool {
return s.set[svc]
}

func NewServiceSet(svcs ...string) ServiceSet {
set := make(map[string]bool, len(svcs))
for _, svc := range svcs {
set[svc] = true
// NewServiceSet constructs a new service set.
// If the list contains "*", include all services in the metadata.
// Finally, exclude any services in the exclude list.
func NewServiceSet(md *meta.Data, include, exclude []string) ServiceSet {
set := make(map[string]bool, len(include))
if slices.Contains(include, "*") {
// If the list contains "*", include all services.
for _, svc := range md.Svcs {
set[svc.Name] = true
}
} else {
for _, svc := range include {
set[svc] = true
}
}

// Remove excludes.
for _, svc := range exclude {
delete(set, svc)
}

list := make([]string, 0, len(set))
for svc := range set {
list = append(list, svc)
}
slices.Sort(list)

return ServiceSet{
list: svcs,
list: list,
set: set,
}
}

func AllServices(md *meta.Data) ServiceSet {
return NewServiceSet(md, []string{"*"}, nil)
}

0 comments on commit e104f33

Please sign in to comment.