-
Notifications
You must be signed in to change notification settings - Fork 0
/
core.go
75 lines (56 loc) · 1.49 KB
/
core.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package toho
import (
"context"
"fmt"
"os"
"os/signal"
"reflect"
"syscall"
"time"
"github.com/go-toho/toho/app"
)
// CoreOptions struct holds the configuration options for the Core interface.
type CoreOptions struct {
App app.App
ConfigPointer any
LogPointer any
Options []any
StartTimeout time.Duration
StopTimeout time.Duration
}
// Core interface defines the methods for initializing and starting
// the application.
type Core interface {
// Init is used to configure application core.
Init(*CoreOptions) error
// Start starts the application.
Start(context.Context) error
// Stop gracefully stops the application.
Stop(context.Context) error
// Wait for termination of interrupt signals.
Wait() <-chan os.Signal
}
// defaultCore struct is the default implementation of the Core interface.
type defaultCore struct{}
// verify that defaultCore implements the Core interface.
var _ Core = (*defaultCore)(nil)
func (defaultCore) Init(opts *CoreOptions) error {
if opts.ConfigPointer != nil {
if _, ok := opts.ConfigPointer.(*struct{}); !ok {
s := reflect.ValueOf(opts.ConfigPointer)
return fmt.Errorf("unsupported config type: %s", s.Type().String())
}
}
return nil
}
func (defaultCore) Start(ctx context.Context) error {
return ctx.Err()
}
func (defaultCore) Stop(ctx context.Context) error {
return ctx.Err()
}
func (defaultCore) Wait() <-chan os.Signal {
ch := make(chan os.Signal, 1)
signal.Notify(ch, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
return ch
}