summaryrefslogtreecommitdiff
path: root/tools/InterfaceGenerator/generator/generators/SmartFactoryJSONRPC.py
blob: f7241af30cfe709d69f072a6a9b64ee91c4729f2 (plain)
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
"""SmartFactory code generator for JSONRPC format.

Defines JSONRPC format specific code generation rules.

"""
import string

from generator.generators import SmartFactoryBase
from model.enum_element import EnumElement


class CodeGenerator(SmartFactoryBase.CodeGenerator):

    """JSONRPC SmartFactory generator.

    Defines special cases that affects base code generation to make JSONRPC
    format-friendly code.

    """

    def __init__(self):
        """Construct new object."""

        SmartFactoryBase.CodeGenerator.__init__(self)

    def _gen_pre_function_schemas(self, functions):
        """Generate specific code that goes before schema initialization.

        JSON RPC generator generates code that adds specific schema for the
        error_response and adds this schema for every available response.

        Keyword arguments:
        functions -- list of functions to generate code for.

        Returns:
        Source code with error_response schema initialization and adding to the
        base SmartFactory..

        """

        code = u""
        for function in functions:
            if function.message_type.primary_name == u"response":
                code = u"".join(
                    [code, self._error_response_insert_template.substitute(
                        function_id=function.function_id.primary_name)])

        if code:
            return self._indent_code(
                u"".join([self._error_response_schema_template, code]), 1)

        return u""

    def _preprocess_message_type(self, message_type):
        """Preprocess message_type enum.

        JSON RPC generator needs to add new message_type "error_response" in
        case if at least one response available.

        Keyword arguments:
        message_type -- message_type enum to preprocess.

        Returns:
        Preprocessed message_type enum.

        """

        if "response" in message_type.elements:
            message_type.elements[u"error_response"] = EnumElement(
                name=u"error_response")

        return message_type

    def _gen_schema_params_fill(self, message_type_name):
        """Generate schema params fill code.

        Provides constant set of params for the function in accordance to the
        JSONRPC format.

        Keyword arguments:
        message_type_name -- Name of the messageType enum element.

        Returns:
        String with function schema params fill code.

        """

        return u"".join(
            [self._base_params,
             self._correlation_id_param
                if message_type_name != u"notification" else u"",
             self._additional_response_params
                if message_type_name == u"response" else u""])

    _error_response_insert_template = string.Template(
        u'''functions_schemes_.insert(std::make_pair('''
        u'''ns_smart_device_link::ns_json_handler::'''
        u'''SmartSchemaKey<FunctionID::eType, messageType::eType>('''
        u'''FunctionID::${function_id}, messageType::error_response), '''
        u'''error_response_schema));\n''')

    _error_response_schema_template = (
        u'''Members '''
        u'''params_members;\n'''
        u'''params_members[ns_smart_device_link::ns_json_handler::'''
        u'''strings::S_FUNCTION_ID] = SMember('''
        u'''TEnumSchemaItem<FunctionID::eType>::create('''
        u'''function_id_items), true);\n'''
        u'''params_members[ns_smart_device_link::ns_json_handler::'''
        u'''strings::S_MESSAGE_TYPE] = SMember('''
        u'''TEnumSchemaItem<messageType::eType>::create('''
        u'''message_type_items), true);\n'''
        u'''params_members[ns_smart_device_link::ns_json_handler::'''
        u'''strings::S_PROTOCOL_VERSION] = SMember('''
        u'''TNumberSchemaItem<int>::create(), true);\n'''
        u'''params_members[ns_smart_device_link::ns_json_handler::'''
        u'''strings::S_PROTOCOL_TYPE] = SMember('''
        u'''TNumberSchemaItem<int>::create(), true);\n'''
        u'''params_members[ns_smart_device_link::ns_json_handler::'''
        u'''strings::S_CORRELATION_ID] = SMember('''
        u'''TNumberSchemaItem<int>::create(), true);\n'''
        u'''params_members[ns_smart_device_link::ns_json_handler::'''
        u'''strings::kCode] = SMember('''
        u'''TNumberSchemaItem<int>::create(), true);\n'''
        u'''params_members[ns_smart_device_link::ns_json_handler::'''
        u'''strings::kMessage] = SMember('''
        u'''CStringSchemaItem::create(), true);\n'''
        u'''\n'''
        u'''Members root_members_map;\n'''
        u'''root_members_map[ns_smart_device_link::ns_json_handler::'''
        u'''strings::S_PARAMS] = SMember('''
        u'''CObjectSchemaItem::create(params_members), true);\n'''
        u'''\n'''
        u'''CSmartSchema error_response_schema('''
        u'''CObjectSchemaItem::create(root_members_map));\n'''
        u'''\n''')

    _base_params = (
        u'''params_members[ns_smart_device_link::ns_json_handler::'''
        u'''strings::S_FUNCTION_ID] = SMember(TEnumSchemaItem<FunctionID::eType>::'''
        u'''create(function_id_items), true);\n'''
        u'''params_members[ns_smart_device_link::ns_json_handler::'''
        u'''strings::S_MESSAGE_TYPE] = SMember(TEnumSchemaItem<messageType::eType>::'''
        u'''create(message_type_items), true);\n'''
        u'''params_members[ns_smart_device_link::ns_json_handler::'''
        u'''strings::S_PROTOCOL_VERSION] = SMember(TNumberSchemaItem<int>::create(), true);\n'''
        u'''params_members[ns_smart_device_link::ns_json_handler::'''
        u'''strings::S_PROTOCOL_TYPE] = SMember(TNumberSchemaItem<int>::create(), true);\n'''
    )

    _correlation_id_param = (
        u'''params_members[ns_smart_device_link::ns_json_handler::'''
        u'''strings::S_CORRELATION_ID] = SMember(TNumberSchemaItem<int>::create(), true);\n'''
    )

    _additional_response_params = (
        u'''params_members[ns_smart_device_link::ns_json_handler::'''
        u'''strings::kCode] = SMember(TNumberSchemaItem<int>::create(), true);\n'''
    )