Преглед изворни кода

Add float configuration option type

Vadim Markovtsev пре 7 година
родитељ
комит
1ef5b8abdb
3 измењених фајлова са 18 додато и 3 уклоњено
  1. 4 0
      pipeline.go
  2. 4 0
      pipeline_test.go
  3. 10 3
      registry.go

+ 4 - 0
pipeline.go

@@ -29,6 +29,8 @@ const (
 	IntConfigurationOption
 	// StringConfigurationOption reflects the string value type.
 	StringConfigurationOption
+	// FloatConfigurationOption reflects a floating point value type.
+	FloatConfigurationOption
 )
 
 // String() returns an empty string for the boolean type, "int" for integers and "string" for
@@ -41,6 +43,8 @@ func (opt ConfigurationOptionType) String() string {
 		return "int"
 	case StringConfigurationOption:
 		return "string"
+	case FloatConfigurationOption:
+		return "float"
 	}
 	panic(fmt.Sprintf("Invalid ConfigurationOptionType value %d", opt))
 }

+ 4 - 0
pipeline_test.go

@@ -421,6 +421,8 @@ func TestConfigurationOptionTypeString(t *testing.T) {
 	opt = ConfigurationOptionType(2)
 	assert.Equal(t, opt.String(), "string")
 	opt = ConfigurationOptionType(3)
+	assert.Equal(t, opt.String(), "float")
+	opt = ConfigurationOptionType(4)
 	assert.Panics(t, func() { _ = opt.String() })
 }
 
@@ -431,6 +433,8 @@ func TestConfigurationOptionFormatDefault(t *testing.T) {
 	assert.Equal(t, opt.FormatDefault(), "7")
 	opt = ConfigurationOption{Type: BoolConfigurationOption, Default: false}
 	assert.Equal(t, opt.FormatDefault(), "false")
+	opt = ConfigurationOption{Type: FloatConfigurationOption, Default: 0.5}
+	assert.Equal(t, opt.FormatDefault(), "0.5")
 }
 
 func init() {

+ 10 - 3
registry.go

@@ -160,19 +160,26 @@ func (registry *PipelineItemRegistry) AddFlags(flagSet *pflag.FlagSet) (
 		itemIface := reflect.New(it.Elem()).Interface()
 		for _, opt := range itemIface.(PipelineItem).ListConfigurationOptions() {
 			var iface interface{}
+			getPtr := func() unsafe.Pointer {
+				return unsafe.Pointer(uintptr(unsafe.Pointer(&iface)) + unsafe.Sizeof(&iface))
+			}
 			switch opt.Type {
 			case BoolConfigurationOption:
 				iface = interface{}(true)
-				ptr := (**bool)(unsafe.Pointer(uintptr(unsafe.Pointer(&iface)) + unsafe.Sizeof(&iface)))
+				ptr := (**bool)(getPtr())
 				*ptr = flagSet.Bool(opt.Flag, opt.Default.(bool), formatHelp(opt.Description))
 			case IntConfigurationOption:
 				iface = interface{}(0)
-				ptr := (**int)(unsafe.Pointer(uintptr(unsafe.Pointer(&iface)) + unsafe.Sizeof(&iface)))
+				ptr := (**int)(getPtr())
 				*ptr = flagSet.Int(opt.Flag, opt.Default.(int), formatHelp(opt.Description))
 			case StringConfigurationOption:
 				iface = interface{}("")
-				ptr := (**string)(unsafe.Pointer(uintptr(unsafe.Pointer(&iface)) + unsafe.Sizeof(&iface)))
+				ptr := (**string)(getPtr())
 				*ptr = flagSet.String(opt.Flag, opt.Default.(string), formatHelp(opt.Description))
+			case FloatConfigurationOption:
+				iface = interface{}(float32(0))
+				ptr := (**float32)(getPtr())
+				*ptr = flagSet.Float32(opt.Flag, opt.Default.(float32), formatHelp(opt.Description))
 			}
 			flags[opt.Name] = iface
 		}