fixed panic when using mutators on floats

This commit is contained in:
Timon Ringwald 2022-04-18 20:39:41 +02:00
parent d733246517
commit f66d9d7f3b
2 changed files with 50 additions and 4 deletions

View File

@ -204,6 +204,26 @@ day: 2 | month: 1 | year: 2006
day: 2 | month: 2 | year: 1962 day: 2 | month: 2 | year: 1962
``` ```
### Adding 2 values together
Input:
```
5 7
3 2
10 152
-15 3.7
```
Command: `format -i '(-?\d+) (-?\d+(?:.\d+)?)' -o '{1} + {2} = {1:%.2f:+(2)}'`
Output:
```
5 + 7 = 12.00
3 + 2 = 5.00
10 + 152 = 162.00
-15 + 3.7 = -11.30
```
### Bulk renaming files ### Bulk renaming files
Rename a bunch of files using format at once Rename a bunch of files using format at once

34
main.go
View File

@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"io" "io"
"os" "os"
"reflect"
"regexp" "regexp"
"strconv" "strconv"
"strings" "strings"
@ -164,14 +165,13 @@ func numMut2func[T int64 | float64](mutation string) (f func(value T, vars []str
mutators = append(mutators, mut) mutators = append(mutators, mut)
} }
numberParser := number_parser[T]()
return func(value T, vars []string) T { return func(value T, vars []string) T {
for _, mutator := range mutators { for _, mutator := range mutators {
var otherValue T var otherValue T
if mutator.Var { if mutator.Var {
other, err := strconv.Atoi(vars[mutator.Value]) other := numberParser(vars[mutator.Value])
if err != nil {
panic("back reference group for number mutator is not a number")
}
otherValue = T(other) otherValue = T(other)
} else { } else {
otherValue = T(mutator.Value) otherValue = T(mutator.Value)
@ -193,3 +193,29 @@ func numMut2func[T int64 | float64](mutation string) (f func(value T, vars []str
return value return value
} }
} }
func number_parser[T int64 | float64]() func(str string) T {
typeOfT := reflect.TypeOf(new(T)).Elem()
typeOfInt64 := reflect.TypeOf(new(int64)).Elem()
typeOfFloat64 := reflect.TypeOf(new(float64)).Elem()
if typeOfT == typeOfInt64 {
return func(str string) T {
num, err := strconv.Atoi(str)
if err != nil {
panic("expected integer but found " + str)
}
return T(num)
}
} else if typeOfT == typeOfFloat64 {
return func(str string) T {
num, err := strconv.ParseFloat(str, 64)
if err != nil {
panic("expected float but found " + str)
}
return T(num)
}
}
panic("invalid number type")
}