discovery

package module
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 7, 2024 License: CC0-1.0 Imports: 7 Imported by: 0

README

discovery

Documentation

Index

Constants

View Source
const (
	// ErrItemNotFoundID represents a service that cannot be found because
	// there is no mapping, or existing service item
	ErrItemNotFoundID = "discovery/item/notfound"

	// ErrItemNotResolvedID represents a service that has a mapping but
	// failed to resolve
	ErrItemNotResolvedID = "discovery/item/resolve/failed"

	// ErrItemNotItemTypeID represent an item that does not implement
	// the specified item type
	ErrItemNotItemTypeID = "discovery/item/must-be-item-type"

	// ErrCircularResolveDependencyID indicates a circular dependency between
	// items
	ErrCircularResolveDependencyID = "discovery/item/resolve/circular"
)

Variables

View Source
var (
	ErrItemNotFound = errors.NewErrorTemplate(
		ErrItemNotFoundID,
		"item '%s' not found",
		http.StatusInternalServerError,
		false)

	ErrItemNotResolved = errors.NewErrorTemplate(
		ErrItemNotResolvedID,
		"item '%s' not resolved: %s",
		http.StatusInternalServerError,
		false)

	ErrItemNotItemType = errors.NewErrorTemplate(
		ErrItemNotItemTypeID,
		"item does not implement type %s",
		http.StatusInternalServerError,
		false)

	ErrCircularResolveDependency = errors.NewErrorTemplate(
		ErrCircularResolveDependencyID,
		"item type %s has a circular resolve dependency",
		http.StatusInternalServerError,
		false)
)
View Source
var ItemDiscoveryManagementType = reflect.TypeOf((*ItemDiscoveryManagement)(nil)).Elem()

ItemDiscoveryManagementType is the reflected type of ItemDiscoveryManagement

View Source
var ItemResolverType = reflect.TypeOf((*ItemResolver)(nil)).Elem()

ItemResolverType is the reflected type of ItemResolver

Functions

func AddItem

func AddItem(itemType reflect.Type, item interface{}) error

AddItem is a helper method for adding an item to default discovery

Notes
	If default discovery has not been assigned, it is created With
	a default resolver.

func GetItem

func GetItem[T any](d Discovery, itemType reflect.Type) (T, error)

func GetRequiredItem

func GetRequiredItem[T any](d Discovery, itemType reflect.Type) T

func InitializeDiscovery

func InitializeDiscovery() error

func Resolve

func Resolve[T any](d Discovery, mapping ResolverMapping) T

Types

type AOItemResolver

type AOItemResolver interface {
	GetAOMappings(itemType reflect.Type) ([]AOResolverMapping, bool)
	AddAOMapping(mapping AOResolverMapping)
	AddAOMappings(mapping []AOResolverMapping)
	WrapAO(d Discovery, itemType reflect.Type, item interface{}) (interface{}, error)
}

AOItemResolver provides the ability to add and retrieve AO mappings

type AOResolver

type AOResolver func(discovery Discovery, item interface{}) (interface{}, error)

AOResolver is the signature for a function that resolves a wrapper for another item

type AOResolverMapping

type AOResolverMapping struct {
	Type    reflect.Type
	Creator AOResolver
}

AOResolverMapping binds an item wrapper (AO) with a function that can instance it

type BaseItemResolver

type BaseItemResolver struct {
	// contains filtered or unexported fields
}

BaseItemResolver provides item creation mappings

func NewBaseItemResolver

func NewBaseItemResolver() *BaseItemResolver

NewBaseItemResolver creates an instance of BaseItemResolver

func (*BaseItemResolver) AddAOMapping

func (r *BaseItemResolver) AddAOMapping(mapping AOResolverMapping)

AddAOMapping adds an AOMapping to the AOItemResolver

func (*BaseItemResolver) AddAOMappings

func (r *BaseItemResolver) AddAOMappings(mappings []AOResolverMapping)

AddAOMappings adds a collection of AOMapping to the AOItemResolver

func (*BaseItemResolver) AddMapping

func (r *BaseItemResolver) AddMapping(mapping ResolverMapping)

AddMapping adds a ResolverMapping to the BaseItemResolver

func (*BaseItemResolver) AddMappings

func (r *BaseItemResolver) AddMappings(mappings []ResolverMapping)

AddMappings adds an [] of ResolverMapping's to the BaseItemResolver

func (*BaseItemResolver) AddMappingsVar

func (r *BaseItemResolver) AddMappingsVar(mappings ...ResolverMapping)

AddMappingsVar adds a variadic list of ResolverMapping's to the BaseItemResolver

func (*BaseItemResolver) GetAOMappings

func (r *BaseItemResolver) GetAOMappings(itemType reflect.Type) (result []AOResolverMapping, ok bool)

GetAOMappings returns an []AOMapping for itemType, if available

func (*BaseItemResolver) GetMapping

func (r *BaseItemResolver) GetMapping(itemType reflect.Type) (ResolverMapping, bool)

GetMapping returns a ResolverMapping for itemType, if available

func (*BaseItemResolver) ResolveItem

func (r *BaseItemResolver) ResolveItem(d Discovery, itemType reflect.Type) (interface{}, error)

ResolveItem returns an instance of itemType via its creator

func (*BaseItemResolver) ResolveMapping

func (r *BaseItemResolver) ResolveMapping(d Discovery, mapping ResolverMapping) (interface{}, error)

func (*BaseItemResolver) WrapAO

func (r *BaseItemResolver) WrapAO(d Discovery, itemType reflect.Type, item interface{}) (result interface{}, err error)

WrapAO wraps a core item with 0 or more AO items

type Discovery

type Discovery interface {
	HasItem(itemType reflect.Type) bool

	GetItem(itemType reflect.Type) (interface{}, error)
	GetRequiredItem(itemType reflect.Type) interface{}

	GetItemWithOptions(itemType reflect.Type, options ResolveOptions) (interface{}, error)
	GetRequiredItemWithOptions(itemType reflect.Type, options ResolveOptions) (interface{}, error)

	// WrapAO can be used to resolve an AO item wrapper when an item is NOT
	// automatically wrapped because the item is created directly and NOT via discovery
	WrapAO(itemType reflect.Type, item interface{}) (interface{}, error)
}

Discovery is the primary interface for finding/acquiring items via discovery

func CreateSuperDiscovery

func CreateSuperDiscovery(resolver ItemResolver) Discovery

CreateSuperDiscovery creates a new discovery that "super classes" the default discovery

Params
  resolver - optional ItemResolver

func GetDefaultDiscovery

func GetDefaultDiscovery() Discovery

GetDefaultDiscovery returns the value for the default discovery

func GetDefaultDiscoveryOrPanic

func GetDefaultDiscoveryOrPanic() Discovery

GetDefaultDiscoveryOrPanic returns the value for the default discovery and panics if the default discovery has not been set

func GetOrCreateDefaultDiscovery

func GetOrCreateDefaultDiscovery(resolver ItemResolver) Discovery

GetOrCreateDefaultDiscovery gets the current default discovery, creating it if it has not been set

Params
  resolver - optional ItemResolver

Notes
  This code avoids race conditions that could occur if two
  entities attempt to create the default discover concurrently

func NewDiscovery

func NewDiscovery(resolver ItemResolver) Discovery

NewDiscovery creates a new ItemDiscovery typed as Discovery

 Params
   resolver - optional ItemResolver

	Notes
		resolver is the item resolver used by discovery. if not specified, an
		instance of BaseItemResolver is created for use

		This constructor is more technically correct then
		NewItemDiscovery which returns *ItemDiscovery

func NewDiscoveryWithBase

func NewDiscoveryWithBase(baseD Discovery, resolver ItemResolver) Discovery

NewDiscoveryWithBase creates a new ItemDiscovery typed as Discovery with a base Discovery

 Params
   resolver - optional ItemResolver

	Notes
		resolver is the item resolver used by discovery. if not specified, an
		instance of BaseItemResolver is created for use

		This constructor is more technically correct then
		NewItemDiscoveryWithBase which returns *ItemDiscovery

func SetDefaultDiscovery

func SetDefaultDiscovery(d Discovery) Discovery

SetDefaultDiscovery stores the default discovery

type ItemDiscovery

type ItemDiscovery struct {
	// contains filtered or unexported fields
}

ItemDiscovery is the default implementation of Discovery and NamedDiscovery

func NewItemDiscovery

func NewItemDiscovery(resolver ItemResolver) *ItemDiscovery

NewItemDiscovery creates and instance of ItemDiscovery

 Params
   resolver - optional ItemResolver

	Notes
		resolver is the item resolver used by discovery. if not specified, an
		instance of BaseItemResolver is created for use

		This constructor is considered *deprecated*. Prefer NewDiscovery

func NewItemDiscoveryWithBase

func NewItemDiscoveryWithBase(baseD Discovery, resolver ItemResolver) *ItemDiscovery

NewItemDiscoveryWithBase creates and instance of ItemDiscovery with a base Discovery

Notes
	resolver is the item resolver used by discovery. if not specified, an
	instance of BaseItemResolver is created for use

	This constructor is considered *deprecated*. Prefer NewDiscoveryWithBase

func (*ItemDiscovery) AddItem

func (d *ItemDiscovery) AddItem(itemType reflect.Type, item interface{}) error

AddItem adds an item for discovery by type

func (*ItemDiscovery) GetItem

func (d *ItemDiscovery) GetItem(itemType reflect.Type) (interface{}, error)

func (*ItemDiscovery) GetItemWithOptions

func (d *ItemDiscovery) GetItemWithOptions(itemType reflect.Type, options ResolveOptions) (interface{}, error)

func (*ItemDiscovery) GetRequiredItem

func (d *ItemDiscovery) GetRequiredItem(itemType reflect.Type) interface{}

func (*ItemDiscovery) GetRequiredItemWithOptions

func (d *ItemDiscovery) GetRequiredItemWithOptions(itemType reflect.Type, options ResolveOptions) (interface{}, error)

func (*ItemDiscovery) GetResolver

func (d *ItemDiscovery) GetResolver() ItemResolver

GetResolver returns the resolver being used for Discovery

func (*ItemDiscovery) HasItem

func (d *ItemDiscovery) HasItem(itemType reflect.Type) bool

func (*ItemDiscovery) RemoveItem

func (d *ItemDiscovery) RemoveItem(itemType reflect.Type)

RemoveItem removes an item from discovery by type

func (*ItemDiscovery) WrapAO

func (d *ItemDiscovery) WrapAO(itemType reflect.Type, item interface{}) (interface{}, error)

WrapAO can be used to resolve an AO item wrapper when a item is NOT automatically wrapped because the item is created directly and NOT through discovery

type ItemDiscoveryManagement

type ItemDiscoveryManagement interface {
	GetResolver() ItemResolver

	AddItem(itemType reflect.Type, item interface{}) error
	RemoveItem(itemType reflect.Type)
}

ItemDiscoveryManagement provides the ability to add and remove discovery items

type ItemResolver

type ItemResolver interface {
	ResolveItem(d Discovery, itemType reflect.Type) (interface{}, error)
	ResolveMapping(d Discovery, mapping ResolverMapping) (interface{}, error)
	AddMapping(mapping ResolverMapping)
	AddMappingsVar(mappings ...ResolverMapping)
	AddMappings(mapping []ResolverMapping)
}

ItemResolver is used during discovery to attempt to resolve an item that

has not been previously resolved, or when the InstanceItem option is specified

func GetDefaultResolver

func GetDefaultResolver() ItemResolver

GetDefaultResolver returns the resolver for default discovery

type ResolveOptions

type ResolveOptions int

ResolveOptions represents flag values used by Discovery

const (
	// RoNone represents no resolve options
	RoNone ResolveOptions = 0
	// RoDontResolve is used to indicate that the item should not be automatically resolved
	RoDontResolve ResolveOptions = 1 << 0
	// RoInstanceItem is used to indicate that the item should be created for exclusive
	// use by the caller, and not shared with other callers
	RoInstanceItem ResolveOptions = 1 << 1
	// RoUseAOItem is used to indicate that a mapped AO implementation should be used to wrap
	// the requested item (if and only if the call results in a resolution)
	RoUseAOItem ResolveOptions = 1 << 2
)

type Resolver

type Resolver func(discovery Discovery) (interface{}, error)

Resolver is the signature for a function that resolves an item

type ResolverMapping

type ResolverMapping struct {
	Type    reflect.Type
	Creator Resolver
}

ResolverMapping binds an item type with a function tha can instance it

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL