bebop is a bebop parser written in Go, for generating Go code.
bebop can read .bop files and output .go files representing them:
mybebop.bop:
struct Foo {
Bar bar;
}
message Bar {
1 -> float64 x;
2 -> float64 y;
3 -> float64 z;
}
package main
import (
"github.com/200sc/bebop"
)
func main() {
f, _ := os.Open("mybebop.bop")
defer f.Close()
bopf, _ := bebop.ReadFile(f)
out, _ := os.Create("mybebop.go")
defer out.Close()
settings := bebop.GenerateSettings{
PackageName: "mybebop",
}
bopf.Generate(out, settings)
}
These files can then be used to encode and decode their represented records:
package server
import (
"github.com/my/project/mybebop"
"net"
)
func sendFoo(cn net.Conn) (success bool) {
fooReq := mybebop.FooRequest{
Bar: "buzz",
}
if err := fooReq.EncodeBebop(cn); err != nil {
// ...
}
fooResp := mybebop.FooResponse{}
if err := fooResp.DecodeBebop(cn); err != nil {
// ...
}
return fooResp.Success
}
At main/bebobc-go
there is a cli utility to take .bop files and produce .go files from them, what is effectively a
little more sophisticated version of the first example in this document.
At main/bebopfmt
there is a cli utility to format and rewrite bop files. It takes in a -w
argument to rewrite files in place, and accepts both directories and individual filepaths.
The following is a list of known issues with the current version of the project, ordered by approximate priority for addressing them.
-
We should be able to generate server code with handlers given all valid messages have op codes.
-
Tokenization and parsing could attempt corrective fixes to be able to report more than one error.
-
There are several incompatibilities between this compiler and the original compiler. These incompatibilities are documented (see testdata/incompatible), but we should attempt to resolve them. Trivially resolvable incompatibilities have been resolved already, remaining notes should involve raising upstream issues.
Original bebop compiler (C#, Typescript, ...): https://github.com/RainwayApp/bebop
In addition to defining the spec this package follows, most initial testdata was taken from the above project.