kernel.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Package kernel -- объект ядра прилоэжения
  2. //
  3. // Содержит базовый функционал сервиса
  4. package kernel
  5. import (
  6. "context"
  7. "fmt"
  8. "sync"
  9. "wartank/pkg/components/kernel/keeper"
  10. "wartank/pkg/components/kernel/slog"
  11. "wartank/pkg/components/kernel/store"
  12. "wartank/pkg/components/kernel/wgname"
  13. "wartank/pkg/types"
  14. )
  15. /*
  16. Базовый объект приложения.
  17. */
  18. // Ядро -- объект ядра приложения
  19. type Ядро struct {
  20. ctxBg context.Context // Неотменяемый контекст приложения
  21. ctxApp context.Context // Отменяемый контекст приложения
  22. fnCancel func() // Функция отмены приложения
  23. keeper *keeper.Сторож // Сторож системных сигналов
  24. слог *slog.Слог // Логгер в два вывода
  25. wg *wgname.WgName // Групповое ожидание частей приложения
  26. хран types.ИХранилище // Хранилище данных
  27. блок sync.Mutex
  28. }
  29. // НовЯдро -- возвращает новый *Ядро
  30. func НовЯдро() (types.ИЯдро, error) {
  31. // timeStart := time.Now().UTC().Format("2006-10-02 15:04:05.000")
  32. // fmt._rintf("%v\t%v\tCI/CD test\n", cons.SelfName, timeStart)
  33. сам := &Ядро{
  34. ctxBg: context.Background(),
  35. wg: wgname.NewWgName(),
  36. }
  37. var ош error
  38. сам.ctxApp, сам.fnCancel = context.WithCancel(сам.ctxBg)
  39. сам.хран, ош = store.НовХранилище(сам, "./store")
  40. if ош != nil {
  41. return nil, fmt.Errorf("НовЯдро(): in creste IStore, err=%w", ош)
  42. }
  43. сам.блок.Lock()
  44. сам.слог, ош = slog.НовСлог(сам)
  45. сам.блок.Unlock()
  46. if ош != nil {
  47. return nil, fmt.Errorf("НовЯдро(): in creste ISlog, err=%w", ош)
  48. }
  49. сам.слог.Отладка("НовЯдро()")
  50. сам.keeper = keeper.НовСторож(сам)
  51. return сам, nil
  52. }
  53. // Хранилище -- возвращает хранилище данных
  54. func (сам *Ядро) Хранилище() types.ИХранилище {
  55. return сам.хран
  56. }
  57. // Wg -- возвращает объект групповой сихнронизации
  58. func (сам *Ядро) Wg() types.IWgName {
  59. return сам.wg
  60. }
  61. // Контекст -- возвращает глобальный контекст приложения
  62. func (сам *Ядро) Контекст() context.Context {
  63. return сам.ctxApp
  64. }
  65. // Done -- возвращает канал отмены контекста приложения
  66. func (сам *Ядро) Done() <-chan struct{} {
  67. return сам.ctxApp.Done()
  68. }
  69. // Отменить -- отменяет глобальный контекст приложения
  70. func (сам *Ядро) Отменить() {
  71. сам.блок.Lock()
  72. defer сам.блок.Unlock()
  73. сам.слог.Инфо("Kernel.CancelApp()\n")
  74. сам.fnCancel()
  75. }
  76. // Слог -- возвращает глобальный лог приложения
  77. func (сам *Ядро) Слог() types.ИСлог {
  78. return сам.слог
  79. }