Make it possible to call service.Init multiple times
This commit is contained in:
		
							
								
								
									
										15
									
								
								service.go
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								service.go
									
									
									
									
									
								
							| @@ -14,6 +14,8 @@ import ( | |||||||
|  |  | ||||||
| type service struct { | type service struct { | ||||||
| 	opts Options | 	opts Options | ||||||
|  |  | ||||||
|  | 	init chan bool | ||||||
| } | } | ||||||
|  |  | ||||||
| func newService(opts ...Option) Service { | func newService(opts ...Option) Service { | ||||||
| @@ -28,6 +30,7 @@ func newService(opts ...Option) Service { | |||||||
|  |  | ||||||
| 	return &service{ | 	return &service{ | ||||||
| 		opts: options, | 		opts: options, | ||||||
|  | 		init: make(chan bool), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -49,7 +52,18 @@ func (s *service) run(exit chan bool) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Init initialises options. Additionally it calls cmd.Init | ||||||
|  | // which parses command line flags. cmd.Init is only called | ||||||
|  | // on first Init. | ||||||
| func (s *service) Init(opts ...Option) { | func (s *service) Init(opts ...Option) { | ||||||
|  | 	// If <-s.init blocks, Init has not been called yet | ||||||
|  | 	// so we can call cmd.Init once. | ||||||
|  | 	select { | ||||||
|  | 	case <-s.init: | ||||||
|  | 	default: | ||||||
|  | 		// close init | ||||||
|  | 		close(s.init) | ||||||
|  |  | ||||||
| 		// We might get more command flags or the action here | 		// We might get more command flags or the action here | ||||||
| 		// This is pretty ugly, find a better way | 		// This is pretty ugly, find a better way | ||||||
| 		options := newOptions() | 		options := newOptions() | ||||||
| @@ -67,6 +81,7 @@ func (s *service) Init(opts ...Option) { | |||||||
| 			cmd.Client(&s.opts.Client), | 			cmd.Client(&s.opts.Client), | ||||||
| 			cmd.Server(&s.opts.Server), | 			cmd.Server(&s.opts.Server), | ||||||
| 		) | 		) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	// Update any options to override command flags | 	// Update any options to override command flags | ||||||
| 	for _, o := range opts { | 	for _, o := range opts { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user