Skip to content

build typescript and python error files #21623

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 11 commits into
base: devel
Choose a base branch
from
91 changes: 85 additions & 6 deletions utils/generateErrorfile.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/env python3
from __future__ import print_function
import csv, sys, os.path, re, io
from pathlib import Path

# wrap text after x characters
def wrap(string, width=80, ind1=0, ind2=0, prefix=''):
Expand All @@ -19,13 +20,70 @@ def wrap(string, width=80, ind1=0, ind2=0, prefix=''):

return newstring + string

def to_camel_case(snake_str):
return "".join(x.capitalize() for x in snake_str.lower().split("_"))

# generate javascript file from errors
def genJsFile(errors):
def genGoFile(errors, version):

out = prologue\
+ f"/// ArangoDB {version}\n"\
"package driver\nconst ("

# print individual errors
i = 0
for e in errors:
name = to_camel_case(e[0][6:])
msg = e[2].replace("\n", " ").replace("\\", "").replace("\"", "\\\"")
out = f"{out}\n Err{name.ljust(70)} = {e[1]}"
out += "\n)\n"
return out

def genTsFile(errors, version):
out = f"/*jshint maxlen: 240 */\n\n{prologue}\n/// ArangoDB {version}"
# print individual errors
for e in errors:
name = e[0]
msg = e[2].replace("\n", " ").replace("\\", "").replace("\"", "\\\"")
out = f"{out}export const {name.ljust(70)} = {e[1]};\n"

out += "export const errors = {\n"
i=0
for e in errors:
name = e[0]
msg = e[2].replace("\n", " ").replace("\\", "").replace("\"", "\\\"")
out = f"""{out} {name.ljust(30)}: {{
"code" : {e[1]},
"message" : "{msg}"
}}"""

i = i + 1

if i < len(errors):
out = out + ",\n"
else:
out = out + "\n};\n"

out += """
export type ErrorType = keyof typeof errors;
export function fromCode(code: number): ErrorType {
for (const [key, value] of Object.entries(errors)) {
if (value.code === code) {
return key as ErrorType;
}
}
return "ERROR_FAILED";
}
"""
return out

# generate javascript file from errors
def genJsFile(errors, version):
jslint = "/*jshint maxlen: 240 */\n\n"

out = jslint \
+ prologue\
+ f"/// ArangoDB {version}\n"\
+ "(function () {\n"\
+ " \"use strict\";\n"\
+ " var internal = require(\"internal\");\n"\
Expand Down Expand Up @@ -58,6 +116,18 @@ def genJsFile(errors):

return out

# generate javascript file from errors
def genPyFile(errors, version):
out = f'''""" arangodb {version} error codes generated by utils/generateErrorfile.py """'''

# print individual errors
i = 0
for e in errors:
name = e[0][6:]
msg = e[2].replace("\n", " ").replace("\\", "").replace("\"", "\\\"")
out = f"{out}\n\n# {e[2].strip()}\n{name.ljust(70)} = {e[1]}"
return out + "\n"

def quotedErrorMessage(error):
msg = error[2].replace("\n", " ").replace("\\", "").replace("\"", "\\\"")
return "\"" + msg + "\""
Expand Down Expand Up @@ -127,16 +197,19 @@ def genErrorRegistryHeaderFile(errors):
return template.format(numErrorMessages = len(errors), initializerList = initializerList)


# define some globals
prologue = "/// auto-generated file generated from errors.dat\n"\
+ "\n"

if len(sys.argv) < 3:
print("usage: {} <sourcefile> <outfile>".format(sys.argv[0]), file=sys.stderr)
sys.exit(1)

source = sys.argv[1]

version = (Path(source).parent / ".." / ".." / "ARANGO-VERSION").read_text().strip()

# define some globals
prologue = "/// auto-generated file generated from errors.dat\n"\
+ "\n"


# read input file

errors = []
Expand Down Expand Up @@ -167,7 +240,13 @@ def genErrorRegistryHeaderFile(errors):
filename = basename if extension != ".tmp" else os.path.splitext(basename)[0]

if filename == "errors.js":
out = genJsFile(errorsList)
out = genJsFile(errorsList, version)
elif filename == "errors.ts":
out = genTsFile(errorsList, version)
elif filename == "errno.py":
out = genPyFile(errorsList, version)
elif filename == "error.go":
out = genGoFile(errorsList, version)
elif filename == "voc-errors.h":
out = genCHeaderFile(errorsList)
elif filename == "error-registry.h":
Expand Down