125 lines
2.7 KiB
Go
125 lines
2.7 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"encoding/json"
|
||
|
"flag"
|
||
|
"fmt"
|
||
|
"net/url"
|
||
|
"os"
|
||
|
"strings"
|
||
|
|
||
|
goa "goa.design/goa/v3/pkg"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
var (
|
||
|
hostF = flag.String("host", "localhost", "Server host (valid values: localhost, integration)")
|
||
|
addrF = flag.String("url", "", "URL to service host")
|
||
|
|
||
|
verboseF = flag.Bool("verbose", false, "Print request and response details")
|
||
|
vF = flag.Bool("v", false, "Print request and response details")
|
||
|
timeoutF = flag.Int("timeout", 30, "Maximum number of seconds to wait for response")
|
||
|
)
|
||
|
flag.Usage = usage
|
||
|
flag.Parse()
|
||
|
var (
|
||
|
addr string
|
||
|
timeout int
|
||
|
debug bool
|
||
|
)
|
||
|
{
|
||
|
addr = *addrF
|
||
|
if addr == "" {
|
||
|
switch *hostF {
|
||
|
case "localhost":
|
||
|
addr = "http://localhost:8088"
|
||
|
case "integration":
|
||
|
addr = "http://localhost:8088"
|
||
|
default:
|
||
|
fmt.Fprintf(os.Stderr, "invalid host argument: %q (valid hosts: localhost|integration)\n", *hostF)
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
}
|
||
|
timeout = *timeoutF
|
||
|
debug = *verboseF || *vF
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
scheme string
|
||
|
host string
|
||
|
)
|
||
|
{
|
||
|
u, err := url.Parse(addr)
|
||
|
if err != nil {
|
||
|
fmt.Fprintf(os.Stderr, "invalid URL %#v: %s\n", addr, err)
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
scheme = u.Scheme
|
||
|
host = u.Host
|
||
|
}
|
||
|
var (
|
||
|
endpoint goa.Endpoint
|
||
|
payload interface{}
|
||
|
err error
|
||
|
)
|
||
|
{
|
||
|
switch scheme {
|
||
|
case "http", "https":
|
||
|
endpoint, payload, err = doHTTP(scheme, host, timeout, debug)
|
||
|
case "grpc", "grpcs":
|
||
|
endpoint, payload, err = doGRPC(scheme, host, timeout, debug)
|
||
|
default:
|
||
|
fmt.Fprintf(os.Stderr, "invalid scheme: %q (valid schemes: grpc|http)\n", scheme)
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
}
|
||
|
if err != nil {
|
||
|
if err == flag.ErrHelp {
|
||
|
os.Exit(0)
|
||
|
}
|
||
|
fmt.Fprintln(os.Stderr, err.Error())
|
||
|
fmt.Fprintln(os.Stderr, "run '"+os.Args[0]+" --help' for detailed usage.")
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
|
||
|
data, err := endpoint(context.Background(), payload)
|
||
|
if err != nil {
|
||
|
fmt.Fprintln(os.Stderr, err.Error())
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
|
||
|
if data != nil {
|
||
|
m, _ := json.MarshalIndent(data, "", " ")
|
||
|
fmt.Println(string(m))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func usage() {
|
||
|
fmt.Fprintf(os.Stderr, `%s is a command line client for the Example Service API.
|
||
|
|
||
|
Usage:
|
||
|
%s [-host HOST][-url URL][-timeout SECONDS][-verbose|-v] SERVICE ENDPOINT [flags]
|
||
|
|
||
|
-host HOST: server host (localhost). valid values: localhost, integration
|
||
|
-url URL: specify service URL overriding host URL (http://localhost:8080)
|
||
|
-timeout: maximum number of seconds to wait for response (30)
|
||
|
-verbose|-v: print request and response details (false)
|
||
|
|
||
|
Commands:
|
||
|
%s
|
||
|
Additional help:
|
||
|
%s SERVICE [ENDPOINT] --help
|
||
|
|
||
|
Example:
|
||
|
%s
|
||
|
`, os.Args[0], os.Args[0], indent(httpUsageCommands()), os.Args[0], indent(httpUsageExamples()))
|
||
|
}
|
||
|
|
||
|
func indent(s string) string {
|
||
|
if s == "" {
|
||
|
return ""
|
||
|
}
|
||
|
return " " + strings.Replace(s, "\n", "\n ", -1)
|
||
|
}
|