fix linting #4
@ -9,10 +9,12 @@ import (
|
||||
"github.com/unistack-org/micro/v3/api/resolver"
|
||||
)
|
||||
|
||||
// Resolver struct
|
||||
type Resolver struct {
|
||||
opts resolver.Options
|
||||
}
|
||||
|
||||
// Resolve func to resolve enndpoint
|
||||
func (r *Resolver) Resolve(req *http.Request, opts ...resolver.ResolveOption) (*resolver.Endpoint, error) {
|
||||
// parse options
|
||||
options := resolver.NewResolveOptions(opts...)
|
||||
@ -39,6 +41,7 @@ func (r *Resolver) String() string {
|
||||
return "grpc"
|
||||
}
|
||||
|
||||
// NewResolver is used to create new Resolver
|
||||
func NewResolver(opts ...resolver.Option) resolver.Resolver {
|
||||
return &Resolver{opts: resolver.NewOptions(opts...)}
|
||||
}
|
||||
|
@ -4,11 +4,13 @@ import (
|
||||
"github.com/unistack-org/micro/v3/registry"
|
||||
)
|
||||
|
||||
// Options struct
|
||||
type Options struct {
|
||||
Handler string
|
||||
ServicePrefix string
|
||||
}
|
||||
|
||||
// Option func
|
||||
type Option func(o *Options)
|
||||
|
||||
// WithHandler sets the handler being used
|
||||
@ -27,7 +29,7 @@ func WithServicePrefix(p string) Option {
|
||||
|
||||
// NewOptions returns new initialised options
|
||||
func NewOptions(opts ...Option) Options {
|
||||
var options Options
|
||||
options := Options{}
|
||||
for _, o := range opts {
|
||||
o(&options)
|
||||
}
|
||||
@ -51,13 +53,10 @@ func Domain(n string) ResolveOption {
|
||||
|
||||
// NewResolveOptions returns new initialised resolve options
|
||||
func NewResolveOptions(opts ...ResolveOption) ResolveOptions {
|
||||
var options ResolveOptions
|
||||
options := ResolveOptions{Domain: registry.DefaultDomain}
|
||||
for _, o := range opts {
|
||||
o(&options)
|
||||
}
|
||||
if len(options.Domain) == 0 {
|
||||
options.Domain = registry.DefaultDomain
|
||||
}
|
||||
|
||||
return options
|
||||
}
|
||||
|
@ -7,7 +7,9 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
ErrNotFound = errors.New("not found")
|
||||
// ErrNotFound returned when endpoint is not found
|
||||
ErrNotFound = errors.New("not found")
|
||||
// ErrInvalidPath returned on invalid path
|
||||
ErrInvalidPath = errors.New("invalid path")
|
||||
)
|
||||
|
||||
@ -19,7 +21,7 @@ type Resolver interface {
|
||||
|
||||
// Endpoint is the endpoint for a http request
|
||||
type Endpoint struct {
|
||||
// e.g greeter
|
||||
// Endpoint name e.g greeter
|
||||
Name string
|
||||
// HTTP Host e.g example.com
|
||||
Host string
|
||||
|
@ -23,6 +23,7 @@ type Options struct {
|
||||
Wrappers []Wrapper
|
||||
}
|
||||
|
||||
// NewOptions returns new Options
|
||||
func NewOptions(opts ...Option) Options {
|
||||
options := Options{}
|
||||
for _, o := range opts {
|
||||
|
@ -4,7 +4,7 @@ package broker
|
||||
import "context"
|
||||
|
||||
var (
|
||||
DefaultBroker Broker = &NoopBroker{opts: NewOptions()}
|
||||
DefaultBroker Broker = NewBroker()
|
||||
)
|
||||
|
||||
// Broker is an interface used for asynchronous messaging.
|
||||
|
@ -2,7 +2,7 @@ package broker
|
||||
|
||||
import "context"
|
||||
|
||||
type NoopBroker struct {
|
||||
type noopBroker struct {
|
||||
opts Options
|
||||
}
|
||||
|
||||
@ -11,7 +11,13 @@ type noopSubscriber struct {
|
||||
opts SubscribeOptions
|
||||
}
|
||||
|
||||
func (n *NoopBroker) Init(opts ...Option) error {
|
||||
// NewBroker returns new noop broker
|
||||
func NewBroker(opts ...Option) Broker {
|
||||
return &noopBroker{opts: NewOptions(opts...)}
|
||||
}
|
||||
|
||||
// Init initialize broker
|
||||
func (n *noopBroker) Init(opts ...Option) error {
|
||||
for _, o := range opts {
|
||||
o(&n.opts)
|
||||
}
|
||||
@ -19,48 +25,53 @@ func (n *NoopBroker) Init(opts ...Option) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopBroker) Options() Options {
|
||||
// Options returns broker Options
|
||||
func (n *noopBroker) Options() Options {
|
||||
return n.opts
|
||||
}
|
||||
|
||||
func (n *NoopBroker) Address() string {
|
||||
// Address returns broker address
|
||||
func (n *noopBroker) Address() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (n *NoopBroker) Connect(ctx context.Context) error {
|
||||
// Connect connects to broker
|
||||
func (n *noopBroker) Connect(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopBroker) Disconnect(ctx context.Context) error {
|
||||
// Disconnect disconnects from broker
|
||||
func (n *noopBroker) Disconnect(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopBroker) Publish(ctx context.Context, topic string, m *Message, opts ...PublishOption) error {
|
||||
// Publish publishes message to broker
|
||||
func (n *noopBroker) Publish(ctx context.Context, topic string, m *Message, opts ...PublishOption) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopBroker) Subscribe(ctx context.Context, topic string, h Handler, opts ...SubscribeOption) (Subscriber, error) {
|
||||
options := NewSubscribeOptions()
|
||||
|
||||
for _, o := range opts {
|
||||
o(&options)
|
||||
}
|
||||
|
||||
// Subscribe subscribes to broker topic
|
||||
func (n *noopBroker) Subscribe(ctx context.Context, topic string, h Handler, opts ...SubscribeOption) (Subscriber, error) {
|
||||
options := NewSubscribeOptions(opts...)
|
||||
return &noopSubscriber{topic: topic, opts: options}, nil
|
||||
}
|
||||
|
||||
func (n *NoopBroker) String() string {
|
||||
// String return broker string representation
|
||||
func (n *noopBroker) String() string {
|
||||
return "noop"
|
||||
}
|
||||
|
||||
// Options returns subscriber options
|
||||
func (n *noopSubscriber) Options() SubscribeOptions {
|
||||
return n.opts
|
||||
}
|
||||
|
||||
// TOpic returns subscriber topic
|
||||
func (n *noopSubscriber) Topic() string {
|
||||
return n.topic
|
||||
}
|
||||
|
||||
// Unsubscribe unsbscribes from broker topic
|
||||
func (n *noopSubscriber) Unsubscribe(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
@ -9,6 +9,7 @@ import (
|
||||
"github.com/unistack-org/micro/v3/registry"
|
||||
)
|
||||
|
||||
// Options struct
|
||||
type Options struct {
|
||||
Addrs []string
|
||||
Secure bool
|
||||
@ -27,6 +28,7 @@ type Options struct {
|
||||
Context context.Context
|
||||
}
|
||||
|
||||
// NewOptions create new Options
|
||||
func NewOptions(opts ...Option) Options {
|
||||
options := Options{
|
||||
Registry: registry.DefaultRegistry,
|
||||
@ -39,30 +41,34 @@ func NewOptions(opts ...Option) Options {
|
||||
return options
|
||||
}
|
||||
|
||||
// Context sets the context option
|
||||
func Context(ctx context.Context) Option {
|
||||
return func(o *Options) {
|
||||
o.Context = ctx
|
||||
}
|
||||
}
|
||||
|
||||
// PublishOptions struct
|
||||
type PublishOptions struct {
|
||||
// Other options for implementations of the interface
|
||||
// can be stored in a context
|
||||
Context context.Context
|
||||
}
|
||||
|
||||
// NewPublishOptions creates PublishOptions struct
|
||||
func NewPublishOptions(opts ...PublishOption) PublishOptions {
|
||||
opt := PublishOptions{
|
||||
options := PublishOptions{
|
||||
Context: context.Background(),
|
||||
}
|
||||
|
||||
for _, o := range opts {
|
||||
o(&opt)
|
||||
o(&options)
|
||||
}
|
||||
|
||||
return opt
|
||||
return options
|
||||
}
|
||||
|
||||
// SubscribeOptions struct
|
||||
type SubscribeOptions struct {
|
||||
// AutoAck ack messages if handler returns nil err
|
||||
AutoAck bool
|
||||
@ -80,30 +86,34 @@ type SubscribeOptions struct {
|
||||
Context context.Context
|
||||
}
|
||||
|
||||
// Option func
|
||||
type Option func(*Options)
|
||||
|
||||
// PublishOption func
|
||||
type PublishOption func(*PublishOptions)
|
||||
|
||||
// PublishContext set context
|
||||
// PublishContext sets the context
|
||||
func PublishContext(ctx context.Context) PublishOption {
|
||||
return func(o *PublishOptions) {
|
||||
o.Context = ctx
|
||||
}
|
||||
}
|
||||
|
||||
// SubscribeOption func
|
||||
type SubscribeOption func(*SubscribeOptions)
|
||||
|
||||
// NewSubscribeOptions creates new SubscribeOptions
|
||||
func NewSubscribeOptions(opts ...SubscribeOption) SubscribeOptions {
|
||||
opt := SubscribeOptions{
|
||||
options := SubscribeOptions{
|
||||
AutoAck: true,
|
||||
Context: context.Background(),
|
||||
}
|
||||
|
||||
for _, o := range opts {
|
||||
o(&opt)
|
||||
o(&options)
|
||||
}
|
||||
|
||||
return opt
|
||||
return options
|
||||
}
|
||||
|
||||
// Addrs sets the host addresses to be used by the broker
|
||||
@ -121,6 +131,7 @@ func Codec(c codec.Marshaler) Option {
|
||||
}
|
||||
}
|
||||
|
||||
// DisableAutoAck disables auto ack
|
||||
func DisableAutoAck() SubscribeOption {
|
||||
return func(o *SubscribeOptions) {
|
||||
o.AutoAck = false
|
||||
@ -151,6 +162,7 @@ func SubscribeErrorHandler(h Handler) SubscribeOption {
|
||||
}
|
||||
}
|
||||
|
||||
// Queue sets the subscribers sueue
|
||||
func Queue(name string) SubscribeOption {
|
||||
return func(o *SubscribeOptions) {
|
||||
o.Group = name
|
||||
@ -164,6 +176,7 @@ func SubscribeGroup(name string) SubscribeOption {
|
||||
}
|
||||
}
|
||||
|
||||
// Registry sets registry option
|
||||
func Registry(r registry.Registry) Option {
|
||||
return func(o *Options) {
|
||||
o.Registry = r
|
||||
|
@ -1,13 +1,15 @@
|
||||
package build
|
||||
|
||||
// Options struct
|
||||
type Options struct {
|
||||
// local path to download source
|
||||
Path string
|
||||
}
|
||||
|
||||
// Option func
|
||||
type Option func(o *Options)
|
||||
|
||||
// Local path for repository
|
||||
// Path is the Local path for repository
|
||||
func Path(p string) Option {
|
||||
return func(o *Options) {
|
||||
o.Path = p
|
||||
|
@ -7,6 +7,7 @@ import (
|
||||
"github.com/unistack-org/micro/v3/util/backoff"
|
||||
)
|
||||
|
||||
// BackoffFunc is the backoff call func
|
||||
type BackoffFunc func(ctx context.Context, req Request, attempts int) (time.Duration, error)
|
||||
|
||||
func exponentialBackoff(ctx context.Context, req Request, attempts int) (time.Duration, error) {
|
||||
|
@ -9,7 +9,7 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
DefaultClient Client = &NoopClient{opts: NewOptions()}
|
||||
DefaultClient Client = NewClient()
|
||||
)
|
||||
|
||||
// Client is the interface used to make requests to services.
|
||||
|
@ -11,7 +11,7 @@ import (
|
||||
"github.com/unistack-org/micro/v3/metadata"
|
||||
)
|
||||
|
||||
type NoopClient struct {
|
||||
type noopClient struct {
|
||||
opts Options
|
||||
}
|
||||
|
||||
@ -31,6 +31,11 @@ type noopRequest struct {
|
||||
stream bool
|
||||
}
|
||||
|
||||
// NewClient returns new noop client
|
||||
func NewClient(opts ...Option) Client {
|
||||
return &noopClient{opts: NewOptions(opts...)}
|
||||
}
|
||||
|
||||
func (n *noopRequest) Service() string {
|
||||
return n.service
|
||||
}
|
||||
@ -118,49 +123,41 @@ func (n *noopMessage) ContentType() string {
|
||||
return n.opts.ContentType
|
||||
}
|
||||
|
||||
func (n *NoopClient) Init(opts ...Option) error {
|
||||
func (n *noopClient) Init(opts ...Option) error {
|
||||
for _, o := range opts {
|
||||
o(&n.opts)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopClient) Options() Options {
|
||||
func (n *noopClient) Options() Options {
|
||||
return n.opts
|
||||
}
|
||||
|
||||
func (n *NoopClient) String() string {
|
||||
func (n *noopClient) String() string {
|
||||
return "noop"
|
||||
}
|
||||
|
||||
func (n *NoopClient) Call(ctx context.Context, req Request, rsp interface{}, opts ...CallOption) error {
|
||||
func (n *noopClient) Call(ctx context.Context, req Request, rsp interface{}, opts ...CallOption) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopClient) NewRequest(service, endpoint string, req interface{}, opts ...RequestOption) Request {
|
||||
func (n *noopClient) NewRequest(service, endpoint string, req interface{}, opts ...RequestOption) Request {
|
||||
return &noopRequest{}
|
||||
}
|
||||
|
||||
func (n *NoopClient) NewMessage(topic string, msg interface{}, opts ...MessageOption) Message {
|
||||
options := MessageOptions{}
|
||||
for _, o := range opts {
|
||||
o(&options)
|
||||
}
|
||||
|
||||
func (n *noopClient) NewMessage(topic string, msg interface{}, opts ...MessageOption) Message {
|
||||
options := NewMessageOptions(opts...)
|
||||
return &noopMessage{topic: topic, payload: msg, opts: options}
|
||||
}
|
||||
|
||||
func (n *NoopClient) Stream(ctx context.Context, req Request, opts ...CallOption) (Stream, error) {
|
||||
func (n *noopClient) Stream(ctx context.Context, req Request, opts ...CallOption) (Stream, error) {
|
||||
return &noopStream{}, nil
|
||||
}
|
||||
|
||||
func (n *NoopClient) Publish(ctx context.Context, p Message, opts ...PublishOption) error {
|
||||
func (n *noopClient) Publish(ctx context.Context, p Message, opts ...PublishOption) error {
|
||||
var body []byte
|
||||
|
||||
if err := n.opts.Broker.Connect(ctx); err != nil {
|
||||
return errors.InternalServerError("go.micro.client", err.Error())
|
||||
}
|
||||
|
||||
options := NewPublishOptions(opts...)
|
||||
|
||||
md, ok := metadata.FromContext(ctx)
|
||||
@ -208,11 +205,3 @@ func (n *NoopClient) Publish(ctx context.Context, p Message, opts ...PublishOpti
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func newClient(opts ...Option) Client {
|
||||
options := NewOptions()
|
||||
for _, o := range opts {
|
||||
o(&options)
|
||||
}
|
||||
return &NoopClient{opts: options}
|
||||
}
|
||||
|
@ -8,14 +8,13 @@ import (
|
||||
"testing"
|
||||
|
||||
rmemory "github.com/unistack-org/micro-registry-memory"
|
||||
"github.com/unistack-org/micro/v3/util/test"
|
||||
)
|
||||
|
||||
func TestFunction(t *testing.T) {
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(1)
|
||||
|
||||
r := rmemory.NewRegistry(rmemory.Services(test.Data))
|
||||
r := rmemory.NewRegistry()
|
||||
|
||||
// create service
|
||||
fn := NewFunction(
|
||||
|
@ -14,9 +14,11 @@ type metadataKey struct{}
|
||||
type Metadata map[string]string
|
||||
|
||||
var (
|
||||
// DefaultMetadataSize used when need to init new Metadata
|
||||
DefaultMetadataSize = 6
|
||||
)
|
||||
|
||||
// Get returns value from metadata by key
|
||||
func (md Metadata) Get(key string) (string, bool) {
|
||||
// fast path
|
||||
val, ok := md[key]
|
||||
@ -27,10 +29,12 @@ func (md Metadata) Get(key string) (string, bool) {
|
||||
return val, ok
|
||||
}
|
||||
|
||||
// Set is used to store value in metadata
|
||||
func (md Metadata) Set(key, val string) {
|
||||
md[textproto.CanonicalMIMEHeaderKey(key)] = val
|
||||
}
|
||||
|
||||
// Del is used to remove value from metadata
|
||||
func (md Metadata) Del(key string) {
|
||||
// fast path
|
||||
if _, ok := md[key]; ok {
|
||||
|
@ -8,6 +8,7 @@ import (
|
||||
"github.com/unistack-org/micro/v3/router"
|
||||
)
|
||||
|
||||
// Option func
|
||||
type Option func(*Options)
|
||||
|
||||
// Options configure network
|
||||
|
@ -1,31 +1,35 @@
|
||||
package transport
|
||||
|
||||
type NoopTransport struct {
|
||||
type noopTransport struct {
|
||||
opts Options
|
||||
}
|
||||
|
||||
func (t *NoopTransport) Init(opts ...Option) error {
|
||||
func NewTransport(opts ...Option) Transport {
|
||||
return &noopTransport{opts: NewOptions(opts...)}
|
||||
}
|
||||
|
||||
func (t *noopTransport) Init(opts ...Option) error {
|
||||
for _, o := range opts {
|
||||
o(&t.opts)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *NoopTransport) Options() Options {
|
||||
func (t *noopTransport) Options() Options {
|
||||
return t.opts
|
||||
}
|
||||
|
||||
func (t *NoopTransport) Dial(addr string, opts ...DialOption) (Client, error) {
|
||||
func (t *noopTransport) Dial(addr string, opts ...DialOption) (Client, error) {
|
||||
options := NewDialOptions(opts...)
|
||||
return &noopClient{opts: options}, nil
|
||||
}
|
||||
|
||||
func (t *NoopTransport) Listen(addr string, opts ...ListenOption) (Listener, error) {
|
||||
func (t *noopTransport) Listen(addr string, opts ...ListenOption) (Listener, error) {
|
||||
options := NewListenOptions(opts...)
|
||||
return &noopListener{opts: options}, nil
|
||||
}
|
||||
|
||||
func (t *NoopTransport) String() string {
|
||||
func (t *noopTransport) String() string {
|
||||
return "noop"
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,8 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
DefaultTransport Transport = &NoopTransport{opts: NewOptions()}
|
||||
// DefaultTransport is the global default transport
|
||||
DefaultTransport Transport = NewTransport()
|
||||
)
|
||||
|
||||
// Transport is an interface which is used for communication between
|
||||
|
@ -15,6 +15,7 @@ var (
|
||||
DefaultToken = "go.micro.tunnel"
|
||||
)
|
||||
|
||||
// Option func
|
||||
type Option func(*Options)
|
||||
|
||||
// Options provides network configuration options
|
||||
@ -33,8 +34,10 @@ type Options struct {
|
||||
Logger logger.Logger
|
||||
}
|
||||
|
||||
// DialOption func
|
||||
type DialOption func(*DialOptions)
|
||||
|
||||
// DialOptions provides dial options
|
||||
type DialOptions struct {
|
||||
// Link specifies the link to use
|
||||
Link string
|
||||
@ -46,8 +49,10 @@ type DialOptions struct {
|
||||
Timeout time.Duration
|
||||
}
|
||||
|
||||
// ListenOption func
|
||||
type ListenOption func(*ListenOptions)
|
||||
|
||||
// ListenOptions provides listen options
|
||||
type ListenOptions struct {
|
||||
// specify mode of the session
|
||||
Mode Mode
|
||||
@ -55,7 +60,7 @@ type ListenOptions struct {
|
||||
Timeout time.Duration
|
||||
}
|
||||
|
||||
// The tunnel id
|
||||
// Id sets the tunnel id
|
||||
func Id(id string) Option {
|
||||
return func(o *Options) {
|
||||
o.Id = id
|
||||
@ -69,7 +74,7 @@ func Logger(l logger.Logger) Option {
|
||||
}
|
||||
}
|
||||
|
||||
// The tunnel address
|
||||
// Address sets the tunnel address
|
||||
func Address(a string) Option {
|
||||
return func(o *Options) {
|
||||
o.Address = a
|
||||
@ -97,23 +102,21 @@ func Transport(t transport.Transport) Option {
|
||||
}
|
||||
}
|
||||
|
||||
// Listen options
|
||||
// ListenMode option
|
||||
func ListenMode(m Mode) ListenOption {
|
||||
return func(o *ListenOptions) {
|
||||
o.Mode = m
|
||||
}
|
||||
}
|
||||
|
||||
// Timeout for reads and writes on the listener session
|
||||
// ListenTimeout for reads and writes on the listener session
|
||||
func ListenTimeout(t time.Duration) ListenOption {
|
||||
return func(o *ListenOptions) {
|
||||
o.Timeout = t
|
||||
}
|
||||
}
|
||||
|
||||
// Dial options
|
||||
|
||||
// Dial multicast sets the multicast option to send only to those mapped
|
||||
// DialMode multicast sets the multicast option to send only to those mapped
|
||||
func DialMode(m Mode) DialOption {
|
||||
return func(o *DialOptions) {
|
||||
o.Mode = m
|
||||
@ -144,10 +147,14 @@ func DialWait(b bool) DialOption {
|
||||
}
|
||||
|
||||
// DefaultOptions returns router default options
|
||||
func DefaultOptions() Options {
|
||||
return Options{
|
||||
func NewOptions(opts ...Option) Options {
|
||||
options := Options{
|
||||
Id: uuid.New().String(),
|
||||
Address: DefaultAddress,
|
||||
Token: DefaultToken,
|
||||
}
|
||||
for _, o := range opts {
|
||||
o(&options)
|
||||
}
|
||||
return options
|
||||
}
|
||||
|
@ -93,7 +93,7 @@ func NewTransport(opts ...transport.Option) transport.Transport {
|
||||
return t
|
||||
}
|
||||
|
||||
// WithTransport sets the internal tunnel
|
||||
// WithTunnel sets the internal tunnel
|
||||
func WithTunnel(t tunnel.Tunnel) transport.Option {
|
||||
return func(o *transport.Options) {
|
||||
if o.Context == nil {
|
||||
|
@ -49,6 +49,7 @@ type Options struct {
|
||||
Context context.Context
|
||||
}
|
||||
|
||||
// NewOptions returns new Options filled with defaults and overrided by provided opts
|
||||
func NewOptions(opts ...Option) Options {
|
||||
options := Options{
|
||||
Context: context.Background(),
|
||||
@ -73,6 +74,7 @@ func NewOptions(opts ...Option) Options {
|
||||
return options
|
||||
}
|
||||
|
||||
// Option func
|
||||
type Option func(*Options)
|
||||
|
||||
// Broker to be used for service
|
||||
|
@ -6,6 +6,7 @@ import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Extract *Value from reflect.Type
|
||||
func ExtractValue(v reflect.Type, d int) *Value {
|
||||
if d == 3 {
|
||||
return nil
|
||||
@ -59,6 +60,7 @@ func ExtractValue(v reflect.Type, d int) *Value {
|
||||
return arg
|
||||
}
|
||||
|
||||
// ExtractEndpoint extract *Endpoint from reflect.Method
|
||||
func ExtractEndpoint(method reflect.Method) *Endpoint {
|
||||
if method.PkgPath != "" {
|
||||
return nil
|
||||
@ -104,6 +106,7 @@ func ExtractEndpoint(method reflect.Method) *Endpoint {
|
||||
return ep
|
||||
}
|
||||
|
||||
// ExtractSubValue exctact *Value from reflect.Type
|
||||
func ExtractSubValue(typ reflect.Type) *Value {
|
||||
var reqType reflect.Type
|
||||
switch typ.NumIn() {
|
||||
|
@ -5,55 +5,64 @@ import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type NoopRegistry struct {
|
||||
type noopRegistry struct {
|
||||
opts Options
|
||||
}
|
||||
|
||||
func (n *NoopRegistry) Init(opts ...Option) error {
|
||||
// Init initialize registry
|
||||
func (n *noopRegistry) Init(opts ...Option) error {
|
||||
for _, o := range opts {
|
||||
o(&n.opts)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopRegistry) Options() Options {
|
||||
// Options returns options struct
|
||||
func (n *noopRegistry) Options() Options {
|
||||
return n.opts
|
||||
}
|
||||
|
||||
func (n *NoopRegistry) Connect(ctx context.Context) error {
|
||||
// Connect opens connection to registry
|
||||
func (n *noopRegistry) Connect(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopRegistry) Disconnect(ctx context.Context) error {
|
||||
// Disconnect close connection to registry
|
||||
func (n *noopRegistry) Disconnect(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopRegistry) Register(*Service, ...RegisterOption) error {
|
||||
// Register registers service
|
||||
func (n *noopRegistry) Register(*Service, ...RegisterOption) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopRegistry) Deregister(*Service, ...DeregisterOption) error {
|
||||
// Deregister deregisters service
|
||||
func (n *noopRegistry) Deregister(*Service, ...DeregisterOption) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopRegistry) GetService(string, ...GetOption) ([]*Service, error) {
|
||||
// GetService returns servive info
|
||||
func (n *noopRegistry) GetService(string, ...GetOption) ([]*Service, error) {
|
||||
return []*Service{}, nil
|
||||
}
|
||||
|
||||
func (n *NoopRegistry) ListServices(...ListOption) ([]*Service, error) {
|
||||
// ListServices listing services
|
||||
func (n *noopRegistry) ListServices(...ListOption) ([]*Service, error) {
|
||||
return []*Service{}, nil
|
||||
}
|
||||
|
||||
func (n *NoopRegistry) Watch(...WatchOption) (Watcher, error) {
|
||||
// Watch is used to watch for service changes
|
||||
func (n *noopRegistry) Watch(...WatchOption) (Watcher, error) {
|
||||
return nil, fmt.Errorf("not implemented")
|
||||
}
|
||||
|
||||
func (n *NoopRegistry) String() string {
|
||||
// String returns registry string representation
|
||||
func (n *noopRegistry) String() string {
|
||||
return "noop"
|
||||
}
|
||||
|
||||
// NewRegistry returns a new noop registry
|
||||
func NewRegistry(opts ...Option) Registry {
|
||||
options := NewOptions(opts...)
|
||||
return &NoopRegistry{opts: options}
|
||||
return &noopRegistry{opts: NewOptions(opts...)}
|
||||
}
|
||||
|
@ -14,6 +14,7 @@ const (
|
||||
)
|
||||
|
||||
var (
|
||||
// DefaultRegistry is the global default registry
|
||||
DefaultRegistry Registry = NewRegistry()
|
||||
// ErrNotFound returned when GetService is called and no services found
|
||||
ErrNotFound = errors.New("service not found")
|
||||
|
@ -6,6 +6,7 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
// DefaultRouter is the global default router
|
||||
DefaultRouter Router
|
||||
// DefaultNetwork is default micro network
|
||||
DefaultNetwork = "micro"
|
||||
|
@ -7,6 +7,7 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
// ErrAlreadyExists error
|
||||
ErrAlreadyExists = errors.New("already exists")
|
||||
)
|
||||
|
||||
|
@ -6,11 +6,13 @@ import (
|
||||
|
||||
type serverKey struct{}
|
||||
|
||||
// FromContext returns Server from context
|
||||
func FromContext(ctx context.Context) (Server, bool) {
|
||||
c, ok := ctx.Value(serverKey{}).(Server)
|
||||
return c, ok
|
||||
}
|
||||
|
||||
// NewContext stores Server to context
|
||||
func NewContext(ctx context.Context, s Server) context.Context {
|
||||
return context.WithValue(ctx, serverKey{}, s)
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ const (
|
||||
defaultContentType = "application/json"
|
||||
)
|
||||
|
||||
type NoopServer struct {
|
||||
type noopServer struct {
|
||||
h Handler
|
||||
opts Options
|
||||
rsvc *registry.Service
|
||||
@ -45,7 +45,12 @@ type NoopServer struct {
|
||||
sync.RWMutex
|
||||
}
|
||||
|
||||
func (n *NoopServer) newCodec(contentType string) (codec.NewCodec, error) {
|
||||
// NewServer returns new noop server
|
||||
func NewServer(opts ...Option) Server {
|
||||
return &noopServer{opts: NewOptions(opts...)}
|
||||
}
|
||||
|
||||
func (n *noopServer) newCodec(contentType string) (codec.NewCodec, error) {
|
||||
if cf, ok := n.opts.Codecs[contentType]; ok {
|
||||
return cf, nil
|
||||
}
|
||||
@ -55,12 +60,12 @@ func (n *NoopServer) newCodec(contentType string) (codec.NewCodec, error) {
|
||||
return nil, fmt.Errorf("Unsupported Content-Type: %s", contentType)
|
||||
}
|
||||
|
||||
func (n *NoopServer) Handle(handler Handler) error {
|
||||
func (n *noopServer) Handle(handler Handler) error {
|
||||
n.h = handler
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopServer) Subscribe(sb Subscriber) error {
|
||||
func (n *noopServer) Subscribe(sb Subscriber) error {
|
||||
sub, ok := sb.(*subscriber)
|
||||
if !ok {
|
||||
return fmt.Errorf("invalid subscriber: expected *subscriber")
|
||||
@ -84,15 +89,15 @@ func (n *NoopServer) Subscribe(sb Subscriber) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopServer) NewHandler(h interface{}, opts ...HandlerOption) Handler {
|
||||
func (n *noopServer) NewHandler(h interface{}, opts ...HandlerOption) Handler {
|
||||
return newRpcHandler(h, opts...)
|
||||
}
|
||||
|
||||
func (n *NoopServer) NewSubscriber(topic string, sb interface{}, opts ...SubscriberOption) Subscriber {
|
||||
func (n *noopServer) NewSubscriber(topic string, sb interface{}, opts ...SubscriberOption) Subscriber {
|
||||
return newSubscriber(topic, sb, opts...)
|
||||
}
|
||||
|
||||
func (n *NoopServer) Init(opts ...Option) error {
|
||||
func (n *noopServer) Init(opts ...Option) error {
|
||||
for _, o := range opts {
|
||||
o(&n.opts)
|
||||
}
|
||||
@ -110,15 +115,15 @@ func (n *NoopServer) Init(opts ...Option) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopServer) Options() Options {
|
||||
func (n *noopServer) Options() Options {
|
||||
return n.opts
|
||||
}
|
||||
|
||||
func (n *NoopServer) String() string {
|
||||
func (n *noopServer) String() string {
|
||||
return "noop"
|
||||
}
|
||||
|
||||
func (n *NoopServer) Register() error {
|
||||
func (n *noopServer) Register() error {
|
||||
n.RLock()
|
||||
rsvc := n.rsvc
|
||||
config := n.opts
|
||||
@ -233,7 +238,7 @@ func (n *NoopServer) Register() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopServer) Deregister() error {
|
||||
func (n *noopServer) Deregister() error {
|
||||
var err error
|
||||
|
||||
n.RLock()
|
||||
@ -293,7 +298,7 @@ func (n *NoopServer) Deregister() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopServer) Start() error {
|
||||
func (n *noopServer) Start() error {
|
||||
n.RLock()
|
||||
if n.started {
|
||||
n.RUnlock()
|
||||
@ -433,7 +438,7 @@ func (n *NoopServer) Start() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopServer) Stop() error {
|
||||
func (n *noopServer) Stop() error {
|
||||
n.RLock()
|
||||
if !n.started {
|
||||
n.RUnlock()
|
||||
|
@ -85,7 +85,7 @@ func NewOptions(opts ...Option) Options {
|
||||
return options
|
||||
}
|
||||
|
||||
// Server name
|
||||
// Name sets the server name option
|
||||
func Name(n string) Option {
|
||||
return func(o *Options) {
|
||||
o.Name = n
|
||||
@ -99,7 +99,7 @@ func Namespace(n string) Option {
|
||||
}
|
||||
}
|
||||
|
||||
// Logger
|
||||
// Logger sets the logger option
|
||||
func Logger(l logger.Logger) Option {
|
||||
return func(o *Options) {
|
||||
o.Logger = l
|
||||
@ -127,7 +127,7 @@ func Address(a string) Option {
|
||||
}
|
||||
}
|
||||
|
||||
// The address to advertise for discovery - host:port
|
||||
// Advertise the address to advertise for discovery - host:port
|
||||
func Advertise(a string) Option {
|
||||
return func(o *Options) {
|
||||
o.Advertise = a
|
||||
@ -199,14 +199,14 @@ func RegisterCheck(fn func(context.Context) error) Option {
|
||||
}
|
||||
}
|
||||
|
||||
// Register the service with a TTL
|
||||
// RegisterTTL registers service with a TTL
|
||||
func RegisterTTL(t time.Duration) Option {
|
||||
return func(o *Options) {
|
||||
o.RegisterTTL = t
|
||||
}
|
||||
}
|
||||
|
||||
// Register the service with at interval
|
||||
// RegisterInterval registers service with at interval
|
||||
func RegisterInterval(t time.Duration) Option {
|
||||
return func(o *Options) {
|
||||
o.RegisterInterval = t
|
||||
@ -250,28 +250,31 @@ func Wait(wg *sync.WaitGroup) Option {
|
||||
}
|
||||
}
|
||||
|
||||
// Adds a handler Wrapper to a list of options passed into the server
|
||||
// WrapHandler adds a handler Wrapper to a list of options passed into the server
|
||||
func WrapHandler(w HandlerWrapper) Option {
|
||||
return func(o *Options) {
|
||||
o.HdlrWrappers = append(o.HdlrWrappers, w)
|
||||
}
|
||||
}
|
||||
|
||||
// Adds a subscriber Wrapper to a list of options passed into the server
|
||||
// WrapSubscriber adds a subscriber Wrapper to a list of options passed into the server
|
||||
func WrapSubscriber(w SubscriberWrapper) Option {
|
||||
return func(o *Options) {
|
||||
o.SubWrappers = append(o.SubWrappers, w)
|
||||
}
|
||||
}
|
||||
|
||||
// HandlerOption func
|
||||
type HandlerOption func(*HandlerOptions)
|
||||
|
||||
// HandlerOptions struct
|
||||
type HandlerOptions struct {
|
||||
Internal bool
|
||||
Metadata map[string]map[string]string
|
||||
Context context.Context
|
||||
}
|
||||
|
||||
// NewHandlerOptions creates new HandlerOptions
|
||||
func NewHandlerOptions(opts ...HandlerOption) HandlerOptions {
|
||||
options := HandlerOptions{
|
||||
Context: context.Background(),
|
||||
@ -284,8 +287,10 @@ func NewHandlerOptions(opts ...HandlerOption) HandlerOptions {
|
||||
return options
|
||||
}
|
||||
|
||||
// SubscriberOption func
|
||||
type SubscriberOption func(*SubscriberOptions)
|
||||
|
||||
// SubscriberOptions struct
|
||||
type SubscriberOptions struct {
|
||||
// AutoAck defaults to true. When a handler returns
|
||||
// with a nil error the message is acked.
|
||||
@ -295,6 +300,7 @@ type SubscriberOptions struct {
|
||||
Context context.Context
|
||||
}
|
||||
|
||||
// NewSubscriberOptions create new SubscriberOptions
|
||||
func NewSubscriberOptions(opts ...SubscriberOption) SubscriberOptions {
|
||||
options := SubscriberOptions{
|
||||
AutoAck: true,
|
||||
@ -316,7 +322,7 @@ func EndpointMetadata(name string, md map[string]string) HandlerOption {
|
||||
}
|
||||
}
|
||||
|
||||
// Internal Handler options specifies that a handler is not advertised
|
||||
// InternalHandler options specifies that a handler is not advertised
|
||||
// to the discovery system. In the future this may also limit request
|
||||
// to the internal network or authorised user.
|
||||
func InternalHandler(b bool) HandlerOption {
|
||||
@ -325,7 +331,7 @@ func InternalHandler(b bool) HandlerOption {
|
||||
}
|
||||
}
|
||||
|
||||
// Internal Subscriber options specifies that a subscriber is not advertised
|
||||
// InternalSubscriber options specifies that a subscriber is not advertised
|
||||
// to the discovery system.
|
||||
func InternalSubscriber(b bool) SubscriberOption {
|
||||
return func(o *SubscriberOptions) {
|
||||
@ -341,7 +347,7 @@ func DisableAutoAck() SubscriberOption {
|
||||
}
|
||||
}
|
||||
|
||||
// Shared queue name distributed messages across subscribers
|
||||
// SubscriberQueue sets the shared queue name distributed messages across subscribers
|
||||
func SubscriberQueue(n string) SubscriberOption {
|
||||
return func(o *SubscriberOptions) {
|
||||
o.Queue = n
|
||||
|
@ -52,6 +52,7 @@ var (
|
||||
}
|
||||
)
|
||||
|
||||
// NewRegistryService returns *registry.Service from Server
|
||||
func NewRegistryService(s Server) (*registry.Service, error) {
|
||||
opts := s.Options()
|
||||
|
||||
|
@ -11,7 +11,7 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
DefaultServer Server = &NoopServer{opts: NewOptions()}
|
||||
DefaultServer Server = NewServer()
|
||||
)
|
||||
|
||||
// Server is a simple micro server abstraction
|
||||
|
@ -59,6 +59,7 @@ func isExportedOrBuiltinType(t reflect.Type) bool {
|
||||
return isExported(t.Name()) || t.PkgPath() == ""
|
||||
}
|
||||
|
||||
// ValidateSubscriber func
|
||||
func ValidateSubscriber(sub Subscriber) error {
|
||||
typ := reflect.TypeOf(sub.Subscriber())
|
||||
var argType reflect.Type
|
||||
@ -184,7 +185,7 @@ func newSubscriber(topic string, sub interface{}, opts ...SubscriberOption) Subs
|
||||
}
|
||||
}
|
||||
|
||||
func (n *NoopServer) createSubHandler(sb *subscriber, opts Options) broker.Handler {
|
||||
func (n *noopServer) createSubHandler(sb *subscriber, opts Options) broker.Handler {
|
||||
return func(p broker.Event) (err error) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
|
@ -2,45 +2,58 @@ package store
|
||||
|
||||
import "context"
|
||||
|
||||
type NoopStore struct {
|
||||
type noopStore struct {
|
||||
opts Options
|
||||
}
|
||||
|
||||
func (n *NoopStore) Init(opts ...Option) error {
|
||||
func NewStore(opts ...Option) Store {
|
||||
return &noopStore{opts: NewOptions(opts...)}
|
||||
}
|
||||
|
||||
// Init initialize store
|
||||
func (n *noopStore) Init(opts ...Option) error {
|
||||
for _, o := range opts {
|
||||
o(&n.opts)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopStore) Options() Options {
|
||||
// Options returns Options struct
|
||||
func (n *noopStore) Options() Options {
|
||||
return n.opts
|
||||
}
|
||||
|
||||
func (n *NoopStore) String() string {
|
||||
// String returns string representation
|
||||
func (n *noopStore) String() string {
|
||||
return "noop"
|
||||
}
|
||||
|
||||
func (n *NoopStore) Read(ctx context.Context, key string, opts ...ReadOption) ([]*Record, error) {
|
||||
// Read reads store value by key
|
||||
func (n *noopStore) Read(ctx context.Context, key string, opts ...ReadOption) ([]*Record, error) {
|
||||
return []*Record{}, nil
|
||||
}
|
||||
|
||||
func (n *NoopStore) Write(ctx context.Context, r *Record, opts ...WriteOption) error {
|
||||
// Write writes store record
|
||||
func (n *noopStore) Write(ctx context.Context, r *Record, opts ...WriteOption) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopStore) Delete(ctx context.Context, key string, opts ...DeleteOption) error {
|
||||
// Delete removes store value by key
|
||||
func (n *noopStore) Delete(ctx context.Context, key string, opts ...DeleteOption) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopStore) List(ctx context.Context, opts ...ListOption) ([]string, error) {
|
||||
// List lists store
|
||||
func (n *noopStore) List(ctx context.Context, opts ...ListOption) ([]string, error) {
|
||||
return []string{}, nil
|
||||
}
|
||||
|
||||
func (n *NoopStore) Connect(ctx context.Context) error {
|
||||
// Connect connects to store
|
||||
func (n *noopStore) Connect(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *NoopStore) Disconnect(ctx context.Context) error {
|
||||
// Disconnect disconnects from store
|
||||
func (n *noopStore) Disconnect(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
@ -10,14 +10,16 @@ import (
|
||||
|
||||
var (
|
||||
// ErrNotFound is returned when a key doesn't exist
|
||||
ErrNotFound = errors.New("not found")
|
||||
DefaultStore Store = &NoopStore{opts: NewOptions()}
|
||||
ErrNotFound = errors.New("not found")
|
||||
// DefaultStore is the global default store
|
||||
DefaultStore Store = NewStore()
|
||||
)
|
||||
|
||||
// Store is a data storage interface
|
||||
type Store interface {
|
||||
// Init initialises the store. It must perform any required setup on the backing storage implementation and check that it is ready for use, returning any errors.
|
||||
Init(opts ...Option) error
|
||||
// Connect is used when store needs to be connected
|
||||
Connect(ctx context.Context) error
|
||||
// Options allows you to view the current options.
|
||||
Options() Options
|
||||
|
@ -1,10 +1,12 @@
|
||||
package tracer
|
||||
|
||||
// Options struct
|
||||
type Options struct {
|
||||
// Size is the size of ring buffer
|
||||
Size int
|
||||
}
|
||||
|
||||
// Option func
|
||||
type Option func(o *Options)
|
||||
|
||||
type ReadOptions struct {
|
||||
@ -12,9 +14,10 @@ type ReadOptions struct {
|
||||
Trace string
|
||||
}
|
||||
|
||||
// ReadOption func
|
||||
type ReadOption func(o *ReadOptions)
|
||||
|
||||
// Read the given trace
|
||||
// ReadTracer read the given trace
|
||||
func ReadTrace(t string) ReadOption {
|
||||
return func(o *ReadOptions) {
|
||||
o.Trace = t
|
||||
|
@ -2,12 +2,15 @@ package http
|
||||
|
||||
import "github.com/unistack-org/micro/v3/router"
|
||||
|
||||
// Options struct
|
||||
type Options struct {
|
||||
Router router.Router
|
||||
}
|
||||
|
||||
// Option func
|
||||
type Option func(*Options)
|
||||
|
||||
// WithRouter sets the router.Router option
|
||||
func WithRouter(r router.Router) Option {
|
||||
return func(o *Options) {
|
||||
o.Router = r
|
||||
|
@ -1,13 +0,0 @@
|
||||
package signal
|
||||
|
||||
import (
|
||||
"os"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
// ShutDownSignals returns all the signals that are being watched for to shut down services.
|
||||
func Shutdown() []os.Signal {
|
||||
return []os.Signal{
|
||||
syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGKILL,
|
||||
}
|
||||
}
|
@ -1,47 +0,0 @@
|
||||
package test
|
||||
|
||||
import (
|
||||
"github.com/unistack-org/micro/v3/registry"
|
||||
)
|
||||
|
||||
var (
|
||||
// mock registry data
|
||||
Data = map[string][]*registry.Service{
|
||||
"foo": {
|
||||
{
|
||||
Name: "foo",
|
||||
Version: "1.0.0",
|
||||
Nodes: []*registry.Node{
|
||||
{
|
||||
Id: "foo-1.0.0-123",
|
||||
Address: "localhost:9999",
|
||||
},
|
||||
{
|
||||
Id: "foo-1.0.0-321",
|
||||
Address: "localhost:9999",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "foo",
|
||||
Version: "1.0.1",
|
||||
Nodes: []*registry.Node{
|
||||
{
|
||||
Id: "foo-1.0.1-321",
|
||||
Address: "localhost:6666",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "foo",
|
||||
Version: "1.0.3",
|
||||
Nodes: []*registry.Node{
|
||||
{
|
||||
Id: "foo-1.0.3-345",
|
||||
Address: "localhost:8888",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
Loading…
x
Reference in New Issue
Block a user