diff --git a/d2plugin/exec.go b/d2plugin/exec.go index acb8a9618..efbfcd970 100644 --- a/d2plugin/exec.go +++ b/d2plugin/exec.go @@ -82,6 +82,8 @@ func (p *execPlugin) HydrateOpts(opts []byte) error { allString[k] = vt case int64: allString[k] = strconv.Itoa(int(vt)) + case float64: + allString[k] = strconv.Itoa(int(vt)) } } diff --git a/d2plugin/plugin.go b/d2plugin/plugin.go index a8c894333..25eee8d08 100644 --- a/d2plugin/plugin.go +++ b/d2plugin/plugin.go @@ -7,6 +7,7 @@ package d2plugin import ( "context" + "encoding/json" "os/exec" "oss.terrastruct.com/util-go/xexec" @@ -166,3 +167,28 @@ func ListPluginFlags(ctx context.Context) ([]PluginSpecificFlag, error) { return out, nil } + +func HydratePluginOpts(ctx context.Context, ms *xmain.State, plugin Plugin) error { + opts := make(map[string]interface{}) + flags, err := plugin.Flags(ctx) + if err != nil { + return err + } + for _, f := range flags { + switch f.Type { + case "string": + val, _ := ms.Opts.Flags.GetString(f.Name) + opts[f.Tag] = val + case "int64": + val, _ := ms.Opts.Flags.GetInt64(f.Name) + opts[f.Tag] = val + } + } + + b, err := json.Marshal(opts) + if err != nil { + return err + } + + return plugin.HydrateOpts(b) +} diff --git a/d2plugin/serve.go b/d2plugin/serve.go index 2e8da78f0..acc697a96 100644 --- a/d2plugin/serve.go +++ b/d2plugin/serve.go @@ -41,6 +41,11 @@ func Serve(p Plugin) xmain.RunFunc { return xmain.UsageErrorf("expected first argument to be subcmd name") } + err = HydratePluginOpts(ctx, ms, p) + if err != nil { + return err + } + subcmd := ms.Opts.Flags.Arg(0) switch subcmd { case "info": diff --git a/main.go b/main.go index d9c5655b4..78041b71e 100644 --- a/main.go +++ b/main.go @@ -2,7 +2,6 @@ package main import ( "context" - "encoding/json" "errors" "fmt" "io" @@ -150,7 +149,7 @@ func run(ctx context.Context, ms *xmain.State) (err error) { return err } - err = parseLayoutOpts(ctx, ms, plugin) + err = d2plugin.HydratePluginOpts(ctx, ms, plugin) if err != nil { return err } @@ -314,29 +313,3 @@ func populateLayoutOpts(ctx context.Context, ms *xmain.State) error { return nil } - -func parseLayoutOpts(ctx context.Context, ms *xmain.State, plugin d2plugin.Plugin) error { - opts := make(map[string]interface{}) - flags, err := plugin.Flags(ctx) - if err != nil { - return err - } - for _, f := range flags { - switch f.Type { - case "string": - val, _ := ms.Opts.Flags.GetString(f.Name) - opts[f.Tag] = val - case "int64": - val, _ := ms.Opts.Flags.GetInt64(f.Name) - opts[f.Tag] = val - } - } - - b, err := json.Marshal(opts) - if err != nil { - return err - } - - err = plugin.HydrateOpts(b) - return err -}