# types

import "github.com/matzefriedrich/parsley/pkg/types"

# Index

  • Constants
  • Variables
  • func NewDependencyError(msg string) error
  • func NewReflectionError(msg string, initializers ...ParsleyErrorFunc) error
  • func NewRegistryError(msg string, initializers ...ParsleyErrorFunc) error
  • func NewResolverError(msg string, initializers ...ParsleyErrorFunc) error
  • type DependencyError
  • type DependencyInfo
  • type FunctionInfo
  • type FunctionParameterInfo
  • type LifetimeScope
  • type ModuleFunc
  • type NamedService
  • type ParsleyAggregateError
    • func (f ParsleyAggregateError) Error() string
    • func (f ParsleyAggregateError) Errors() []error
    • func (f ParsleyAggregateError) Is(err error) bool
  • type ParsleyError
    • func (f ParsleyError) Error() string
    • func (f ParsleyError) Is(err error) bool
    • func (f ParsleyError) Unwrap() error
  • type ParsleyErrorFunc
    • func ForServiceType(serviceType string) ParsleyErrorFunc
    • func WithAggregatedCause(errs ...error) ParsleyErrorFunc
    • func WithCause(err error) ParsleyErrorFunc
  • type ParsleyErrorWithServiceTypeName
  • type ReflectionError
  • type RegistryError
    • func (r *RegistryError) MatchesServiceType(name string) bool
    • func (r *RegistryError) ServiceTypeName(name string)
  • type Resolver
  • type ResolverError
    • func (r *ResolverError) ServiceTypeName(name string)
  • type ResolverOptionsFunc
  • type ServiceKey
    • func NewServiceKey(value string) ServiceKey
    • func (s ServiceKey) String() string
  • type ServiceRegistration
  • type ServiceRegistrationList
  • type ServiceRegistrationSetup
  • type ServiceRegistry
  • type ServiceRegistryAccessor
  • type ServiceType
    • func MakeServiceType[T any]() ServiceType
    • func ServiceTypeFrom(t reflect.Type) ServiceType

# Constants

const (
    ErrorRequiresFunctionValue               = "the given value is not function"
    ErrorCannotRegisterModule                = "failed to register module"
    ErrorTypeAlreadyRegistered               = "type already registered"
    ErrorServiceAlreadyLinkedWithAnotherList = "service already linked with another list"
    ErrorFailedToRegisterType                = "failed to register type"
)

const (
    ErrorServiceTypeNotRegistered               = "service type is not registered"
    ErrorRequiredServiceNotRegistered           = "required service type is not registered"
    ErrorCannotResolveService                   = "cannot resolve service"
    ErrorAmbiguousServiceInstancesResolved      = "the resolve operation resulted in multiple service instances"
    ErrorActivatorFunctionInvalidReturnType     = "activator function has an invalid return type"
    ErrorCircularDependencyDetected             = "circular dependency detected"
    ErrorCannotBuildDependencyGraph             = "failed to build dependency graph"
    ErrorInstanceCannotBeNil                    = "instance cannot be nil"
    ErrorServiceTypeMustBeInterface             = "service type must be an interface"
    ErrorCannotRegisterTypeWithResolverOptions  = "cannot register type with resolver options"
    ErrorCannotCreateInstanceOfUnregisteredType = "failed to create instance of unregistered type"
)

const (
    ErrorInstanceAlreadySet = "instance already set"
)

# Variables

var (

    // ErrRequiresFunctionValue indicates that the provided value is not a function.
    ErrRequiresFunctionValue = errors.New(ErrorRequiresFunctionValue)

    // ErrCannotRegisterModule indicates that the module registration process has failed.
    ErrCannotRegisterModule = errors.New(ErrorCannotRegisterModule)

    // ErrTypeAlreadyRegistered indicates that an attempt was made to register a type that is already registered.
    ErrTypeAlreadyRegistered = errors.New(ErrorTypeAlreadyRegistered)

    // ErrFailedToRegisterType indicates that the attempt to register a type has failed.
    ErrFailedToRegisterType = errors.New(ErrorFailedToRegisterType)
)

var (

    // ErrServiceTypeNotRegistered is returned when attempting to resolve a service type that has not been registered.
    ErrServiceTypeNotRegistered = errors.New(ErrorServiceTypeNotRegistered)

    // ErrRequiredServiceNotRegistered is returned when a required service type is not registered.
    ErrRequiredServiceNotRegistered = errors.New(ErrorRequiredServiceNotRegistered)

    // ErrActivatorFunctionInvalidReturnType is returned when an activator function has an invalid return type.
    ErrActivatorFunctionInvalidReturnType = errors.New(ErrorCannotResolveService)

    // ErrCannotBuildDependencyGraph is returned when the resolver fails to build a dependency graph due to missing dependencies or other issues.
    ErrCannotBuildDependencyGraph = errors.New(ErrorCannotBuildDependencyGraph)

    // ErrCircularDependencyDetected is returned when a circular dependency is detected during the resolution process.
    ErrCircularDependencyDetected = errors.New(ErrorCircularDependencyDetected)

    // ErrInstanceCannotBeNil is returned when an instance provided is nil, but a non-nil value is required.
    ErrInstanceCannotBeNil = errors.New(ErrorInstanceCannotBeNil)

    // ErrServiceTypeMustBeInterface is returned when a service type is not an interface.
    ErrServiceTypeMustBeInterface = errors.New(ErrorServiceTypeMustBeInterface)

    // ErrCannotRegisterTypeWithResolverOptions is returned when the resolver failed to register a type via resolver options.
    ErrCannotRegisterTypeWithResolverOptions = errors.New(ErrorCannotRegisterTypeWithResolverOptions)

    // ErrCannotCreateInstanceOfUnregisteredType is returned when the resolver fails to instantiate a type that has not been registered.
    ErrCannotCreateInstanceOfUnregisteredType = errors.New(ErrorCannotCreateInstanceOfUnregisteredType)
)

var (
    // ErrInstanceAlreadySet is returned when there is an attempt to set an instance that is already set.
    ErrInstanceAlreadySet = errors.New(ErrorInstanceAlreadySet)
)

# func NewDependencyError

func NewDependencyError(msg string) error

NewDependencyError creates a new DependencyError with the provided message.

# func NewReflectionError

func NewReflectionError(msg string, initializers ...ParsleyErrorFunc) error

NewReflectionError creates a new ReflectionError with a specified message and optional initializers.

# func NewRegistryError

func NewRegistryError(msg string, initializers ...ParsleyErrorFunc) error

NewRegistryError creates a new RegistryError with the given message and initializers to modify the error.

# func NewResolverError

func NewResolverError(msg string, initializers ...ParsleyErrorFunc) error

NewResolverError creates a new ResolverError with the provided message and applies optional ParsleyErrorFunc initializers.

# type DependencyError

DependencyError represents an error that occurs due to a missing or failed dependency. This error type encapsulates a ParsleyError.

type DependencyError struct {
    ParsleyError
}

# type DependencyInfo

DependencyInfo provides functionality to manage dependency information.

type DependencyInfo interface {
    // AddRequiredServiceInfo adds a child dependency to the current dependency info.
    AddRequiredServiceInfo(child DependencyInfo)

    // CreateInstance creates an instance of the service associated with this dependency info.
    CreateInstance() (interface{}, error)

    // Consumer returns the parent dependency for the current dependency info.
    Consumer() DependencyInfo

    // HasInstance checks if an instance has already been created for the dependency represented by the current DependencyInfo object.
    HasInstance() bool

    // Instance retrieves the created instance of the service associated with this dependency info.
    Instance() interface{}

    // Registration gets the service registration of the current dependency info.
    Registration() ServiceRegistration

    // RequiredServiceTypes gets the service types required by this dependency info.
    RequiredServiceTypes() []ServiceType

    // RequiredServices retrieves the instances of services required by this dependency info.
    RequiredServices() ([]interface{}, error)

    // ServiceTypeName gets the name of the service type associated with this dependency info.
    ServiceTypeName() string

    // SetInstance sets the instance for the current dependency info.
    SetInstance(instance interface{}) error
}

# type FunctionInfo

FunctionInfo Stores information about a service activator function. This interface supports the internal infrastructure.

type FunctionInfo interface {
    fmt.Stringer
    Name() string
    Parameters() []FunctionParameterInfo
    ReturnType() ServiceType
    ParameterTypes() []ServiceType
}

# type FunctionParameterInfo

type FunctionParameterInfo interface {
    fmt.Stringer
    Type() ServiceType
}

# type LifetimeScope

LifetimeScope represents the duration for which a service or object instance is retained.

type LifetimeScope uint

const (

    // LifetimeTransient represents a transient lifetime where a new instance is created each time it is requested.
    LifetimeTransient LifetimeScope = iota

    // LifetimeScoped represents a scoped lifetime where a single instance is created per scope.
    LifetimeScoped

    // LifetimeSingleton represents a single instance scope that persists for the lifetime of the application.
    LifetimeSingleton
)

# type ModuleFunc

ModuleFunc defines a function used to register services with the given service registry.

type ModuleFunc func(registry ServiceRegistry) error

# type NamedService

NamedService is a generic interface defining a service with a name and an activator function.

type NamedService[T any] interface {
    Name() string
    ActivatorFunc() any
}

# type ParsleyAggregateError

ParsleyAggregateError represents an aggregate of multiple errors.

type ParsleyAggregateError struct {
    Msg string
    // contains filtered or unexported fields
}

# func (ParsleyAggregateError) Error

func (f ParsleyAggregateError) Error() string

Error returns the message associated with the ParsleyAggregateError.

# func (ParsleyAggregateError) Errors

func (f ParsleyAggregateError) Errors() []error

Errors returns the slice of errors contained within ParsleyAggregateError.

# func (ParsleyAggregateError) Is

func (f ParsleyAggregateError) Is(err error) bool

Is checks if the given error is equivalent to any error within the ParsleyAggregateError.

# type ParsleyError

ParsleyError represents an error with an associated message and optional underlying cause.

type ParsleyError struct {
    Msg string
    // contains filtered or unexported fields
}

# func (ParsleyError) Error

func (f ParsleyError) Error() string

Error returns the message associated with the ParsleyError.

# func (ParsleyError) Is

func (f ParsleyError) Is(err error) bool

Is compares the current ParsleyError's message with another error's message to determine if they are the same.

# func (ParsleyError) Unwrap

func (f ParsleyError) Unwrap() error

Unwrap returns the underlying cause of the ParsleyError, allowing for error unwrapping functionality.

# type ParsleyErrorFunc

ParsleyErrorFunc is a function type that modifies a given error.

type ParsleyErrorFunc func(e error)

# func ForServiceType

func ForServiceType(serviceType string) ParsleyErrorFunc

ForServiceType creates a ParsleyErrorFunc that sets the service type name on errors that implement the ParsleyErrorWithServiceTypeName interface.

# func WithAggregatedCause

func WithAggregatedCause(errs ...error) ParsleyErrorFunc

WithAggregatedCause returns a ParsleyErrorFunc that sets an aggregated error cause with the provided errors.

# func WithCause

func WithCause(err error) ParsleyErrorFunc

WithCause wraps a given error within a ParsleyError.

# type ParsleyErrorWithServiceTypeName

ParsleyErrorWithServiceTypeName defines an interface for setting the service type name on errors.

type ParsleyErrorWithServiceTypeName interface {
    ServiceTypeName(name string)
}

# type ReflectionError

ReflectionError represents an error specifically related to reflection operations, extending ParsleyError.

type ReflectionError struct {
    ParsleyError
}

# type RegistryError

RegistryError represents an error that gets returned for failing registry operations.

type RegistryError struct {
    ParsleyError
    // contains filtered or unexported fields
}

# func (*RegistryError) MatchesServiceType

func (r *RegistryError) MatchesServiceType(name string) bool

MatchesServiceType checks if the service type name of the RegistryError matches the specified name.

# func (*RegistryError) ServiceTypeName

func (r *RegistryError) ServiceTypeName(name string)

ServiceTypeName sets the service type name of the RegistryError.

# type Resolver

Resolver provides methods to resolve registered services based on types.

type Resolver interface {

    // Resolve attempts to resolve all registered services of the specified ServiceType.
    Resolve(ctx context.Context, serviceType ServiceType) ([]interface{}, error)

    // ResolveWithOptions resolves services of the specified type using additional options and returns a list of resolved services or an error.
    ResolveWithOptions(ctx context.Context, serviceType ServiceType, options ...ResolverOptionsFunc) ([]interface{}, error)
}

# type ResolverError

ResolverError represents an error that gets returned for failing service resolver operations.

type ResolverError struct {
    ParsleyError
    // contains filtered or unexported fields
}

# func (*ResolverError) ServiceTypeName

func (r *ResolverError) ServiceTypeName(name string)

ServiceTypeName sets the service type name for the ResolverError instance.

# type ResolverOptionsFunc

ResolverOptionsFunc represents a function that configures a service registry used by the resolver.

type ResolverOptionsFunc func(registry ServiceRegistry) error

# type ServiceKey

ServiceKey represents a unique key for identifying services in the service registry.

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

# func NewServiceKey

func NewServiceKey(value string) ServiceKey

NewServiceKey creates a new ServiceKey with the given value.

# func (ServiceKey) String

func (s ServiceKey) String() string

String Gets the value of the current ServiceKey instance.

# type ServiceRegistration

ServiceRegistration represents a service registrations.

type ServiceRegistration interface {

    // Id Returns the unique identifier of the service registration.
    Id() uint64

    // InvokeActivator calls the activator function with the provided parameters and returns the resulting instance and any error.
    InvokeActivator(params ...interface{}) (interface{}, error)

    // IsSame checks if the provided ServiceRegistration equals the current ServiceRegistration.
    IsSame(other ServiceRegistration) bool

    // LifetimeScope returns the LifetimeScope associated with the service registration.
    LifetimeScope() LifetimeScope

    // RequiredServiceTypes returns a slice of ServiceType, containing all service types required by the service registration.
    RequiredServiceTypes() []ServiceType

    // ServiceType retrieves the type of the service being registered.
    ServiceType() ServiceType
}

# type ServiceRegistrationList

ServiceRegistrationList provides functionality to manage a list of service registrations. This interface supports internal infrastructure services.

type ServiceRegistrationList interface {

    // AddRegistration adds a new service registration to the list.
    AddRegistration(registration ServiceRegistrationSetup) error

    // Id returns the unique identifier of the service registration list.
    Id() uint64

    // Registrations returns a slice of ServiceRegistration, containing all registrations in the list.
    Registrations() []ServiceRegistration

    // IsEmpty checks if the service registration list contains any registrations.
    // It returns true if the list is empty, otherwise false.
    IsEmpty() bool
}

# type ServiceRegistrationSetup

ServiceRegistrationSetup extends ServiceRegistration and supports internal infrastructure services.

type ServiceRegistrationSetup interface {
    ServiceRegistration

    // SetId sets the unique identifier for the service registration. This method supports internal infrastructure and is not intended to be used by your code.
    SetId(id uint64) error
}

# type ServiceRegistry

ServiceRegistry provides methods to map service types to activator functions. The service registration organizes and stores the metadata required by the service resolver.

type ServiceRegistry interface {
    ServiceRegistryAccessor

    // CreateLinkedRegistry creates and returns a new ServiceRegistry instance linked to the current registry. A linked service registry is an empty service registry.
    CreateLinkedRegistry() ServiceRegistry

    // CreateScope creates and returns a scoped ServiceRegistry instance which inherits all service registrations from the current ServiceRegistry instance.
    CreateScope() ServiceRegistry

    // GetServiceRegistrations retrieves all service registrations.
    GetServiceRegistrations() ([]ServiceRegistration, error)

    // IsRegistered checks if a service of the specified ServiceType is registered in the service registry.
    IsRegistered(serviceType ServiceType) bool

    // Register registers a service with its activator function and defines its lifetime scope with the service registry.
    Register(activatorFunc any, scope LifetimeScope) error

    // RegisterModule registers one or more modules, encapsulated as ModuleFunc, with the service registry. A module is a logical unit of service registrations.
    RegisterModule(modules ...ModuleFunc) error
}

# type ServiceRegistryAccessor

ServiceRegistryAccessor provides methods to access and retrieve service registrations from the registry.

type ServiceRegistryAccessor interface {

    // TryGetServiceRegistrations attempts to retrieve all service registrations for the given service type.
    // Returns the service registration list and true if found, otherwise returns false.
    TryGetServiceRegistrations(serviceType ServiceType) (ServiceRegistrationList, bool)

    // TryGetSingleServiceRegistration attempts to retrieve a single service registration for the given service type.
    // Returns the service registration and true if found, otherwise returns false.
    TryGetSingleServiceRegistration(serviceType ServiceType) (ServiceRegistration, bool)
}

# type ServiceType

ServiceType represents a service type.

type ServiceType interface {

    // Name returns the name of the service type.
    Name() string

    // PackagePath returns the package path of the service type.
    PackagePath() string

    // ReflectedType returns the underlying reflect.Type representation of the service type.
    ReflectedType() reflect.Type

    // LookupKey retrieves the ServiceKey associated with the service type.
    LookupKey() ServiceKey
}

# func MakeServiceType

func MakeServiceType[T any]() ServiceType

MakeServiceType creates a ServiceType instance for the specified generic type T.

# func ServiceTypeFrom

func ServiceTypeFrom(t reflect.Type) ServiceType

ServiceTypeFrom creates a ServiceType from the given reflect.Type. Supports pointer, interface, function, slice, and struct types. The function panics, if t is of an unsupported kind is given.