forked from apps/featurer
55 lines
1.8 KiB
Go
55 lines
1.8 KiB
Go
package application
|
||
|
||
import (
|
||
"errors"
|
||
"fmt"
|
||
)
|
||
|
||
var (
|
||
// ErrServiceAlreadyRegistered appears when trying to register a service with already taken name.
|
||
ErrServiceAlreadyRegistered = errors.New("service already registered")
|
||
// ErrServiceNotRegistered appears when trying to get a registered service with unknown name.
|
||
ErrServiceNotRegistered = errors.New("unknown service")
|
||
)
|
||
|
||
// Service это интерфейс, которому должны соответствовать все сервисы, используемые в приложении.
|
||
type Service interface {
|
||
ConnectDependencies() error
|
||
GetName() string
|
||
Initialize() error
|
||
LaunchStartupTasks() error
|
||
Shutdown() error
|
||
}
|
||
|
||
// GetService возвращает сервис по имени, или же ошибку, если сервис не был зарегистрирован ранее.
|
||
func (a *Application) GetService(name string) (Service, error) {
|
||
a.servicesMutex.RLock()
|
||
service, found := a.services[name]
|
||
a.servicesMutex.RUnlock()
|
||
|
||
if !found {
|
||
return nil, fmt.Errorf("%w: get service '%s': %w", ErrApplication, name, ErrServiceNotRegistered)
|
||
}
|
||
|
||
return service, nil
|
||
}
|
||
|
||
// RegisterService регистрирует сервис, или возвращает ошибку, если сервис с таким именем уже был
|
||
// зарегистрирован ранее.
|
||
func (a *Application) RegisterService(service Service) error {
|
||
_, found := a.services[service.GetName()]
|
||
if found {
|
||
return fmt.Errorf("%w: register service '%s': %w", ErrApplication, service.GetName(), ErrServiceAlreadyRegistered)
|
||
}
|
||
|
||
if err := service.Initialize(); err != nil {
|
||
return fmt.Errorf("%w: initializing service '%s': %w", ErrApplication, service.GetName(), err)
|
||
}
|
||
|
||
a.servicesMutex.Lock()
|
||
a.services[service.GetName()] = service
|
||
a.servicesMutex.Unlock()
|
||
|
||
return nil
|
||
}
|