-
Notifications
You must be signed in to change notification settings - Fork 33
/
Copy pathactivity.go
executable file
·99 lines (76 loc) · 2.1 KB
/
activity.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package filter
import (
"fmt"
"github.com/project-flogo/core/activity"
"github.com/project-flogo/core/data/metadata"
)
const (
ivValue = "value"
ivCondition = "condition"
ovFiltered = "filtered"
ovValue = "value"
)
//we can generate json from this! - we could also create a "validate-able" object from this
type Settings struct {
Type string `md:"type,allowed(non-zero,conditional)"`
ProceedOnlyOnEmit bool
}
type Input struct {
Value interface{} `md:"value"`
Condition bool `md:"condition"`
}
type Output struct {
Filtered bool `md:"filtered"`
Value interface{} `md:"value"`
}
func init() {
_ = activity.Register(&Activity{}, New)
}
var activityMd = activity.ToMetadata(&Settings{}, &Input{}, &Output{})
func New(ctx activity.InitContext) (activity.Activity, error) {
s := &Settings{ProceedOnlyOnEmit: true}
err := metadata.MapToStruct(ctx.Settings(), s, true)
if err != nil {
return nil, err
}
act := &Activity{}
if s.Type == "non-zero" {
act.filter = &NonZeroFilter{}
} else if s.Type == "conditional" {
act.filter = &ConditionalFilter{}
} else {
return nil, fmt.Errorf("unsupported filter: '%s'", s.Type)
}
act.proceedOnlyOnEmit = s.ProceedOnlyOnEmit
return act, nil
}
// Activity is an Activity that is used to Filter a message to the console
type Activity struct {
filter Filter
proceedOnlyOnEmit bool
}
// Metadata returns the activity's metadata
func (a *Activity) Metadata() *activity.Metadata {
return activityMd
}
// Eval implements api.Activity.Eval - Filters the Message
func (a *Activity) Eval(ctx activity.Context) (done bool, err error) {
filter := a.filter
proceedOnlyOnEmit := a.proceedOnlyOnEmit
in := ctx.GetInput(ivValue)
condition := ctx.GetInput(ivCondition).(bool)
filteredOut := filter.FilterOut(in, condition)
done = !(proceedOnlyOnEmit && filteredOut)
err = ctx.SetOutput(ovFiltered, filteredOut)
if err != nil {
return false, err
}
err = ctx.SetOutput(ovValue, in)
if err != nil {
return false, err
}
return done, nil
}
type Filter interface {
FilterOut(val interface{}, condition bool) bool
}