2023-08-21 23:56:17 +00:00
|
|
|
package units
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Speed represents a unit of speed
|
|
|
|
type Speed string
|
|
|
|
|
|
|
|
// Speed units
|
|
|
|
const (
|
2023-08-23 00:34:26 +00:00
|
|
|
MetersPerSecond Speed = "MetersPerSecond"
|
|
|
|
KilometersPerHour Speed = "KilometersPerHour"
|
|
|
|
Knots Speed = "Knots"
|
2023-08-21 23:56:17 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// Convert converts a value from one unit to another
|
|
|
|
func (sf Speed) Convert(st Speed, val int) int {
|
|
|
|
switch {
|
|
|
|
case sf == MetersPerSecond && st == KilometersPerHour:
|
|
|
|
return int(float64(val) * 3.6)
|
|
|
|
case sf == KilometersPerHour && st == MetersPerSecond:
|
|
|
|
return int(float64(val) / 3.6)
|
|
|
|
case sf == Knots && st == KilometersPerHour:
|
|
|
|
return int(float64(val) * 1.852)
|
|
|
|
case sf == KilometersPerHour && st == Knots:
|
|
|
|
return int(float64(val) / 1.852)
|
|
|
|
case sf == MetersPerSecond && st == Knots:
|
|
|
|
return int(float64(val) * 1.94384)
|
|
|
|
case sf == Knots && st == MetersPerSecond:
|
|
|
|
return int(float64(val) / 1.94384)
|
|
|
|
default:
|
|
|
|
return val
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ParseSpeed parses a speed value. Valid inputs include:
|
|
|
|
// mps, m/s, kmh, kph, kt, and kts.
|
|
|
|
// This function is case-insensitive.
|
|
|
|
func ParseSpeed(s string) (Speed, bool) {
|
2023-08-23 00:34:26 +00:00
|
|
|
switch strings.ToLower(s) {
|
|
|
|
case "m/s", "mps", "meterspersecond", "meters per second":
|
|
|
|
return MetersPerSecond, true
|
|
|
|
case "kmh", "kph", "km/h", "kilometersperhour", "kilometers per hour":
|
|
|
|
return KilometersPerHour, true
|
|
|
|
case "kt", "kts", "knot", "knots":
|
|
|
|
return Knots, true
|
|
|
|
default:
|
|
|
|
return "", false
|
2023-08-21 23:56:17 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Distance represents a unit of distance
|
|
|
|
type Distance string
|
|
|
|
|
|
|
|
// Distance units
|
|
|
|
const (
|
2023-08-23 00:34:26 +00:00
|
|
|
Miles Distance = "Miles"
|
|
|
|
Meters Distance = "Meters"
|
2023-08-21 23:56:17 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// Convert converts a value from one unit to another
|
|
|
|
func (df Distance) Convert(dt Distance, val float64) float64 {
|
|
|
|
switch {
|
2023-08-23 00:34:26 +00:00
|
|
|
case df == Miles && dt == Meters:
|
2023-08-21 23:56:17 +00:00
|
|
|
return val * 1609
|
2023-08-23 00:34:26 +00:00
|
|
|
case df == Meters && dt == Miles:
|
2023-08-21 23:56:17 +00:00
|
|
|
return val / 1609
|
|
|
|
default:
|
|
|
|
return val
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ParseDistance parses a speed value. Valid inputs include:
|
|
|
|
// sm, mi, and m. This function is case-insensitive.
|
|
|
|
func ParseDistance(s string) (Distance, bool) {
|
2023-08-23 00:34:26 +00:00
|
|
|
switch strings.ToLower(s) {
|
|
|
|
case "sm", "mi", "mile", "miles":
|
|
|
|
return Miles, true
|
|
|
|
case "m", "meter", "meters":
|
|
|
|
return Meters, true
|
|
|
|
default:
|
|
|
|
return "", false
|
2023-08-21 23:56:17 +00:00
|
|
|
}
|
|
|
|
}
|