From 7d4d561290c4126b8017cba0e8f2cc62eaa85a48 Mon Sep 17 00:00:00 2001
From: Hans Moog <hm@mkjc.net>
Date: Mon, 22 Jul 2019 19:30:55 +0200
Subject: [PATCH] Feat: added bool parameters to the parameter package

---
 packages/parameter/events.go    | 11 +++++++++--
 packages/parameter/parameter.go | 31 ++++++++++++++++++++++++++++++-
 packages/parameter/types.go     |  7 +++++++
 plugins/cli/cli.go              |  4 ++++
 plugins/cli/plugin.go           | 13 ++++++++++++-
 5 files changed, 62 insertions(+), 4 deletions(-)

diff --git a/packages/parameter/events.go b/packages/parameter/events.go
index 7de04ada..ad91b734 100644
--- a/packages/parameter/events.go
+++ b/packages/parameter/events.go
@@ -5,16 +5,23 @@ import (
 )
 
 var Events = struct {
+	AddBool   *events.Event
 	AddInt    *events.Event
 	AddString *events.Event
 }{
-	events.NewEvent(intParameterCaller),
-	events.NewEvent(stringParameterCaller),
+	AddBool:   events.NewEvent(boolParameterCaller),
+	AddInt:    events.NewEvent(intParameterCaller),
+	AddString: events.NewEvent(stringParameterCaller),
+}
+
+func boolParameterCaller(handler interface{}, params ...interface{}) {
+	handler.(func(*BoolParameter))(params[0].(*BoolParameter))
 }
 
 func intParameterCaller(handler interface{}, params ...interface{}) {
 	handler.(func(*IntParameter))(params[0].(*IntParameter))
 }
+
 func stringParameterCaller(handler interface{}, params ...interface{}) {
 	handler.(func(*StringParameter))(params[0].(*StringParameter))
 }
diff --git a/packages/parameter/parameter.go b/packages/parameter/parameter.go
index 8588e73a..2d180914 100644
--- a/packages/parameter/parameter.go
+++ b/packages/parameter/parameter.go
@@ -1,5 +1,34 @@
 package parameter
 
+var boolParameters = make(map[string]*BoolParameter)
+
+func AddBool(name string, defaultValue bool, description string) *BoolParameter {
+	if boolParameters[name] != nil {
+		panic("duplicate parameter - \"" + name + "\" was defined already")
+	}
+
+	newParameter := &BoolParameter{
+		Name:         name,
+		DefaultValue: defaultValue,
+		Value:        &defaultValue,
+		Description:  description,
+	}
+
+	boolParameters[name] = newParameter
+
+	Events.AddBool.Trigger(newParameter)
+
+	return newParameter
+}
+
+func GetBool(name string) *BoolParameter {
+	return boolParameters[name]
+}
+
+func GetBools() map[string]*BoolParameter {
+	return boolParameters
+}
+
 var intParameters = make(map[string]*IntParameter)
 
 func AddInt(name string, defaultValue int, description string) *IntParameter {
@@ -32,7 +61,7 @@ func GetInts() map[string]*IntParameter {
 var stringParameters = make(map[string]*StringParameter)
 
 func AddString(name string, defaultValue string, description string) *StringParameter {
-	if intParameters[name] != nil {
+	if stringParameters[name] != nil {
 		panic("duplicate parameter - \"" + name + "\" was defined already")
 	}
 
diff --git a/packages/parameter/types.go b/packages/parameter/types.go
index 8a044680..92738a34 100644
--- a/packages/parameter/types.go
+++ b/packages/parameter/types.go
@@ -1,5 +1,12 @@
 package parameter
 
+type BoolParameter struct {
+	Name         string
+	Value        *bool
+	DefaultValue bool
+	Description  string
+}
+
 type IntParameter struct {
 	Name         string
 	Value        *int
diff --git a/plugins/cli/cli.go b/plugins/cli/cli.go
index ddb29b6b..dc898c98 100644
--- a/plugins/cli/cli.go
+++ b/plugins/cli/cli.go
@@ -7,6 +7,10 @@ import (
 	"path/filepath"
 )
 
+func AddBoolParameter(p *bool, name string, usage string) {
+	flag.BoolVar(p, name, *p, usage)
+}
+
 func AddIntParameter(p *int, name string, usage string) {
 	flag.IntVar(p, name, *p, usage)
 }
diff --git a/plugins/cli/plugin.go b/plugins/cli/plugin.go
index 0f5081d4..4e98e515 100644
--- a/plugins/cli/plugin.go
+++ b/plugins/cli/plugin.go
@@ -10,6 +10,12 @@ import (
 	"github.com/iotaledger/goshimmer/packages/parameter"
 )
 
+func onAddBoolParameter(param *parameter.BoolParameter) {
+	flagName := strings.Replace(strings.Replace(strings.ToLower(param.Name), "/", "-", 1), "_", "-", -1)
+
+	AddBoolParameter(param.Value, flagName, param.Description)
+}
+
 func onAddIntParameter(param *parameter.IntParameter) {
 	flagName := strings.Replace(strings.Replace(strings.ToLower(param.Name), "/", "-", 1), "_", "-", -1)
 
@@ -23,6 +29,10 @@ func onAddStringParameter(param *parameter.StringParameter) {
 }
 
 func init() {
+	for _, param := range parameter.GetBools() {
+		onAddBoolParameter(param)
+	}
+
 	for _, param := range parameter.GetInts() {
 		onAddIntParameter(param)
 	}
@@ -31,6 +41,7 @@ func init() {
 		onAddStringParameter(param)
 	}
 
+	parameter.Events.AddBool.Attach(events.NewClosure(onAddBoolParameter))
 	parameter.Events.AddInt.Attach(events.NewClosure(onAddIntParameter))
 	parameter.Events.AddString.Attach(events.NewClosure(onAddStringParameter))
 
@@ -49,7 +60,7 @@ func configure(ctx *node.Plugin) {
 	fmt.Println(" \\ `--.| |_| | | | | .  . || .  . || |__ | |_/ /")
 	fmt.Println("  `--. \\  _  | | | | |\\/| || |\\/| ||  __||    / ")
 	fmt.Println(" /\\__/ / | | |_| |_| |  | || |  | || |___| |\\ \\ ")
-	fmt.Println(" \\____/\\_| |_/\\___/\\_|  |_/\\_|  |_/\\____/\\_| \\_| fullnode 1.0")
+	fmt.Println(" \\____/\\_| |_/\\___/\\_|  |_/\\_|  |_/\\____/\\_| \\_| fullnode 0.0.1")
 	fmt.Println()
 
 	ctx.Node.LogInfo("Node", "Loading plugins ...")
-- 
GitLab