Fix handling of PROB groups

This commit is contained in:
Elara 2023-08-25 20:08:09 -07:00
parent 48d68b810b
commit b23007a81a
2 changed files with 14 additions and 5 deletions

13
taf.go
View File

@ -88,6 +88,7 @@ func DecodeWithOptions(r io.Reader, opts Options) (*Forecast, error) {
return nil, err return nil, err
} }
setProb := 0
fc := &Forecast{} fc := &Forecast{}
out := reflect.ValueOf(fc).Elem() out := reflect.ValueOf(fc).Elem()
@ -291,6 +292,13 @@ func DecodeWithOptions(r io.Reader, opts Options) (*Forecast, error) {
Type: convertChangeType(item.Change.Type), Type: convertChangeType(item.Change.Type),
} }
// if setProb is set, add the probability within it to the change,
// then reset the variable.
if setProb != 0 {
ch.Probability = setProb
setProb = 0
}
// FM changes don't have a valid pair, they only come with a single time string // FM changes don't have a valid pair, they only come with a single time string
if ch.Type == From { if ch.Type == From {
t, err := parseTime(item.Change.Time, opts.Month, opts.Year) t, err := parseTime(item.Change.Time, opts.Month, opts.Year)
@ -313,13 +321,14 @@ func DecodeWithOptions(r io.Reader, opts Options) (*Forecast, error) {
out = reflect.ValueOf(ch).Elem() out = reflect.ValueOf(ch).Elem()
case item.Probability != nil: case item.Probability != nil:
// If the time is empty, this probability belongs to the // If the time is empty, this probability belongs to the
// previous change. // next change.
if item.Probability.Time == "" { if item.Probability.Time == "" {
prob, err := strconv.Atoi(item.Probability.Value) prob, err := strconv.Atoi(item.Probability.Value)
if err != nil { if err != nil {
return nil, participle.Errorf(item.Probability.Pos, "prob: %s", err) return nil, participle.Errorf(item.Probability.Pos, "prob: %s", err)
} }
setField(out, "Probability", prob) // Set the setProb variable. This will let the decoder know to add it to the next change.
setProb = prob
} else { } else {
pr := &Probability{} pr := &Probability{}

View File

@ -520,7 +520,6 @@ func TestUUEE(t *testing.T) {
Altitude: 400, Altitude: 400,
}, },
}, },
Probability: 40,
}, },
{ {
Type: Temporary, Type: Temporary,
@ -538,6 +537,7 @@ func TestUUEE(t *testing.T) {
Obscuration: Fog, Obscuration: Fog,
}, },
}, },
Probability: 40,
}, },
{ {
Type: Becoming, Type: Becoming,
@ -553,7 +553,6 @@ func TestUUEE(t *testing.T) {
Speed: 6, Speed: 6,
Unit: units.MetersPerSecond, Unit: units.MetersPerSecond,
}, },
Probability: 40,
}, },
{ {
Type: Temporary, Type: Temporary,
@ -576,6 +575,7 @@ func TestUUEE(t *testing.T) {
Precipitation: Rain, Precipitation: Rain,
}, },
}, },
Probability: 40,
}, },
}, },
} }
@ -651,7 +651,6 @@ func TestEGLL(t *testing.T) {
Altitude: 700, Altitude: 700,
}, },
}, },
Probability: 30,
}, },
{ {
Type: Temporary, Type: Temporary,
@ -670,6 +669,7 @@ func TestEGLL(t *testing.T) {
Altitude: 400, Altitude: 400,
}, },
}, },
Probability: 30,
}, },
{ {
Type: Becoming, Type: Becoming,