diff --git a/cmd/tafparser/main.go b/cmd/tafparser/main.go index eff8cc3..23108e6 100644 --- a/cmd/tafparser/main.go +++ b/cmd/tafparser/main.go @@ -19,8 +19,8 @@ func init() { func main() { pretty := pflag.BoolP("pretty", "p", true, "Pretty-print the JSON output") printGo := pflag.BoolP("print-go", "G", false, "Print Go code instead of JSON") - convertDist := pflag.StringP("convert-distance", "d", "", "Convert all the distances to the given unit. (valid units: sm, mi, m)") - convertSpd := pflag.StringP("convert-speed", "s", "", "Convert all the speeds to the given unit. (valid units: m/s, mps, kmh, kph, kt, kts)") + convertDist := pflag.StringP("convert-distance", "d", "", "Convert all the distances to the given unit. (valid units: mi, m, km)") + convertSpd := pflag.StringP("convert-speed", "s", "", "Convert all the speeds to the given unit. (valid units: m/s, kph, kts, mph)") pflag.Parse() var opts taf.Options diff --git a/units/units.go b/units/units.go index bcd6754..3297a6e 100644 --- a/units/units.go +++ b/units/units.go @@ -12,6 +12,7 @@ const ( MetersPerSecond Speed = "MetersPerSecond" KilometersPerHour Speed = "KilometersPerHour" Knots Speed = "Knots" + MilesPerHour Speed = "MilesPerHour" ) // Convert converts a value from one unit to another @@ -29,22 +30,36 @@ func (sf Speed) Convert(st Speed, val int) int { return int(float64(val) * 1.94384) case sf == Knots && st == MetersPerSecond: return int(float64(val) / 1.94384) + case sf == MilesPerHour && st == KilometersPerHour: + return int(float64(val) * 1.60934) + case sf == KilometersPerHour && st == MilesPerHour: + return int(float64(val) / 1.60934) + case sf == MilesPerHour && st == MetersPerSecond: + return int(float64(val) * 0.44704) + case sf == MetersPerSecond && st == MilesPerHour: + return int(float64(val) / 0.44704) + case sf == MilesPerHour && st == Knots: + return int(float64(val) * 0.868976) + case sf == Knots && st == MilesPerHour: + return int(float64(val) / 0.868976) default: return val } } // ParseSpeed parses a speed value. Valid inputs include: -// mps, m/s, kmh, kph, kt, and kts. +// mps, m/s, kmh, kph, kt, kts, mph, and milesperhour. // This function is case-insensitive. func ParseSpeed(s string) (Speed, bool) { switch strings.ToLower(s) { - case "m/s", "mps", "meterspersecond", "meters per second": + case "m/s", "mps", "meterspersecond", "meters per second", "metrespersecond", "metres per second": return MetersPerSecond, true - case "kmh", "kph", "km/h", "kilometersperhour", "kilometers per hour": + case "kmh", "kph", "km/h", "kilometersperhour", "kilometers per hour", "kilometresperhour", "kilometres per hour": return KilometersPerHour, true case "kt", "kts", "knot", "knots": return Knots, true + case "mph", "milesperhour", "miles per hour": + return MilesPerHour, true default: return "", false } @@ -55,8 +70,9 @@ type Distance string // Distance units const ( - Miles Distance = "Miles" - Meters Distance = "Meters" + Miles Distance = "Miles" + Meters Distance = "Meters" + Kilometers Distance = "Kilometers" ) // Convert converts a value from one unit to another @@ -66,19 +82,30 @@ func (df Distance) Convert(dt Distance, val float64) float64 { return val * 1609 case df == Meters && dt == Miles: return val / 1609 + case df == Kilometers && dt == Meters: + return val * 1000 + case df == Meters && dt == Kilometers: + return val / 1000 + case df == Miles && dt == Kilometers: + return val * 1.60934 + case df == Kilometers && dt == Miles: + return val / 1.60934 default: return val } } -// ParseDistance parses a speed value. Valid inputs include: -// sm, mi, and m. This function is case-insensitive. +// ParseDistance parses a distance value. Valid inputs include: +// sm, mi, m, km, and kilometers. +// This function is case-insensitive. func ParseDistance(s string) (Distance, bool) { switch strings.ToLower(s) { case "sm", "mi", "mile", "miles": return Miles, true - case "m", "meter", "meters": + case "m", "meter", "meters", "metre", "metres": return Meters, true + case "km", "kilometer", "kilometers", "kilometre", "kilometres": + return Kilometers, true default: return "", false }