summaryrefslogtreecommitdiffstats
path: root/src/aristaproto/plugin/main.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/aristaproto/plugin/main.py')
-rwxr-xr-xsrc/aristaproto/plugin/main.py52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/aristaproto/plugin/main.py b/src/aristaproto/plugin/main.py
new file mode 100755
index 0000000..aff3614
--- /dev/null
+++ b/src/aristaproto/plugin/main.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+from aristaproto.lib.google.protobuf.compiler import (
+ CodeGeneratorRequest,
+ CodeGeneratorResponse,
+)
+from aristaproto.plugin.models import monkey_patch_oneof_index
+from aristaproto.plugin.parser import generate_code
+
+
+def main() -> None:
+ """The plugin's main entry point."""
+ # Read request message from stdin
+ data = sys.stdin.buffer.read()
+
+ # Apply Work around for proto2/3 difference in protoc messages
+ monkey_patch_oneof_index()
+
+ # Parse request
+ request = CodeGeneratorRequest()
+ request.parse(data)
+
+ dump_file = os.getenv("ARISTAPROTO_DUMP")
+ if dump_file:
+ dump_request(dump_file, request)
+
+ # Generate code
+ response = generate_code(request)
+
+ # Serialise response message
+ output = response.SerializeToString()
+
+ # Write to stdout
+ sys.stdout.buffer.write(output)
+
+
+def dump_request(dump_file: str, request: CodeGeneratorRequest) -> None:
+ """
+ For developers: Supports running plugin.py standalone so its possible to debug it.
+ Run protoc (or generate.py) with ARISTAPROTO_DUMP="yourfile.bin" to write the request to a file.
+ Then run plugin.py from your IDE in debugging mode, and redirect stdin to the file.
+ """
+ with open(str(dump_file), "wb") as fh:
+ sys.stderr.write(f"\033[31mWriting input from protoc to: {dump_file}\033[0m\n")
+ fh.write(request.SerializeToString())
+
+
+if __name__ == "__main__":
+ main()