github.com/rivy-go/git-changelog@v0.0.0-20240424224517-b86e6ab57773/internal/changelog/utils.go (about) 1 package changelog 2 3 import ( 4 "fmt" 5 "reflect" 6 "strings" 7 "time" 8 ) 9 10 func dotGet(target interface{}, prop string) (interface{}, bool) { 11 path := strings.Split(prop, ".") 12 13 if len(path) == 0 { 14 return nil, false 15 } 16 17 for _, key := range path { 18 var value reflect.Value 19 20 if reflect.TypeOf(target).Kind() == reflect.Ptr { 21 value = reflect.ValueOf(target).Elem() 22 } else { 23 value = reflect.ValueOf(target) 24 } 25 26 field := value.FieldByName(strings.Title(key)) 27 if !field.IsValid() { 28 return nil, false 29 } 30 31 target = field.Interface() 32 } 33 34 return target, true 35 } 36 37 // TODO: dotSet ... 38 39 func assignDynamicValues(target interface{}, attrs []string, values []string) { 40 rv := reflect.ValueOf(target).Elem() 41 rt := rv.Type() 42 43 for i, field := range attrs { 44 if f, ok := rt.FieldByName(field); ok { 45 if values[i] != "" { 46 rv.FieldByIndex(f.Index).SetString(values[i]) 47 } 48 } 49 } 50 } 51 52 func compare(a interface{}, operator string, b interface{}) (bool, error) { 53 at := reflect.TypeOf(a).String() 54 bt := reflect.TypeOf(a).String() 55 if at != bt { 56 return false, fmt.Errorf("\"%s\" and \"%s\" can not be compared", at, bt) 57 } 58 59 switch at { 60 case "string": 61 aa := a.(string) 62 bb := b.(string) 63 return compareString(aa, operator, bb), nil 64 case "int": 65 aa := a.(int) 66 bb := b.(int) 67 return compareInt(aa, operator, bb), nil 68 case "time.Time": 69 aa := a.(time.Time) 70 bb := b.(time.Time) 71 return compareTime(aa, operator, bb), nil 72 } 73 74 return false, nil 75 } 76 77 func compareString(a string, operator string, b string) bool { 78 switch operator { 79 case "<": 80 return a < b 81 case ">": 82 return a > b 83 default: 84 return false 85 } 86 } 87 88 func compareInt(a int, operator string, b int) bool { 89 switch operator { 90 case "<": 91 return a < b 92 case ">": 93 return a > b 94 default: 95 return false 96 } 97 } 98 99 func compareTime(a time.Time, operator string, b time.Time) bool { 100 switch operator { 101 case "<": 102 return !a.After(b) 103 case ">": 104 return a.After(b) 105 default: 106 return false 107 } 108 } 109 110 func convNewline(str, nlcode string) string { 111 return strings.NewReplacer( 112 "\r\n", nlcode, 113 "\r", nlcode, 114 "\n", nlcode, 115 ).Replace(str) 116 }