Skip to content

Commit 8f60d4c

Browse files
committed
chore: Support multiple triggers on func subscribe command
1 parent e013e6e commit 8f60d4c

File tree

1 file changed

+40
-37
lines changed

1 file changed

+40
-37
lines changed

cmd/subscribe.go

Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ and an 'extension' attribute for the value 'my-extension-value'.
4545

4646
func runSubscribe(cmd *cobra.Command) (err error) {
4747
var (
48-
cfg subscibeConfig
48+
cfg subscribeConfig
4949
f fn.Function
5050
)
5151
cfg = newSubscribeConfig(cmd)
@@ -61,66 +61,69 @@ func runSubscribe(cmd *cobra.Command) (err error) {
6161
}
6262

6363
// add subscription to function
64-
f.Deploy.Subscriptions = updateOrAddSubscription(f.Deploy.Subscriptions, cfg)
64+
f.Deploy.Subscriptions = addNewSubscriptions(f.Deploy.Subscriptions, cfg)
6565

6666
// pump it
6767
return f.Write()
6868
}
6969

70-
func extractFilterMap(filters []string) map[string]string {
71-
subscriptionFilters := make(map[string]string)
70+
func extractNewSubscriptions(filters []string, source string) (newSubscriptions []*subscriptionConfig) {
7271
for _, filter := range filters {
7372
kv := strings.Split(filter, "=")
7473
if len(kv) != 2 {
7574
fmt.Println("Invalid pair:", filter)
7675
continue
7776
}
78-
key := kv[0]
79-
value := kv[1]
80-
subscriptionFilters[key] = value
77+
filterKey := kv[0]
78+
filterValue := kv[1]
79+
newSubscriptions = append(newSubscriptions, &subscriptionConfig{
80+
Source: source,
81+
FilterKey: filterKey,
82+
FilterValue: filterValue,
83+
})
8184
}
82-
return subscriptionFilters
85+
return newSubscriptions
86+
}
87+
88+
type subscriptionConfig struct {
89+
Source string
90+
FilterKey string
91+
FilterValue string
8392
}
8493

85-
type subscibeConfig struct {
94+
type subscribeConfig struct {
8695
Filter []string
8796
Source string
8897
}
8998

90-
func updateOrAddSubscription(subscriptions []fn.KnativeSubscription, cfg subscibeConfig) []fn.KnativeSubscription {
91-
found := false
92-
newFilters := extractFilterMap(cfg.Filter)
93-
94-
// Iterate over subscriptions to find if one with the same source already exists
95-
for i, subscription := range subscriptions {
96-
if subscription.Source == cfg.Source {
97-
found = true
98-
99-
if subscription.Filters == nil {
100-
subscription.Filters = make(map[string]string)
99+
func addNewSubscriptions(subscriptions []fn.KnativeSubscription, cfg subscribeConfig) []fn.KnativeSubscription {
100+
newSubscriptions := extractNewSubscriptions(cfg.Filter, cfg.Source)
101+
for _, newSubscription := range newSubscriptions {
102+
isNew := true
103+
for _, subscription := range subscriptions {
104+
if subscription.Source == newSubscription.Source {
105+
for k, v := range subscription.Filters {
106+
if k == newSubscription.FilterKey && v == newSubscription.FilterValue {
107+
isNew = false
108+
break
109+
}
110+
}
101111
}
102-
103-
// Update filters. Override if the key already exists.
104-
for newKey, newValue := range newFilters {
105-
subscription.Filters[newKey] = newValue
106-
}
107-
subscriptions[i] = subscription // Reassign the updated subscription
108-
break
109112
}
110-
}
111-
112-
// If a subscription with the source was not found, add a new one
113-
if !found {
114-
subscriptions = append(subscriptions, fn.KnativeSubscription{
115-
Source: cfg.Source,
116-
Filters: newFilters,
117-
})
113+
if isNew {
114+
newFilter := make(map[string]string)
115+
newFilter[newSubscription.FilterKey] = newSubscription.FilterValue
116+
subscriptions = append(subscriptions, fn.KnativeSubscription{
117+
Source: cfg.Source,
118+
Filters: newFilter,
119+
})
120+
}
118121
}
119122
return subscriptions
120123
}
121124

122-
func newSubscribeConfig(cmd *cobra.Command) (c subscibeConfig) {
123-
c = subscibeConfig{
125+
func newSubscribeConfig(cmd *cobra.Command) (c subscribeConfig) {
126+
c = subscribeConfig{
124127
Filter: viper.GetStringSlice("filter"),
125128
Source: viper.GetString("source"),
126129
}

0 commit comments

Comments
 (0)