-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmylang_rest_server.py
73 lines (55 loc) · 2.03 KB
/
mylang_rest_server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/usr/bin/python3
from flask import Flask, request, render_template, send_from_directory
from mylang.shared import StringLogger, set_global_logger, get_global_logger
from mylang.language_errors import LogoSyntaxError, BaseLanguageException
from mylang.lexer import Lexer
from mylang.parser_logo import Parser
from mylang.text_reader import StringReader
from dataclasses import asdict
app = Flask(__name__,
template_folder="./web_interface",
static_url_path="/static",
static_folder="./web_interface")
set_global_logger(StringLogger())
@app.route('/', methods=["GET"])
def get_root():
print("get")
# TODO return a simple website
return render_template("./index.html")
@app.route('/', methods=["POST"])
def post_code():
print("Post")
print(request.form)
parsed_json = request.get_json()
code = parsed_json["code"]
print("Got code: ", code, "\nexecuting...")
log, canvas, error = execute_code(code)
response = {}
response["log"] = log
response["canvas"] = canvas
response["error"] = error
return response
def execute_code(code: str):
reader = StringReader(code)
lexer = Lexer(reader, get_global_logger())
try:
program = Parser(lexer, get_global_logger()).parse_program()
program.execute()
except BaseLanguageException as exc:
error_msg = f"Error: {str(exc)}\n"
error_msg += f"At: {exc.location}\n"
error_msg += reader.get_loc_region(exc.location)
return ("", None, error_msg)
canvas = asdict(program.get_canvas())
#TODO limit number of workers in flask
logger_string = get_global_logger().out_string
get_global_logger().out_string = ""
return (logger_string, canvas, None)
@app.after_request
def after_request(response):
response.headers['Access-Control-Allow-Origin'] = "*"
response.headers['Access-Control-Allow-Methods'] = 'PUT,GET,POST,DELETE'
response.headers['Access-Control-Allow-Headers'] = 'Content-Type'
return response
if __name__ == '__main__':
app.run()