1
0
forked from apps/featurer
featurer/server/internal/application/service.go

55 lines
1.8 KiB
Go
Raw Normal View History

2024-10-12 13:04:09 +05:00
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
}