diff --git a/main.go b/main.go index 4681b44..100f8d6 100644 --- a/main.go +++ b/main.go @@ -11,6 +11,7 @@ import ( ) type CmdDaemon struct { + Name string // app cli command name SocketPath string // unix socket path cmds map[string]CmdHandler } @@ -103,7 +104,7 @@ func (c *CmdDaemon) Listen() error { cmdHandler, ok := c.cmds[req.Cmd] if !ok { _ = Write(conn, CmdResponse{ - Error: "unknown command: " + req.Cmd, + Error: "unknown command: " + req.Cmd + "\n" + c.Usage(), Continue: false, }) return @@ -113,12 +114,23 @@ func (c *CmdDaemon) Listen() error { cmdConn := &CmdConn{Conn: conn, Id: req.Id} err = cmdHandler.Handle(cmdConn, req) if err != nil { - _ = cmdConn.WriteError(err, false) + _ = cmdConn.End(err.Error() + cmdHandler.Usage()) } }(conn) } } +func (c *CmdDaemon) Usage() string { + usage := fmt.Sprintf("Usage: %s [options] [args...]\n\n", c.Name) + usage += "Options:\n" + usage += " -d, --debug Run command in debug mode\n\n" + usage += "Commands:\n" + for cmd, handler := range c.cmds { + usage += fmt.Sprintf(" %-10s %s\n", cmd, handler.Description()) + } + return usage +} + func (c *CmdDaemon) RegisterCmd(cmd string, handler CmdHandler) { c.cmds[cmd] = handler }