Spaces:
Running
Running
import os | |
import subprocess | |
import tempfile | |
from pathlib import Path | |
from src.generic_eval import main | |
LANG_NAME = "Rust" | |
LANG_EXT = ".rs" | |
def eval_script(path: Path): | |
basename = ".".join(str(path).split(".")[:-1]) | |
try: | |
build = subprocess.run(["rustc", path, "-o", basename], capture_output=True, timeout=15) | |
except subprocess.TimeoutExpired as exc: | |
return { | |
"status": "Timeout", | |
"exit_code": -1, | |
"stdout": "Compiler timeout", | |
"stderr": "Compiler timeout", | |
} | |
status = None | |
returncode = -1 | |
output = None | |
if build.returncode != 0: | |
# Well, it's a compile error. May be a type error or | |
# something. But, why break the set convention | |
status = "SyntaxError" | |
returncode = build.returncode | |
output = build | |
else: | |
try: | |
# Assumes exit-code 0 is all okay | |
output = subprocess.run([basename], capture_output=True, timeout=5) | |
returncode = output.returncode | |
if output.returncode == 0: | |
status = "OK" | |
else: | |
# Well, it's a panic | |
status = "Exception" | |
except subprocess.TimeoutExpired as exc: | |
status = "Timeout" | |
output = exc | |
os.remove(basename) | |
return { | |
"status": status, | |
"exit_code": returncode, | |
"stdout": "" if output.stdout is None else output.stdout.decode("utf-8"), | |
"stderr": "" if output.stderr is None else output.stderr.decode("utf-8"), | |
} | |
if __name__ == "__main__": | |
main(eval_script, LANG_NAME, LANG_EXT) | |