|
@@ -24,6 +24,15 @@ const (
|
|
|
|
|
|
type HandleFunc func(ctx *Context) (err error)
|
|
type HandleFunc func(ctx *Context) (err error)
|
|
|
|
|
|
|
|
+type (
|
|
|
|
+ Options struct {
|
|
|
|
+ Usage string
|
|
|
|
+ Description string
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Option func(o *Options)
|
|
|
|
+)
|
|
|
|
+
|
|
type Server struct {
|
|
type Server struct {
|
|
seq int32
|
|
seq int32
|
|
ctx context.Context
|
|
ctx context.Context
|
|
@@ -109,13 +118,17 @@ func (svr *Server) process(id int32, conn net.Conn) (err error) {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
-func (svr *Server) Handle(path string, cb HandleFunc) {
|
|
|
|
|
|
+func (svr *Server) Handle(path string, cb HandleFunc, args ...Option) {
|
|
var tokens []string
|
|
var tokens []string
|
|
if strings.HasPrefix(path, "/") {
|
|
if strings.HasPrefix(path, "/") {
|
|
tokens = strings.Split(path[1:], "/")
|
|
tokens = strings.Split(path[1:], "/")
|
|
} else {
|
|
} else {
|
|
tokens = utils.BreakUp(path)
|
|
tokens = utils.BreakUp(path)
|
|
}
|
|
}
|
|
|
|
+ opts := &Options{}
|
|
|
|
+ for _, o := range args {
|
|
|
|
+ o(opts)
|
|
|
|
+ }
|
|
svr.locker.Lock()
|
|
svr.locker.Lock()
|
|
defer svr.locker.Unlock()
|
|
defer svr.locker.Unlock()
|
|
var (
|
|
var (
|
|
@@ -149,6 +162,12 @@ func (svr *Server) Handle(path string, cb HandleFunc) {
|
|
p = q
|
|
p = q
|
|
} else {
|
|
} else {
|
|
q = NewExecutor(token, "", strings.Title(strings.Join(tokens, " ")))
|
|
q = NewExecutor(token, "", strings.Title(strings.Join(tokens, " ")))
|
|
|
|
+ if opts.Usage != "" {
|
|
|
|
+ q.usage = opts.Usage
|
|
|
|
+ }
|
|
|
|
+ if opts.Description != "" {
|
|
|
|
+ q.description = opts.Description
|
|
|
|
+ }
|
|
if i == length-1 {
|
|
if i == length-1 {
|
|
q.handleFunc = cb
|
|
q.handleFunc = cb
|
|
}
|
|
}
|
|
@@ -173,11 +192,10 @@ func (svr *Server) tcpServe(listener net.Listener) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-func (svr *Server) unixServe(filename string) {
|
|
|
|
|
|
+func (svr *Server) unixServe(filename string) (listener net.Listener) {
|
|
var (
|
|
var (
|
|
- err error
|
|
|
|
- addr *net.UnixAddr
|
|
|
|
- listener net.Listener
|
|
|
|
|
|
+ err error
|
|
|
|
+ addr *net.UnixAddr
|
|
)
|
|
)
|
|
if addr, err = net.ResolveUnixAddr("unix", filename); err != nil {
|
|
if addr, err = net.ResolveUnixAddr("unix", filename); err != nil {
|
|
return
|
|
return
|
|
@@ -186,14 +204,17 @@ func (svr *Server) unixServe(filename string) {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
svr.tcpServe(listener)
|
|
svr.tcpServe(listener)
|
|
- err = listener.Close()
|
|
|
|
|
|
+ return
|
|
}
|
|
}
|
|
|
|
|
|
func (svr *Server) Serve(listener net.Listener) (err error) {
|
|
func (svr *Server) Serve(listener net.Listener) (err error) {
|
|
svr.Handle("help", func(ctx *Context) (err error) {
|
|
svr.Handle("help", func(ctx *Context) (err error) {
|
|
return ctx.Success(svr.executor.String())
|
|
return ctx.Success(svr.executor.String())
|
|
})
|
|
})
|
|
- var wg sync.WaitGroup
|
|
|
|
|
|
+ var (
|
|
|
|
+ wg sync.WaitGroup
|
|
|
|
+ unixListener net.Listener
|
|
|
|
+ )
|
|
if listener != nil {
|
|
if listener != nil {
|
|
wg.Add(1)
|
|
wg.Add(1)
|
|
go func() {
|
|
go func() {
|
|
@@ -202,13 +223,15 @@ func (svr *Server) Serve(listener net.Listener) (err error) {
|
|
}()
|
|
}()
|
|
}
|
|
}
|
|
if runtime.GOOS == "linux" {
|
|
if runtime.GOOS == "linux" {
|
|
- wg.Add(1)
|
|
|
|
go func() {
|
|
go func() {
|
|
- svr.unixServe(path.Join(os.TempDir(), os.Getenv("MICRO_SERVICE_NAME")+".sock"))
|
|
|
|
- wg.Done()
|
|
|
|
|
|
+ //listen unix
|
|
|
|
+ unixListener = svr.unixServe(path.Join(os.TempDir(), os.Getenv("MICRO_SERVICE_NAME")+".sock"))
|
|
}()
|
|
}()
|
|
}
|
|
}
|
|
wg.Wait()
|
|
wg.Wait()
|
|
|
|
+ if unixListener != nil {
|
|
|
|
+ err = unixListener.Close()
|
|
|
|
+ }
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|