107 lines
2.4 KiB
Go
107 lines
2.4 KiB
Go
package utils
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"log/slog"
|
|
"net"
|
|
"os"
|
|
"path/filepath"
|
|
"reflect"
|
|
"time"
|
|
)
|
|
|
|
const rsaBits = 4096
|
|
|
|
func GetFilePath(path string) string {
|
|
// Check for empty filename
|
|
if len(path) == 0 {
|
|
return ""
|
|
}
|
|
|
|
// check if filename exists
|
|
if _, err := os.Stat(path); os.IsNotExist((err)) {
|
|
slog.Info("File not found, searching in same directory as binary", "filename", path)
|
|
// if not, check that it exists in the same directory as the currently executing binary
|
|
ex, err2 := os.Executable()
|
|
if err2 != nil {
|
|
slog.Error("Error determining binary path", "error", err)
|
|
return ""
|
|
}
|
|
binaryPath := filepath.Dir(ex)
|
|
path = filepath.Join(binaryPath, path)
|
|
}
|
|
return path
|
|
}
|
|
|
|
// Get preferred outbound ip of this machine
|
|
// @see https://stackoverflow.com/questions/23558425/how-do-i-get-the-local-ip-address-in-go
|
|
func GetOutboundIP() net.IP {
|
|
conn, err := net.Dial("udp", "8.8.8.8:80")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer conn.Close()
|
|
|
|
localAddr := conn.LocalAddr().(*net.UDPAddr)
|
|
|
|
return localAddr.IP
|
|
}
|
|
|
|
// Check if a file exists from https://stackoverflow.com/questions/12518876/how-to-check-if-a-file-exists-in-go
|
|
func FileExists(filename string) bool {
|
|
info, err := os.Stat(filename)
|
|
if os.IsNotExist(err) {
|
|
return false
|
|
}
|
|
return !info.IsDir()
|
|
}
|
|
|
|
func SleepWithContext(ctx context.Context, d time.Duration) {
|
|
timer := time.NewTimer(d)
|
|
select {
|
|
case <-ctx.Done():
|
|
if !timer.Stop() {
|
|
<-timer.C
|
|
}
|
|
case <-timer.C:
|
|
}
|
|
}
|
|
|
|
// Generic converter using reflection
|
|
func ConvertStruct(src interface{}, dst interface{}) {
|
|
srcVal := reflect.ValueOf(src)
|
|
srcType := reflect.TypeOf(src)
|
|
dstVal := reflect.ValueOf(dst).Elem()
|
|
|
|
for i := 0; i < srcVal.NumField(); i++ {
|
|
srcField := srcVal.Field(i)
|
|
dstField := dstVal.FieldByName(srcType.Field(i).Name)
|
|
|
|
if !dstField.IsValid() || !dstField.CanSet() {
|
|
continue
|
|
}
|
|
|
|
switch srcField.Type().Name() {
|
|
case "NullString":
|
|
if srcField.FieldByName("Valid").Bool() {
|
|
dstField.SetString(srcField.FieldByName("String").String())
|
|
} else {
|
|
dstField.SetString("")
|
|
}
|
|
case "NullTime":
|
|
if srcField.FieldByName("Valid").Bool() {
|
|
t := srcField.FieldByName("Time").Interface().(time.Time)
|
|
dstField.SetString(t.Format("2006-01-02 15:04:05"))
|
|
} else {
|
|
dstField.SetString("")
|
|
}
|
|
default:
|
|
// Handle int64 -> int conversion
|
|
if srcField.Kind() == reflect.Int64 && dstField.Kind() == reflect.Int {
|
|
dstField.SetInt(srcField.Int())
|
|
}
|
|
}
|
|
}
|
|
}
|