File: generate_statuscode.py

package info (click to toggle)
python-opcua 0.98.11-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 45,296 kB
  • sloc: xml: 579,866; cs: 124,455; python: 56,857; makefile: 164; sh: 37
file content (58 lines) | stat: -rw-r--r-- 1,923 bytes parent folder | download | duplicates (2)
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
# Load values from StatusCode.csv and then
# add values from StatusCodes_add.csv, but only
# if they are absent from StatusCode.csv
def status_codes():
    inputfile = open("StatusCodes_add.csv")
    additional = {}
    for line in inputfile:
        name, val, doc = line.split(",", 2)
        additional[int(val, 0)] = (name, val, doc)

    inputfile = open("StatusCode.csv")
    result = []
    for line in inputfile:
        name, val, doc = line.split(",", 2)
        result.append((name, val, doc))
        additional.pop(int(val, 0), None)
    add = [ additional[k] for k in sorted(additional.keys()) ]
    return add + result

if __name__ == "__main__":
    codes = status_codes()
    outputfile = open("../opcua/ua/status_codes.py", "w")
    outputfile.write("#AUTOGENERATED!!!\n")
    outputfile.write("\n")
    outputfile.write("from opcua.ua.uaerrors import UaStatusCodeError\n")
    #outputfile.write("from enum import Enum\n")
    outputfile.write("\n")

    outputfile.write("class StatusCodes(object):\n")
    for name, val, doc in codes:
        doc = doc.strip()
        outputfile.write("    {0} = {1}\n".format(name, val))
    outputfile.write("\n")
    outputfile.write("\n")

    outputfile.write("code_to_name_doc = {\n")
    for name, val, doc in codes:
        doc = doc.strip()
        doc = doc.replace("'", '"')
        outputfile.write("    {0}: ('{1}', '{2}'),\n".format(val, name, doc))
    outputfile.write("}\n")
    outputfile.write("\n")
    outputfile.write("\n")

    outputfile.write("""def get_name_and_doc(val):
    if val in code_to_name_doc:
        return code_to_name_doc[val]
    else:
        if val & 1 << 31:
            return 'Bad', 'Unknown StatusCode value: {}'.format(val)
        elif val & 1 << 30:
            return 'UncertainIn', 'Unknown StatusCode value: {}'.format(val)
        else:
            return 'Good', 'Unknown StatusCode value: {}'.format(val)
""")