@@ -2,44 +2,71 @@ package cli
22
33import (
44 "strconv"
5+ "unsafe"
56)
67
7- type FloatFlag = FlagBase [float64 , NoConfig , floatValue ]
8+ type (
9+ FloatFlag = FlagBase [float64 , NoConfig , floatValue [float64 ]]
10+ Float32Flag = FlagBase [float32 , NoConfig , floatValue [float32 ]]
11+ Float64Flag = FlagBase [float64 , NoConfig , floatValue [float64 ]]
12+ )
813
9- // -- float64 Value
10- type floatValue float64
14+ // -- float Value
15+ type floatValue [T float32 | float64 ] struct {
16+ val * T
17+ }
1118
1219// Below functions are to satisfy the ValueCreator interface
1320
14- func (f floatValue ) Create (val float64 , p * float64 , c NoConfig ) Value {
21+ func (f floatValue [ T ] ) Create (val T , p * T , c NoConfig ) Value {
1522 * p = val
16- return (* floatValue )(p )
23+
24+ return & floatValue [T ]{val : p }
1725}
1826
19- func (f floatValue ) ToString (b float64 ) string {
20- return strconv .FormatFloat (b , 'g' , - 1 , 64 )
27+ func (f floatValue [ T ] ) ToString (b T ) string {
28+ return strconv .FormatFloat (float64 ( b ) , 'g' , - 1 , int ( unsafe . Sizeof ( T ( 0 )) * 8 ) )
2129}
2230
2331// Below functions are to satisfy the flag.Value interface
2432
25- func (f * floatValue ) Set (s string ) error {
26- v , err := strconv .ParseFloat (s , 64 )
33+ func (f * floatValue [ T ] ) Set (s string ) error {
34+ v , err := strconv .ParseFloat (s , int ( unsafe . Sizeof ( T ( 0 )) * 8 ) )
2735 if err != nil {
2836 return err
2937 }
30- * f = floatValue (v )
31- return err
38+ * f . val = T (v )
39+ return nil
3240}
3341
34- func (f * floatValue ) Get () any { return float64 ( * f ) }
42+ func (f * floatValue [ T ] ) Get () any { return * f . val }
3543
36- func (f * floatValue ) String () string { return strconv .FormatFloat (float64 (* f ), 'g' , - 1 , 64 ) }
44+ func (f * floatValue [T ]) String () string {
45+ return strconv .FormatFloat (float64 (* f .val ), 'g' , - 1 , int (unsafe .Sizeof (T (0 ))* 8 ))
46+ }
3747
3848// Float looks up the value of a local FloatFlag, returns
3949// 0 if not found
4050func (cmd * Command ) Float (name string ) float64 {
41- if v , ok := cmd .Value (name ).(float64 ); ok {
51+ return getFloat [float64 ](cmd , name )
52+ }
53+
54+ // Float32 looks up the value of a local Float32Flag, returns
55+ // 0 if not found
56+ func (cmd * Command ) Float32 (name string ) float32 {
57+ return getFloat [float32 ](cmd , name )
58+ }
59+
60+ // Float64 looks up the value of a local Float64Flag, returns
61+ // 0 if not found
62+ func (cmd * Command ) Float64 (name string ) float64 {
63+ return getFloat [float64 ](cmd , name )
64+ }
65+
66+ func getFloat [T float32 | float64 ](cmd * Command , name string ) T {
67+ if v , ok := cmd .Value (name ).(T ); ok {
4268 tracef ("float available for flag name %[1]q with value=%[2]v (cmd=%[3]q)" , name , v , cmd .Name )
69+
4370 return v
4471 }
4572
0 commit comments