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

55 lines
1.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}