package main import ( "bytes" "context" "flag" "fmt" "io" "io/ioutil" "log" "net/http" "os" "github.com/google/subcommands" ) type handlerInvokeCmd struct { fin string } func (hic *handlerInvokeCmd) SetFlags(fs *flag.FlagSet) { fs.StringVar(&hic.fin, "i", "", "input file to pipe to wasmcloud") } func (handlerInvokeCmd) Name() string { return "invoke" } func (handlerInvokeCmd) Synopsis() string { return "synchronously invoke a handler on wasmcloud" } func (handlerInvokeCmd) Usage() string { return `wasmcloud invoke $ wasmcloud invoke princess-of-wands-4018 Invokes a given handler with input read from the given file. Use /dev/stdin if you want to pipe things. Flags: ` } func (hic handlerInvokeCmd) Execute(ctx context.Context, fs *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus { if fs.NArg() != 1 { fmt.Println("usage: wasmcloud invoke ") return subcommands.ExitUsageError } hname := fs.Arg(0) var buf = bytes.NewBuffer(nil) if hic.fin != "" { data, err := ioutil.ReadFile(hic.fin) if err != nil { log.Fatal(err) } buf = bytes.NewBuffer(data) } req, err := http.NewRequestWithContext(ctx, http.MethodPost, *apiServer+"/invoke/sync?name="+hname+"&whole-bundle=true", buf) if err != nil { log.Fatal(err) } withAPI(req) resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { io.Copy(os.Stdout, resp.Body) return subcommands.ExitFailure } io.Copy(os.Stdout, resp.Body) return subcommands.ExitSuccess }