taf/internal/parser/parser.go
2023-09-23 18:16:18 -07:00

100 lines
2.2 KiB
Go

package parser
import (
"github.com/alecthomas/participle/v2"
"github.com/alecthomas/participle/v2/lexer"
)
type AST struct {
Type *string `(@Type WS)?`
Items []*Item `@@*`
}
type Item struct {
Pos lexer.Position
Time *string `( @Number "Z" WS`
Valid *ValidPair ` @@`
Probability *Probability `| @@`
Change *Change `| @@`
WindSpeed *WindSpeed `| @@`
Visibility *Visibility `| @@`
SkyCondition *SkyCondition `| @@`
Vicinity *Vicinity `| @@`
Weather *Weather `| @@`
Temperature *Temperature `| @@`
Flag *Flag `| @@`
Remark *string `| @Remark`
ID *string `| @Ident ) WS?`
}
type ValidPair struct {
Pos lexer.Position
Start string `@Number "/"`
End string `@Number`
}
type Probability struct {
Pos lexer.Position
Value string `Prob @Number`
Valid ValidPair `(WS @@)?`
}
type WindSpeed struct {
Pos lexer.Position
WindShear string `("WS" @Number "/")?`
Variable bool `@"VRB"?`
Value string `@Number`
Gusts string `("G" @Number)?`
Unit string `@("MPS"|"KMH"|"KT")`
}
type Visibility struct {
Pos lexer.Position
Plus bool `@"P"?`
Value string `@Number @WS? @(Number? "/" Number)?`
Unit string `@"SM"?`
}
type SkyCondition struct {
Pos lexer.Position
Type string `@("FEW"|"SCT"|"BKN"|"OVC"|"VV"|"SKC")`
Altitude string `@Number?`
CloudType string `@("CB"|"TCU")?`
}
type Vicinity struct {
Pos lexer.Position
Descriptor string `"VC" ( @Descriptor`
Precipitation string ` | @Precip )`
}
type Weather struct {
Pos lexer.Position
Modifier string `@Modifier?`
Descriptor string `@Descriptor?`
Precipitation string ` ( @Precip`
Obscuration string ` | @Obscur`
Other string ` | @Phenom )`
}
type Change struct {
Pos lexer.Position
Type string `@("FM"|"BECMG"|"TEMPO")`
Time string `@Number?`
Valid *ValidPair `WS? @@?`
}
type Temperature struct {
Pos lexer.Position
Type string `@("TX"|"TN")`
Value string `@Number "/"`
Time string `@Number "Z"`
}
type Flag struct {
Pos lexer.Position
CAVOK bool `@"CAVOK"`
}
var Parser = participle.MustBuild[AST](participle.Lexer(lex))