From e13c34393923637418c408c60811132f21a75fea Mon Sep 17 00:00:00 2001
From: Trock <g_trock@163.com>
Date: Fri, 4 Jun 2021 18:49:17 +0800
Subject: [PATCH] fix: remove applies count check

---
 c_test.go              |  2 +-
 container/container.go | 12 ++++--------
 contract/container.go  |  8 ++++----
 serve.go               | 39 +++++++--------------------------------
 srvgrpc/metrics.go     |  9 ++++++++-
 5 files changed, 24 insertions(+), 46 deletions(-)

diff --git a/c_test.go b/c_test.go
index 17f49e3c..1d4f2728 100644
--- a/c_test.go
+++ b/c_test.go
@@ -100,7 +100,7 @@ func TestC_NoServe(t *testing.T) {
 	defer cancel()
 	e := c.Serve(ctx)
 	assert.NoError(t, e)
-	assert.Equal(t, int32(0), atomic.LoadInt32(&called))
+	assert.Equal(t, int32(4), atomic.LoadInt32(&called))
 }
 
 func TestC_ServeDisable(t *testing.T) {
diff --git a/container/container.go b/container/container.go
index 895e5260..210c4885 100644
--- a/container/container.go
+++ b/container/container.go
@@ -61,20 +61,18 @@ type Container struct {
 
 // ApplyRouter iterates through every HTTPProvider registered in the container,
 // and introduce the router to everyone.
-func (c *Container) ApplyRouter(router *mux.Router) int {
+func (c *Container) ApplyRouter(router *mux.Router) {
 	for _, p := range c.httpProviders {
 		p(router)
 	}
-	return len(c.httpProviders)
 }
 
 // ApplyGRPCServer iterates through every GRPCProvider registered in the container,
 // and introduce a *grpc.Server to everyone.
-func (c *Container) ApplyGRPCServer(server *grpc.Server) int {
+func (c *Container) ApplyGRPCServer(server *grpc.Server) {
 	for _, p := range c.grpcProviders {
 		p(server)
 	}
-	return len(c.grpcProviders)
 }
 
 // Shutdown iterates through every CloserProvider registered in the container,
@@ -94,11 +92,10 @@ func (c *Container) Shutdown() {
 
 // ApplyRunGroup iterates through every RunProvider registered in the container,
 // and introduce the *run.Group to everyone.
-func (c *Container) ApplyRunGroup(g *run.Group) int {
+func (c *Container) ApplyRunGroup(g *run.Group) {
 	for _, p := range c.runProviders {
 		p(g)
 	}
-	return len(c.runProviders)
 }
 
 // Modules returns all modules in the container. This method is used to scan for
@@ -122,11 +119,10 @@ func (c *Container) Modules() ifilter.Collection {
 
 // ApplyCron iterates through every CronProvider registered in the container,
 // and introduce the *cron.Cron to everyone.
-func (c *Container) ApplyCron(crontab *cron.Cron) int {
+func (c *Container) ApplyCron(crontab *cron.Cron) {
 	for _, p := range c.cronProviders {
 		p(crontab)
 	}
-	return len(c.cronProviders)
 }
 
 // ApplyRootCommand iterates through every CommandProvider registered in the container,
diff --git a/contract/container.go b/contract/container.go
index 8b7ab747..435d634a 100644
--- a/contract/container.go
+++ b/contract/container.go
@@ -11,10 +11,10 @@ import (
 
 // Container holds modules.
 type Container interface {
-	ApplyRouter(router *mux.Router) int
-	ApplyGRPCServer(server *grpc.Server) int
-	ApplyCron(crontab *cron.Cron) int
-	ApplyRunGroup(g *run.Group) int
+	ApplyRouter(router *mux.Router)
+	ApplyGRPCServer(server *grpc.Server)
+	ApplyCron(crontab *cron.Cron)
+	ApplyRunGroup(g *run.Group)
 	ApplyRootCommand(command *cobra.Command)
 	Shutdown()
 	Modules() ifilter.Collection
diff --git a/serve.go b/serve.go
index ce79d417..a9151379 100644
--- a/serve.go
+++ b/serve.go
@@ -18,7 +18,6 @@ import (
 	"github.com/go-kit/log"
 	"github.com/go-kit/log/level"
 	"github.com/gorilla/mux"
-	grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
 	"github.com/oklog/run"
 	"github.com/pkg/errors"
 	"github.com/robfig/cron/v3"
@@ -65,10 +64,8 @@ func (s serveIn) httpServe(ctx context.Context, logger logging.LevelLogger) (fun
 		s.HTTPServer = &http.Server{}
 	}
 	router := mux.NewRouter()
-	if s.Container.ApplyRouter(router) == 0 {
-		logger.Info("no http service to apply")
-		return nil, nil, nil
-	}
+	s.Container.ApplyRouter(router)
+
 	router.Walk(func(route *mux.Route, router *mux.Router, ancestors []*mux.Route) error {
 		tpl, _ := route.GetPathTemplate()
 		level.Debug(logger).Log("service", "http", "path", tpl)
@@ -104,16 +101,9 @@ func (s serveIn) grpcServe(ctx context.Context, logger logging.LevelLogger) (fun
 		return nil, nil, nil
 	}
 	if s.GRPCServer == nil {
-		opts := []grpc.ServerOption{
-			grpc.UnaryInterceptor(grpc_prometheus.UnaryServerInterceptor),
-			grpc.StreamInterceptor(grpc_prometheus.StreamServerInterceptor),
-		}
-		s.GRPCServer = grpc.NewServer(opts...)
-	}
-	if s.Container.ApplyGRPCServer(s.GRPCServer) == 0 {
-		logger.Info("no grpc service to apply")
-		return nil, nil, nil
+		s.GRPCServer = grpc.NewServer()
 	}
+	s.Container.ApplyGRPCServer(s.GRPCServer)
 
 	for module, info := range s.GRPCServer.GetServiceInfo() {
 		for _, method := range info.Methods {
@@ -150,11 +140,8 @@ func (s serveIn) cronServe(ctx context.Context, logger logging.LevelLogger) (fun
 	if s.Cron == nil {
 		s.Cron = cron.New(cron.WithLogger(cronopts.CronLogAdapter{Logging: s.Logger}))
 	}
+	s.Container.ApplyCron(s.Cron)
 
-	if s.Container.ApplyCron(s.Cron) == 0 {
-		logger.Info("no cron service to apply")
-		return nil, nil, nil
-	}
 	return func() error {
 			logger.Infof("cron runner started")
 			s.Cron.Run()
@@ -191,10 +178,7 @@ func newServeCmd(s serveIn) *cobra.Command {
 				g run.Group
 				l = logging.WithLevel(s.Logger)
 			)
-			if len(s.Container.Modules()) == 0 {
-				l.Warn("there are no modules to run, please provide")
-				return nil
-			}
+
 			for _, m := range s.Container.Modules() {
 				l.Debugf("load module: %T", m)
 			}
@@ -207,28 +191,19 @@ func newServeCmd(s serveIn) *cobra.Command {
 				s.signalWatch,
 			}
 
-			serveCount := len(serves)
-
 			for _, serve := range serves {
 				execute, interrupt, err := serve(cmd.Context(), l)
 				if err != nil {
 					return err
 				}
 				if execute == nil {
-					serveCount--
 					continue
 				}
 				g.Add(execute, interrupt)
 			}
 
 			// Additional run groups
-			serveCount += s.Container.ApplyRunGroup(&g)
-
-			// At least one serve: signalWatch. It doesn't need to run alone
-			if serveCount <= 1 {
-				l.Warn("there are no services to run, please check module")
-				return nil
-			}
+			s.Container.ApplyRunGroup(&g)
 
 			if err := g.Run(); err != nil {
 				return err
diff --git a/srvgrpc/metrics.go b/srvgrpc/metrics.go
index fdabf93f..82f3f060 100644
--- a/srvgrpc/metrics.go
+++ b/srvgrpc/metrics.go
@@ -6,7 +6,14 @@ import (
 )
 
 // MetricsModule exposes prometheus metrics. Here only provides a simple call,
-// more complex use, please refer to github.com/grpc-ecosystem/go-grpc-prometheus
+// more complex use, please refer to github.com/grpc-ecosystem/go-grpc-prometheus.
+//
+// Need to actively provide grpc.Server:
+// 		opts := []grpc.ServerOption{
+//			grpc.UnaryInterceptor(grpc_prometheus.UnaryServerInterceptor),
+//			grpc.StreamInterceptor(grpc_prometheus.StreamServerInterceptor),
+//		}
+//		server = grpc.NewServer(opts...)
 type MetricsModule struct{}
 
 // ProvideGRPC implements container.GRPCProvider