package server import ( "fmt" "io" "tunnel/pkg/server/hook" "tunnel/pkg/server/opts" "tunnel/pkg/server/socket" ) func showHookList(r *request) { for _, h := range hook.GetList() { r.Println(h) } } func showSocketList(r *request) { for _, s := range socket.GetList() { r.Println(s) } } func showUsage(r *request, name, desc string, param []opts.Param) { r.Printf("usage: %s", name) for _, p := range param { formatParamShort(r, p) } r.Printf("\n\n%s", desc) } func showHookHelp(r *request, name string) { t := hook.GetType(name) if t == nil { r.Fatal("no such hook") } showUsage(r, t.Name, t.Desc, t.Param) } func formatParamShort(w io.Writer, p opts.Param) { if !p.Required { fmt.Fprint(w, "[") } fmt.Fprintf(w, ",%s", p.Name) if p.Kind != opts.Bool { fmt.Fprintf(w, "=%s", p.Kind) if p.Default != "" { fmt.Fprintf(w, "(%s)", p.Default) } } if !p.Required { fmt.Fprint(w, "]") } } func showSocketHelp(r *request, name string) { t := socket.GetType(name) if t == nil { r.Fatal("no such socket") } showUsage(r, t.Name, t.Desc, t.Param) } func init() { handle("hook list", showHookList, "") handle("hook help", showHookHelp, "hook-name") handle("socket list", showSocketList, "") handle("socket help", showSocketHelp, "socket-name") }