From a457a313b79f5362ec717c92bb265248b96a71bc Mon Sep 17 00:00:00 2001 From: kalipso Date: Tue, 18 Jul 2023 09:34:47 +0200 Subject: [PATCH] split actions/trigggers into seperate files --- actions/actions.go | 73 +++----------------------------------------- actions/printer.go | 28 +++++++++++++++++ actions/timeout.go | 30 ++++++++++++++++++ gokill.go | 3 +- internal/config.go | 26 ++++++++++++++++ triggers/timeout.go | 40 ++++++++++++++++++++++++ triggers/triggers.go | 53 ++------------------------------ 7 files changed, 132 insertions(+), 121 deletions(-) create mode 100644 actions/printer.go create mode 100644 actions/timeout.go create mode 100644 internal/config.go create mode 100644 triggers/timeout.go diff --git a/actions/actions.go b/actions/actions.go index 983f698..92b44e8 100644 --- a/actions/actions.go +++ b/actions/actions.go @@ -3,57 +3,14 @@ package actions import ( "fmt" "sort" - "time" + + "unknown.com/gokill/internal" ) -type OptionMissingError struct { - optionName string -} - -func (o OptionMissingError) Error() string { - return fmt.Sprintf("Error during config parsing: option %s could not be parsed.", o.optionName) -} - -type Options map[string]interface{} - -type ActionConfig struct { - Type string `json:"type"` - Options Options `json:"options"` - Stage int `json:"stage"` -} - -type KillSwitchConfig struct { - Name string `json:"name"` - Type string `json:"type"` - Options Options `json:"options"` - Actions []ActionConfig `json:"actions"` -} - type Action interface { Execute() } -type Printer struct { - Message string - ActionChan chan bool -} - -func (p Printer) Execute() { - fmt.Printf("Print action fires. Message: %s", p.Message) - p.ActionChan <- true -} - -type TimeOut struct { - Duration time.Duration - ActionChan chan bool -} - -func (t TimeOut) Execute() { - fmt.Printf("Waiting %d seconds\n", t.Duration/time.Second) - time.Sleep(t.Duration) - t.ActionChan <- true -} - type Stage struct { Actions []Action } @@ -81,29 +38,7 @@ func (a StagedActions) Execute() { } } -func NewPrint(config ActionConfig, c chan bool) (Action, error) { - opts := config.Options - message, ok := opts["message"] - - if !ok { - return nil, OptionMissingError{"message"} - } - - return Printer{fmt.Sprintf("%v", message), c}, nil -} - -func NewTimeOut(config ActionConfig, c chan bool) (Action, error) { - opts := config.Options - duration, ok := opts["duration"] - - if !ok { - return nil, OptionMissingError{"message"} - } - - return TimeOut{time.Duration(duration.(float64)) * time.Second, c}, nil -} - -func NewSingleAction(config ActionConfig, c chan bool) (Action, error) { +func NewSingleAction(config internal.ActionConfig, c chan bool) (Action, error) { if config.Type == "Print" { return NewPrint(config, c) } @@ -115,7 +50,7 @@ func NewSingleAction(config ActionConfig, c chan bool) (Action, error) { return nil, fmt.Errorf("Error parsing config: Action with type %s does not exists", config.Type) } -func NewAction(config []ActionConfig) (Action, error) { +func NewAction(config []internal.ActionConfig) (Action, error) { if len(config) == 1 { return NewSingleAction(config[0], make(chan bool)) } diff --git a/actions/printer.go b/actions/printer.go new file mode 100644 index 0000000..1b0be25 --- /dev/null +++ b/actions/printer.go @@ -0,0 +1,28 @@ +package actions + +import ( + "fmt" + + "unknown.com/gokill/internal" +) + +type Printer struct { + Message string + ActionChan chan bool +} + +func (p Printer) Execute() { + fmt.Printf("Print action fires. Message: %s", p.Message) + p.ActionChan <- true +} + +func NewPrint(config internal.ActionConfig, c chan bool) (Action, error) { + opts := config.Options + message, ok := opts["message"] + + if !ok { + return nil, internal.OptionMissingError{"message"} + } + + return Printer{fmt.Sprintf("%v", message), c}, nil +} diff --git a/actions/timeout.go b/actions/timeout.go new file mode 100644 index 0000000..36f0f91 --- /dev/null +++ b/actions/timeout.go @@ -0,0 +1,30 @@ +package actions + +import ( + "fmt" + "time" + + "unknown.com/gokill/internal" +) + +type TimeOut struct { + Duration time.Duration + ActionChan chan bool +} + +func (t TimeOut) Execute() { + fmt.Printf("Waiting %d seconds\n", t.Duration/time.Second) + time.Sleep(t.Duration) + t.ActionChan <- true +} + +func NewTimeOut(config internal.ActionConfig, c chan bool) (Action, error) { + opts := config.Options + duration, ok := opts["duration"] + + if !ok { + return nil, internal.OptionMissingError{"duration"} + } + + return TimeOut{time.Duration(duration.(float64)) * time.Second, c}, nil +} diff --git a/gokill.go b/gokill.go index 0530bf4..b8c728c 100644 --- a/gokill.go +++ b/gokill.go @@ -5,6 +5,7 @@ import ( "flag" "fmt" + "unknown.com/gokill/internal" "unknown.com/gokill/triggers" ) @@ -74,7 +75,7 @@ func main() { ] `) - var f []triggers.KillSwitchConfig + var f []internal.KillSwitchConfig err := json.Unmarshal(b, &f) if err != nil { diff --git a/internal/config.go b/internal/config.go new file mode 100644 index 0000000..77df040 --- /dev/null +++ b/internal/config.go @@ -0,0 +1,26 @@ +package internal + +import "fmt" + +type OptionMissingError struct { + OptionName string +} + +func (o OptionMissingError) Error() string { + return fmt.Sprintf("Error during config parsing: option %s could not be parsed.", o.OptionName) +} + +type Options map[string]interface{} + +type ActionConfig struct { + Type string `json:"type"` + Options Options `json:"options"` + Stage int `json:"stage"` +} + +type KillSwitchConfig struct { + Name string `json:"name"` + Type string `json:"type"` + Options Options `json:"options"` + Actions []ActionConfig `json:"actions"` +} diff --git a/triggers/timeout.go b/triggers/timeout.go new file mode 100644 index 0000000..04e0709 --- /dev/null +++ b/triggers/timeout.go @@ -0,0 +1,40 @@ +package triggers + +import ( + "fmt" + "time" + + "unknown.com/gokill/actions" + "unknown.com/gokill/internal" +) + +type TimeOut struct { + d time.Duration + action actions.Action +} + +func (t TimeOut) Listen() { + fmt.Println("TimeOut listens") + time.Sleep(t.d) + fmt.Println("TimeOut fires") + t.action.Execute() +} + +// func NewTimeOut(d time.Duration, action actions.Action) TimeOut { +func NewTimeOut(config internal.KillSwitchConfig) (TimeOut, error) { + opts := config.Options + + duration, ok := opts["duration"] + + if !ok { + return TimeOut{}, internal.OptionMissingError{"duration"} + } + + action, err := actions.NewAction(config.Actions) + + if err != nil { + return TimeOut{}, err + } + + return TimeOut{time.Duration(duration.(float64)) * time.Second, action}, nil +} diff --git a/triggers/triggers.go b/triggers/triggers.go index 4108094..61755dc 100644 --- a/triggers/triggers.go +++ b/triggers/triggers.go @@ -2,64 +2,15 @@ package triggers import ( "fmt" - "time" - "unknown.com/gokill/actions" + "unknown.com/gokill/internal" ) -type Options map[string]interface{} - -type KillSwitchConfig struct { - Name string `json:"name"` - Type string `json:"type"` - Options Options `json:"options"` - Actions []actions.ActionConfig `json:"actions"` -} - type Trigger interface { Listen() } -type TimeOut struct { - d time.Duration - action actions.Action -} - -func (t TimeOut) Listen() { - fmt.Println("TimeOut listens") - time.Sleep(t.d) - fmt.Println("TimeOut fires") - t.action.Execute() -} - -type OptionMissingError struct { - optionName string -} - -func (o OptionMissingError) Error() string { - return fmt.Sprintf("Error during config parsing: option %s could not be parsed.", o.optionName) -} - -// func NewTimeOut(d time.Duration, action actions.Action) TimeOut { -func NewTimeOut(config KillSwitchConfig) (TimeOut, error) { - opts := config.Options - - duration, ok := opts["duration"] - - if !ok { - return TimeOut{}, OptionMissingError{"duration"} - } - - action, err := actions.NewAction(config.Actions) - - if err != nil { - return TimeOut{}, err - } - - return TimeOut{time.Duration(duration.(float64)) * time.Second, action}, nil -} - -func NewTrigger(config KillSwitchConfig) (Trigger, error) { +func NewTrigger(config internal.KillSwitchConfig) (Trigger, error) { if config.Type == "TimeOut" { return NewTimeOut(config) }