add ctx, implement exec

This commit is contained in:
Alexander Wang 2022-12-30 11:33:32 -08:00
parent 35ccc05d39
commit fc5f58323c
No known key found for this signature in database
GPG key ID: D89FA31966BDBECE
5 changed files with 48 additions and 17 deletions

View file

@ -41,9 +41,29 @@ type execPlugin struct {
opts map[string]string opts map[string]string
} }
func (p execPlugin) Flags() []PluginSpecificFlag { func (p execPlugin) Flags(ctx context.Context) (_ []PluginSpecificFlag, err error) {
// TODO ctx, cancel := context.WithTimeout(ctx, time.Second*10)
return nil defer cancel()
cmd := exec.CommandContext(ctx, p.path, "flags")
defer xdefer.Errorf(&err, "failed to run %v", cmd.Args)
stdout, err := cmd.Output()
if err != nil {
ee := &exec.ExitError{}
if errors.As(err, &ee) && len(ee.Stderr) > 0 {
return nil, fmt.Errorf("%v\nstderr:\n%s", ee, ee.Stderr)
}
return nil, err
}
var flags []PluginSpecificFlag
err = json.Unmarshal(stdout, &flags)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal json: %w", err)
}
return flags, nil
} }
func (p *execPlugin) HydrateOpts(opts []byte) error { func (p *execPlugin) HydrateOpts(opts []byte) error {

View file

@ -32,7 +32,7 @@ type Plugin interface {
// Info returns the current info information of the plugin. // Info returns the current info information of the plugin.
Info(context.Context) (*PluginInfo, error) Info(context.Context) (*PluginInfo, error)
Flags() []PluginSpecificFlag Flags(context.Context) ([]PluginSpecificFlag, error)
HydrateOpts([]byte) error HydrateOpts([]byte) error
@ -123,10 +123,14 @@ func FindPlugin(ctx context.Context, name string) (Plugin, string, error) {
return &execPlugin{path: path}, path, nil return &execPlugin{path: path}, path, nil
} }
func ListPluginFlags() []PluginSpecificFlag { func ListPluginFlags(ctx context.Context) ([]PluginSpecificFlag, error) {
var out []PluginSpecificFlag var out []PluginSpecificFlag
for _, p := range plugins { for _, p := range plugins {
out = append(out, p.Flags()...) flags, err := p.Flags(ctx)
if err != nil {
return nil, err
} }
return out out = append(out, flags...)
}
return out, nil
} }

View file

@ -21,7 +21,7 @@ type dagrePlugin struct {
opts *d2dagrelayout.Opts opts *d2dagrelayout.Opts
} }
func (p dagrePlugin) Flags() []PluginSpecificFlag { func (p dagrePlugin) Flags(context.Context) ([]PluginSpecificFlag, error) {
return []PluginSpecificFlag{ return []PluginSpecificFlag{
{ {
Name: "dagre-nodesep", Name: "dagre-nodesep",
@ -37,7 +37,7 @@ func (p dagrePlugin) Flags() []PluginSpecificFlag {
Usage: "number of pixels that separate edges horizontally.", Usage: "number of pixels that separate edges horizontally.",
Tag: "edgesep", Tag: "edgesep",
}, },
} }, nil
} }
func (p *dagrePlugin) HydrateOpts(opts []byte) error { func (p *dagrePlugin) HydrateOpts(opts []byte) error {

View file

@ -21,7 +21,7 @@ type elkPlugin struct {
opts *d2elklayout.ConfigurableOpts opts *d2elklayout.ConfigurableOpts
} }
func (p elkPlugin) Flags() []PluginSpecificFlag { func (p elkPlugin) Flags(context.Context) ([]PluginSpecificFlag, error) {
// ms.Opts.String("", "elk-algorithm", "", d2elklayout.DefaultOpts.Algorithm, "number of pixels that separate nodes horizontally.") // ms.Opts.String("", "elk-algorithm", "", d2elklayout.DefaultOpts.Algorithm, "number of pixels that separate nodes horizontally.")
// _, err = ms.Opts.Int64("", "elk-nodeNodeBetweenLayers", "", int64(d2elklayout.DefaultOpts.NodeSpacing), "number of pixels that separate edges horizontally.") // _, err = ms.Opts.Int64("", "elk-nodeNodeBetweenLayers", "", int64(d2elklayout.DefaultOpts.NodeSpacing), "number of pixels that separate edges horizontally.")
// if err != nil { // if err != nil {
@ -44,7 +44,7 @@ func (p elkPlugin) Flags() []PluginSpecificFlag {
Usage: "number of pixels that separate nodes horizontally.", Usage: "number of pixels that separate nodes horizontally.",
Tag: "elk.algorithm", Tag: "elk.algorithm",
}, },
} }, nil
} }
func (p *elkPlugin) HydrateOpts(opts []byte) error { func (p *elkPlugin) HydrateOpts(opts []byte) error {

19
main.go
View file

@ -76,7 +76,7 @@ func run(ctx context.Context, ms *xmain.State) (err error) {
return err return err
} }
err = populateLayoutOpts(ms) err = populateLayoutOpts(ctx, ms)
if err != nil { if err != nil {
return err return err
} }
@ -150,7 +150,7 @@ func run(ctx context.Context, ms *xmain.State) (err error) {
return err return err
} }
err = parseLayoutOpts(ms, plugin) err = parseLayoutOpts(ctx, ms, plugin)
if err != nil { if err != nil {
return err return err
} }
@ -300,8 +300,11 @@ func DiscardSlog(ctx context.Context) context.Context {
return ctxlog.With(ctx, slog.Make(sloghuman.Sink(io.Discard))) return ctxlog.With(ctx, slog.Make(sloghuman.Sink(io.Discard)))
} }
func populateLayoutOpts(ms *xmain.State) error { func populateLayoutOpts(ctx context.Context, ms *xmain.State) error {
pluginFlags := d2plugin.ListPluginFlags() pluginFlags, err := d2plugin.ListPluginFlags(ctx)
if err != nil {
return err
}
for _, f := range pluginFlags { for _, f := range pluginFlags {
switch f.Type { switch f.Type {
@ -315,9 +318,13 @@ func populateLayoutOpts(ms *xmain.State) error {
return nil return nil
} }
func parseLayoutOpts(ms *xmain.State, plugin d2plugin.Plugin) error { func parseLayoutOpts(ctx context.Context, ms *xmain.State, plugin d2plugin.Plugin) error {
opts := make(map[string]interface{}) opts := make(map[string]interface{})
for _, f := range plugin.Flags() { flags, err := plugin.Flags(ctx)
if err != nil {
return err
}
for _, f := range flags {
switch f.Type { switch f.Type {
case "string": case "string":
val, _ := ms.Opts.Flags.GetString(f.Name) val, _ := ms.Opts.Flags.GetString(f.Name)