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  }