protoc-gen-luau generates strictly typed Luau files from Protobuf files.
To use, clone the repo and run cargo install. When you run protoc, add --luau_out=path/to/protos. For example, to export protos in protos/ to src/LuauProtos/...
protoc -Iprotos --luau_out=src/LuauProtos
Add --luau_opt=roblox_imports=true to indicate you are in a Roblox environment. This currently replaces requires from string requires to instance based requires. I'm not actually sure this is necessary anymore though.
Suppose we have the following message:
message Pair {
double x = 1;
double y = 2;
}The exported script will have the following:
- Exported type
Pairrepresenting the Pair class - A
Pairclass with:Pair.new(partialFields): PairpartialFieldsin this case would be{ x: number?, y: number? }. Anything not specified will be defaulted as per Protobuf's rules.
Pair:encode(): buffer- Returns a buffer representing the serialized Protobuf.
Pair.decode(input: buffer): Pair- Deserializes a serialized Protobuf.
Pair:jsonEncode(): { [string]: any }- Returns a JSON encoded representation of the message as per Protobuf's rules.
Pair.jsonDecode(input: { [string]: any }): Pair- Deserializes a JSON encoded representation of the message as per Protobuf's rules.
Pair.descriptor: proto.Descriptor- A runtime representation of what the type is--just a struct with
{ name: string, fullName: string }.
- A runtime representation of what the type is--just a struct with
If we have the following:
enum Kind {
A = 0,
B = 1,
C = 2,
}The exported script will export a type Kind that is a union string of all the options, as well as number for when it is unspecified. In this case: "A" | "B" | "C" | number
Any is supported, though these docs are not ready yet.