Big refactor, trying to implement an FSM
parent
ab32890495
commit
110753ef52
@ -0,0 +1,11 @@
|
||||
package obspipeline
|
||||
|
||||
func (p *Pipeline) FindAttachments() error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Pipeline) MoveAttachments(post string) error {
|
||||
|
||||
return nil
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
package obspipeline
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type State string
|
||||
type Event string
|
||||
|
||||
type Action func(ctx context.Context) error
|
||||
|
||||
type Node struct {
|
||||
State
|
||||
Transitions map[Event]*Transition
|
||||
}
|
||||
|
||||
type Transition struct {
|
||||
*Node
|
||||
Action
|
||||
}
|
||||
|
||||
type StateMachine struct {
|
||||
initialNode *Node
|
||||
CurrentNode *Node
|
||||
}
|
||||
|
||||
func (m *StateMachine) getCurrentNode() *Node {
|
||||
return m.CurrentNode
|
||||
}
|
||||
|
||||
func (m *StateMachine) getNextNode(event Event) (*Node, error) {
|
||||
if m.CurrentNode == nil {
|
||||
return nil, fmt.Errorf("nowhere to go anymore!\n")
|
||||
}
|
||||
|
||||
transition, ok := m.CurrentNode.Transitions[event]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("invalid event: %v", event)
|
||||
}
|
||||
|
||||
return transition.Node, nil
|
||||
}
|
||||
|
||||
func (m *StateMachine) Transition(ctx context.Context, event Event) (*Node, error) {
|
||||
node, err := m.getNextNode(event) // gets current node
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf(err.Error())
|
||||
}
|
||||
|
||||
err = m.CurrentNode.Transitions[event].Action(ctx)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf(err.Error())
|
||||
}
|
||||
|
||||
m.CurrentNode = node
|
||||
|
||||
return m.CurrentNode, nil
|
||||
}
|
@ -0,0 +1,91 @@
|
||||
package obspipeline
|
||||
|
||||
import (
|
||||
"context"
|
||||
)
|
||||
|
||||
var CopyPost = Node{
|
||||
State: "CopyPost",
|
||||
Transitions: map[Event]*Transition{
|
||||
"HasAttachments": &Transition{
|
||||
Node: &HasAttachments,
|
||||
Action: func(ctx context.Context) error {
|
||||
return nil
|
||||
},
|
||||
},
|
||||
"NoAttachments": &Transition{
|
||||
Node: &NoAttachments,
|
||||
Action: func(ctx context.Context) error {
|
||||
return nil
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
var NoteFound = Node{
|
||||
State: "NoteFound",
|
||||
Transitions: map[Event]*Transition{
|
||||
"CopyPost": &Transition{
|
||||
Node: &CopyPost,
|
||||
Action: func(ctx context.Context) error {
|
||||
// scan for attachments here
|
||||
// if len() attachments > 0
|
||||
//
|
||||
return nil
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
var NoAttachments = Node{
|
||||
State: "NoAttachments",
|
||||
Transitions: map[Event]*Transition{
|
||||
"Terminate": &Transition{
|
||||
Node: &Terminate,
|
||||
Action: func(ctx context.Context) error {
|
||||
return nil
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
var HasAttachments = Node{
|
||||
State: "HasAttachments",
|
||||
Transitions: map[Event]*Transition{
|
||||
"CopyAttachments": &Transition{
|
||||
Node: &CopyAttachments,
|
||||
Action: func(ctx context.Context) error {
|
||||
return nil
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
var CopyAttachments = Node{
|
||||
State: "CopyAttachments",
|
||||
Transitions: map[Event]*Transition{
|
||||
"SanitizeLinks": &Transition{
|
||||
Node: &SanitizeLinks,
|
||||
Action: func(ctx context.Context) error {
|
||||
return nil
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
var SanitizeLinks = Node{
|
||||
State: "SanitizeLinks",
|
||||
Transitions: map[Event]*Transition{
|
||||
"Terminate": &Transition{
|
||||
Node: &Terminate,
|
||||
Action: func(ctx context.Context) error {
|
||||
return nil
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
var Terminate = Node{
|
||||
State: "SanitizeLinks",
|
||||
Transitions: map[Event]*Transition{},
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package obspipeline
|
||||
|
||||
func (p *Pipeline) FindNotes() error {
|
||||
return nil
|
||||
}
|
Loading…
Reference in New Issue