int test_sky_lua_generate_header() { importtmp("tests/fixtures/sky_lua/0/data.json"); sky_table *table = sky_table_create(); table->path = bfromcstr("tmp"); sky_table_open(table); struct tagbstring source = bsStatic( "function aggregate(event)\n" " label = event:first_name() .. ' ' .. event:last_name()\n" " return event.x + event.y\n" "end\n" ); bstring event_decl = NULL; bstring event_metatype = NULL; bstring init_descriptor_func = NULL; int rc = sky_lua_generate_event_info(&source, table->property_file, &event_decl, &event_metatype, &init_descriptor_func); mu_assert_int_equals(rc, 0); mu_assert_bstring(event_decl, "typedef struct {\n" " int64_t ts;\n" " uint32_t timestamp;\n" " uint16_t action_id;\n" " sky_string_t _first_name;\n" " sky_string_t _last_name;\n" " int32_t x;\n" " int32_t y;\n" "} sky_lua_event_t;" ); mu_assert_bstring(event_metatype, "ffi.metatype('sky_lua_event_t', {\n" " __index = {\n" " first_name = function(event) return ffi.string(event._first_name.data, event._first_name.length) end,\n" " last_name = function(event) return ffi.string(event._last_name.data, event._last_name.length) end,\n" " x = function(event) return event.x end,\n" " y = function(event) return event.y end,\n" " }\n" "})\n" ); mu_assert_bstring(init_descriptor_func, "function sky_init_descriptor(_descriptor)\n" " descriptor = ffi.cast('sky_data_descriptor_t*', _descriptor)\n" " descriptor:set_data_sz(ffi.sizeof('sky_lua_event_t'));\n" " descriptor:set_ts_offset(ffi.offsetof('sky_lua_event_t', 'ts'));\n" " descriptor:set_timestamp_offset(ffi.offsetof('sky_lua_event_t', 'timestamp'));\n" " descriptor:set_action_id_offset(ffi.offsetof('sky_lua_event_t', 'action_id'));\n" " descriptor:set_property(4, ffi.offsetof('sky_lua_event_t', '_first_name'), 1);\n" " descriptor:set_property(5, ffi.offsetof('sky_lua_event_t', '_last_name'), 1);\n" " descriptor:set_property(2, ffi.offsetof('sky_lua_event_t', 'x'), 2);\n" " descriptor:set_property(3, ffi.offsetof('sky_lua_event_t', 'y'), 2);\n" "end\n" ); bdestroy(event_decl); bdestroy(event_metatype); bdestroy(init_descriptor_func); sky_table_free(table); return 0; }
// Generates the LuaJIT header given a Lua script and a property file. The // header file is generated based on the property usage of the 'event' // variable in the script. // // source - The source code of the Lua script. // table - The table used for generation. // ret - A pointer to where the header contents should be returned. // // Returns 0 if successful, otherwise returns -1. int sky_lua_generate_header(bstring source, sky_table *table, bstring *ret) { int rc; bstring event_decl = NULL; bstring init_descriptor_func = NULL; assert(source != NULL); assert(table != NULL); assert(ret != NULL); // Initialize returned value. *ret = NULL; // Generate sky_lua_event_t declaration. rc = sky_lua_generate_event_info(source, table->property_file, &event_decl, &init_descriptor_func); check(rc == 0, "Unable to generate lua event header"); // Generate full header. *ret = bformat( "-- SKY GENERATED CODE BEGIN --\n" "local ffi = require(\"ffi\")\n" "ffi.cdef([[\n" "typedef struct sky_data_descriptor_t sky_data_descriptor_t;\n" "typedef struct sky_lua_path_iterator_t sky_lua_path_iterator_t;\n" "typedef struct sky_lua_cursor_t sky_lua_cursor_t;\n" "%s\n" "\n" "int sky_data_descriptor_set_timestamp_offset(sky_data_descriptor_t *descriptor, uint16_t offset);\n" "int sky_data_descriptor_set_action_id_offset(sky_data_descriptor_t *descriptor, uint16_t offset);\n" "int sky_data_descriptor_set_property(sky_data_descriptor_t *descriptor, int8_t property_id, uint16_t offset, int data_type);\n" "sky_lua_cursor_t *sky_lua_path_iterator_next(sky_lua_path_iterator_t *);\n" "sky_lua_event_t *sky_lua_cursor_next(sky_lua_cursor_t *);\n" "]])\n" "%s\n" "-- SKY GENERATED CODE END --\n\n", bdata(event_decl), bdata(init_descriptor_func) ); check_mem(*ret); bdestroy(event_decl); return 0; error: bdestroy(event_decl); bdestroy(*ret); *ret = NULL; return -1; }