kernel.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // package app -- главный объект приложения
  2. package kernel
  3. import (
  4. "context"
  5. "fmt"
  6. "p78git.ddns.net/svi/libtui/cursor"
  7. "p78git.ddns.net/svi/libtui/screen"
  8. "p78git.ddns.net/svi/libtui/types"
  9. )
  10. // Kernel -- объектприложения
  11. type Kernel struct {
  12. screen types.IScreen // Объект приложения
  13. cursor types.ICursor // Глобальный курсор
  14. ctxBg context.Context // Неотменяемый контекст ядра
  15. ctx context.Context // Контекст ядра
  16. fnCancel func()
  17. }
  18. // NewKernel -- возвращает новый объект приложения
  19. func NewKernel() (*Kernel, error) {
  20. ctxBg := context.Background()
  21. ctx, fnCancel := context.WithCancel(ctxBg)
  22. sf := &Kernel{
  23. ctxBg: ctxBg,
  24. ctx: ctx,
  25. fnCancel: fnCancel,
  26. }
  27. var err error
  28. sf.screen, err = screen.NewScreen(sf)
  29. if err != nil {
  30. return nil, fmt.Errorf("NewKernel(): i create IScreen, err=\n\t%w", err)
  31. }
  32. sf.cursor, err = cursor.NewCursor(sf)
  33. if err != nil {
  34. return nil, fmt.Errorf("NewKernel(): in create ICursor, err=\n\t%w", err)
  35. }
  36. return sf, nil
  37. }
  38. // Screen -- возвращает объект экрана
  39. func (sf *Kernel) Screen() types.IScreen {
  40. return sf.screen
  41. }
  42. // Cursor -- возвращает курсор экрана
  43. func (sf *Kernel) Cursor() types.ICursor {
  44. return sf.cursor
  45. }
  46. // Run -- запускает объект приложения в работу
  47. func (sf *Kernel) Run() error {
  48. <-sf.ctx.Done()
  49. go sf.screen.Run()
  50. return nil
  51. }
  52. // CancelApp -- отменяет глобальный онтекст приложения
  53. func (sf *Kernel) CancelApp() {
  54. sf.fnCancel()
  55. }
  56. // Ctx -- возвращает глобальный контекст ядра
  57. func (sf *Kernel) Ctx() context.Context {
  58. return sf.ctx
  59. }