#include "smart_json_wrapper.h" #include "KinematicsWebAPI.h" #include #include #include #include #include #include #include #include #include #include #include // ========== 内存管理辅助函数 ========== namespace { // 创建 WASM 内存中的字符串(使用 malloc 分配,与 JavaScript 的 _free 兼容) char *createWasmString(const std::string &str) { if (str.empty()) { char *buffer = (char *)malloc(1); if (buffer) { buffer[0] = '\0'; } return buffer; } size_t len = str.length(); char *buffer = (char *)malloc(len + 1); // +1 for null terminator if (buffer) { // 使用 std::copy 复制字符串内容 std::copy(str.begin(), str.end(), buffer); buffer[len] = '\0'; // 添加 null 终止符 } return buffer; } // 安全释放 WASM 字符串(使用 free 释放,与 JavaScript 的 _free 兼容) void freeWasmString(const char *str) { if (str) { free(const_cast(str)); } } } // ========== SmartResponse 实现 ========== std::string SmartResponse::toJson() const { std::stringstream ss; ss << "{"; ss << "\"success\":" << (success ? "true" : "false") << ","; ss << "\"code\":" << code << ","; ss << "\"msg\":\"" << msg << "\","; ss << "\"req_code\":\"" << req_code << "\","; ss << "\"req_cmd\":\"" << req_cmd << "\","; ss << "\"execution_time\":" << std::fixed << std::setprecision(3) << execution_time << ","; // 处理结果数据 ss << "\"res_data\":"; if (res_data.has_value()) { try { if (res_data.type() == typeid(int)) { ss << std::any_cast(res_data); } else if (res_data.type() == typeid(float)) { ss << std::fixed << std::setprecision(3) << std::any_cast(res_data); } else if (res_data.type() == typeid(double)) { ss << std::fixed << std::setprecision(3) << std::any_cast(res_data); } else if (res_data.type() == typeid(bool)) { ss << (std::any_cast(res_data) ? "true" : "false"); } else if (res_data.type() == typeid(std::string)) { ss << "\"" << std::any_cast(res_data) << "\""; } else if (res_data.type() == typeid(std::vector)) { auto arr = std::any_cast>(res_data); ss << "["; for (size_t i = 0; i < arr.size(); ++i) { if (i > 0) ss << ","; ss << arr[i]; } ss << "]"; } else { // 默认处理为字符串 ss << "\"complex_data\""; } } catch (const std::bad_any_cast &) { ss << "null"; } } else { ss << "null"; } // 执行信息 if (!execution_info.empty()) { ss << ",\"execution_info\":{"; bool first = true; for (const auto &[key, value] : execution_info) { if (!first) ss << ","; ss << "\"" << key << "\":\"" << value << "\""; first = false; } ss << "}"; } ss << "}"; return ss.str(); } SmartResponse SmartResponse::createSuccess(const std::string &req_code, const std::string &req_cmd, const std::any &data) { SmartResponse resp; resp.success = true; resp.code = 0; resp.msg = "操作成功"; resp.req_code = req_code; resp.req_cmd = req_cmd; resp.res_data = data; return resp; } SmartResponse SmartResponse::createError(const std::string &req_code, const std::string &req_cmd, int code, const std::string &msg) { SmartResponse resp; resp.success = false; resp.code = code; resp.msg = msg; resp.req_code = req_code; resp.req_cmd = req_cmd; return resp; } // ========== 字符串工具函数 ========== std::string SmartJsonProcessor::trim(const std::string &str) { size_t first = str.find_first_not_of(" \t\n\r"); if (first == std::string::npos) return ""; size_t last = str.find_last_not_of(" \t\n\r"); return str.substr(first, (last - first + 1)); } std::vector SmartJsonProcessor::split(const std::string &str, char delimiter) { std::vector tokens; std::stringstream ss(str); std::string token; while (std::getline(ss, token, delimiter)) { token = trim(token); if (!token.empty()) { tokens.push_back(token); } } return tokens; } // ========== SmartJsonProcessor 实现 ========== SmartJsonProcessor::SmartJsonProcessor() { registerMathFunctions(); } SmartJsonProcessor::~SmartJsonProcessor() { // 清理资源 } // ========== JSON 解析 ========== std::map SmartJsonProcessor::parseJsonParams(const std::string &json_str) { std::map params; // 简化JSON解析,解析键值对 std::regex param_regex("\"([^\"]+)\"\\s*:\\s*([^,}\\s\"]+|\"[^\"]*\")"); std::sregex_iterator it(json_str.begin(), json_str.end(), param_regex); std::sregex_iterator end; while (it != end) { std::smatch match = *it; std::string key = match[1].str(); std::string value = match[2].str(); // 移除引号 if (!value.empty() && value[0] == '"' && value.back() == '"') { value = value.substr(1, value.length() - 2); } params[key] = inferJsonValue(key, value); ++it; } // 特别处理数组参数 std::regex array_regex("\"([^\"]+)\"\\s*:\\s*\\[([^\\]]*)\\]"); it = std::sregex_iterator(json_str.begin(), json_str.end(), array_regex); while (it != end) { std::smatch match = *it; std::string key = match[1].str(); std::string array_str = match[2].str(); // 尝试解析为整数数组 auto int_array = parseIntArray(array_str); if (!int_array.empty()) { params[key] = int_array; } else { // 尝试解析为浮点数数组 auto float_array = parseFloatArray(array_str); if (!float_array.empty()) { params[key] = float_array; } } ++it; } return params; } std::any SmartJsonProcessor::inferJsonValue(const std::string &key, const std::string &value_str) { if (value_str.empty()) { return std::string(); } // 根据键名猜测类型 std::string lower_key = key; // std::transform(lower_key.begin(), lower_key.end(), lower_key.begin(), ::towlower); // std::transform(lower_key.begin(), lower_key.end(), lower_key.begin(), std::tolower); // 布尔值 if (value_str == "true" || value_str == "false") { return value_str == "true"; } // 尝试解析为数字 try { // 检查是否是整数 // if (value_str.find('.') == std::string::npos && value_str.find('e') == std::string::npos) // { // return std::stoi(value_str); // } // else // { // return std::stof(value_str); // } } catch (...) { // 不是数字,保持字符串 } return value_str; } std::vector SmartJsonProcessor::parseIntArray(const std::string &array_str) { std::vector result; auto tokens = split(array_str, ','); for (const auto &token : tokens) { try { result.push_back(std::stoi(trim(token))); } catch (...) { // 转换失败,清空数组并返回 result.clear(); break; } } return result; } std::vector SmartJsonProcessor::parseFloatArray(const std::string &array_str) { std::vector result; auto tokens = split(array_str, ','); for (const auto &token : tokens) { try { result.push_back(std::stof(trim(token))); } catch (...) { // 转换失败,清空数组并返回 result.clear(); break; } } return result; } // ========== 数学函数注册 ========== void SmartJsonProcessor::registerMathFunctions() { auto ®istry = FunctionRegistry::instance(); // 1. add 函数 auto add_func = std::make_shared("add", "整数加法"); add_func->addParam("a", ParamType::INT, 0) .addParam("b", ParamType::INT, 0) .addAlias("a", {"num1", "first", "x", "operand1", "left"}) .addAlias("b", {"num2", "second", "y", "operand2", "right"}) .setHandler([](const std::vector &args) -> std::any { if (args.size() >= 2) { int a = 0, b = 0; try { a = std::any_cast(args[0]); b = std::any_cast(args[1]); } catch (...) { // 尝试转换 if (args[0].type() == typeid(float)) a = static_cast(std::any_cast(args[0])); if (args[1].type() == typeid(float)) b = static_cast(std::any_cast(args[1])); } return add(a, b); } return 0; }); registry.registerFunction(add_func); // 2. subtract 函数 auto sub_func = std::make_shared("subtract", "整数减法"); sub_func->addParam("a", ParamType::INT, 0) .addParam("b", ParamType::INT, 0) .addAlias("a", {"num1", "minuend", "x"}) .addAlias("b", {"num2", "subtrahend", "y"}) .setHandler([](const std::vector &args) -> std::any { if (args.size() >= 2) { int a = 0, b = 0; try { a = std::any_cast(args[0]); b = std::any_cast(args[1]); } catch (...) { if (args[0].type() == typeid(float)) a = static_cast(std::any_cast(args[0])); if (args[1].type() == typeid(float)) b = static_cast(std::any_cast(args[1])); } return subtract(a, b); } return 0; }); registry.registerFunction(sub_func); // 3. multiply 函数 auto mul_func = std::make_shared("multiply", "乘法运算"); mul_func->addParam("a", ParamType::FLOAT, 0.0f) .addParam("b", ParamType::FLOAT, 0.0f) .addAlias("a", {"num1", "factor1", "x", "multiplicand"}) .addAlias("b", {"num2", "factor2", "y", "multiplier"}) .setHandler([](const std::vector &args) -> std::any { if (args.size() >= 2) { float a = 0.0f, b = 0.0f; try { if (args[0].type() == typeid(float)) a = std::any_cast(args[0]); else if (args[0].type() == typeid(int)) a = static_cast(std::any_cast(args[0])); if (args[1].type() == typeid(float)) b = std::any_cast(args[1]); else if (args[1].type() == typeid(int)) b = static_cast(std::any_cast(args[1])); } catch (...) { // 使用默认值 } return multiply(a, b); } return 0.0f; }); registry.registerFunction(mul_func); // 4. divide 函数 auto div_func = std::make_shared("divide", "除法运算"); div_func->addParam("a", ParamType::FLOAT, 0.0f) .addParam("b", ParamType::FLOAT, 1.0f) .addAlias("a", {"numerator", "dividend", "x"}) .addAlias("b", {"denominator", "divisor", "y"}) .setHandler([](const std::vector &args) -> std::any { if (args.size() >= 2) { float a = 0.0f, b = 1.0f; try { if (args[0].type() == typeid(float)) a = std::any_cast(args[0]); else if (args[0].type() == typeid(int)) a = static_cast(std::any_cast(args[0])); if (args[1].type() == typeid(float)) b = std::any_cast(args[1]); else if (args[1].type() == typeid(int)) b = static_cast(std::any_cast(args[1])); } catch (...) { // 使用默认值 } if (b == 0.0f) { throw std::runtime_error("除数不能为零"); } return divide(a, b); } return 0.0f; }); registry.registerFunction(div_func); // 5. fibonacci 函数 auto fib_func = std::make_shared("fibonacci", "斐波那契数列"); fib_func->addParam("n", ParamType::INT, 0) .addAlias("n", {"number", "index", "term", "position"}) .setHandler([](const std::vector &args) -> std::any { if (!args.empty()) { int n = 0; try { n = std::any_cast(args[0]); } catch (...) { if (args[0].type() == typeid(float)) n = static_cast(std::any_cast(args[0])); } if (n < 0) n = 0; if (n > 40) n = 40; // 限制大小避免性能问题 return fibonacci(n); } return 0; }); registry.registerFunction(fib_func); // 6. create_buffer 函数 auto create_buf_func = std::make_shared("create_buffer", "创建缓冲区"); create_buf_func->addParam("size", ParamType::INT, 1024) .addAlias("size", {"length", "capacity", "bytes"}) .setHandler([](const std::vector &args) -> std::any { if (!args.empty()) { int size = 1024; try { size = std::any_cast(args[0]); } catch (...) { if (args[0].type() == typeid(float)) size = static_cast(std::any_cast(args[0])); } if (size <= 0) size = 1024; if (size > 1024 * 1024) size = 1024 * 1024; // 限制1MB void* buffer = create_buffer(size); std::stringstream ss; ss << "0x" << std::hex << reinterpret_cast(buffer); return ss.str(); } return "null"; }); registry.registerFunction(create_buf_func); // 7. compute_sum 函数 auto sum_func = std::make_shared("compute_sum", "数组求和"); sum_func->addParam("array", ParamType::INT_ARRAY, std::vector()) .addAlias("array", {"arr", "list", "values", "numbers"}) .setHandler([](const std::vector &args) -> std::any { if (!args.empty()) { try { auto arr = std::any_cast>(args[0]); if (arr.empty()) return 0; return compute_sum(arr.data(), static_cast(arr.size())); } catch (...) { return 0; } } return 0; }); registry.registerFunction(sum_func); // 8. get_greeting 函数 auto greet_func = std::make_shared("get_greeting", "获取问候语"); greet_func->setHandler([](const std::vector &args) -> std::any { const char* greeting = get_greeting(); return std::string(greeting); }); registry.registerFunction(greet_func); } // ========== 主处理函数 ========== SmartResponse SmartJsonProcessor::processRequest(const std::string &json_request) { auto start_time = std::chrono::high_resolution_clock::now(); try { // 1. 解析基础信息 std::string req_code = "REQ_" + std::to_string(std::chrono::system_clock::now().time_since_epoch().count()); std::string req_cmd = "unknown"; // 简化解析req_cmd std::regex cmd_regex("\"req_cmd\"\\s*:\\s*\"([^\"]+)\""); std::smatch match; if (std::regex_search(json_request, match, cmd_regex)) { req_cmd = match[1].str(); } // 2. 获取函数信息 auto ®istry = FunctionRegistry::instance(); auto func_info = registry.getFunction(req_cmd); if (!func_info) { return SmartResponse::createError(req_code, req_cmd, 1001, "未找到函数: " + req_cmd); } // 3. 解析参数 auto input_params = parseJsonParams(json_request); // 4. 智能参数匹配 auto matched_params = registry.smartMatchParams(func_info, input_params); // 5. 验证参数 std::string error_msg; if (!func_info->validateParams(matched_params, error_msg)) { return SmartResponse::createError(req_code, req_cmd, 1002, error_msg); } // 6. 准备调用参数 std::vector call_args; for (const auto ¶m : func_info->params) { auto it = matched_params.find(param.name); if (it != matched_params.end()) { call_args.push_back(it->second); } else if (param.default_value.has_value()) { call_args.push_back(param.default_value); } else { call_args.push_back(std::any()); // 空值 } } // 7. 执行函数 std::any result; try { result = func_info->handler(call_args); } catch (const std::exception &e) { return SmartResponse::createError(req_code, req_cmd, 3001, std::string("执行错误: ") + e.what()); } // 8. 构建响应 auto response = SmartResponse::createSuccess(req_code, req_cmd, result); // 9. 添加执行信息 response.execution_info["matched_params"] = std::to_string(matched_params.size()); response.execution_info["function"] = func_info->name; // 10. 计算执行时间 auto end_time = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast( end_time - start_time); response.execution_time = duration.count() / 1000.0; return response; } catch (const std::exception &e) { return SmartResponse::createError("ERROR", "unknown", 5001, std::string("处理异常: ") + e.what()); } } std::map> SmartJsonProcessor::getAvailableFunctions() const { auto ®istry = FunctionRegistry::instance(); return registry.getAllFunctions(); } std::string SmartJsonProcessor::getFunctionInfo(const std::string &func_name) const { auto ®istry = FunctionRegistry::instance(); auto func_info = registry.getFunction(func_name); if (!func_info) { return "函数未找到: " + func_name; } std::stringstream ss; ss << "函数: " << func_info->name << "\n"; ss << "描述: " << func_info->description << "\n"; ss << "参数:\n"; for (const auto ¶m : func_info->params) { ss << " - " << param.name << " (" << param.getTypeName() << ")"; if (param.is_optional) ss << " [可选]"; if (param.default_value.has_value()) { ss << " [默认: "; try { if (param.type == ParamType::INT) ss << param.convert(param.default_value); else if (param.type == ParamType::FLOAT) ss << param.convert(param.default_value); else if (param.type == ParamType::STRING) ss << param.convert(param.default_value); } catch (...) { ss << "unknown"; } ss << "]"; } ss << "\n"; } return ss.str(); } // ========== WASM 导出函数 ========== static SmartJsonProcessor *g_smart_processor = nullptr; // 信号处理 static KinematicsWebAPI *global_server = nullptr; EMSCRIPTEN_KEEPALIVE const char *init_func() { try { if (!global_server) { global_server = new KinematicsWebAPI(); } if (!global_server) { auto error = SmartResponse::createError("ERROR", "unknown", 1001, "init_func 请求数据为空"); return createWasmString(error.toJson()); } auto response = SmartResponse::createSuccess("req_code", "init_func"); return createWasmString(response.toJson()); } catch (const std::exception &e) { auto error = SmartResponse::createError("ERROR", "unknown", 5001, std::string("处理异常: ") + e.what()); return createWasmString(error.toJson()); } } EMSCRIPTEN_KEEPALIVE const char *func(const char *json_request) { if (!global_server) { // 注意:这里需要动态分配,否则作用域结束会被销毁 global_server = new KinematicsWebAPI(); } try { if (!json_request) { auto error = SmartResponse::createError("ERROR", "unknown", 1001, "请求数据为空"); return createWasmString(error.toJson()); } std::string request_str(json_request); std::string response_str = global_server->func(request_str); return createWasmString(response_str); } catch (const std::exception &e) { auto error = SmartResponse::createError("ERROR", "unknown", 5001, std::string("处理异常: ") + e.what()); return createWasmString(error.toJson()); } } EMSCRIPTEN_KEEPALIVE const char *smart_process_json(const char *json_request) { if (!g_smart_processor) { g_smart_processor = new SmartJsonProcessor(); } try { if (!json_request) { auto error = SmartResponse::createError("ERROR", "unknown", 1001, "请求数据为空"); return createWasmString(error.toJson()); } std::string request_str(json_request); auto response = g_smart_processor->processRequest(request_str); return createWasmString(response.toJson()); } catch (const std::exception &e) { auto error = SmartResponse::createError("ERROR", "unknown", 5001, std::string("处理异常: ") + e.what()); return createWasmString(error.toJson()); } } EMSCRIPTEN_KEEPALIVE const char *smart_get_function_list() { if (!g_smart_processor) { g_smart_processor = new SmartJsonProcessor(); } try { auto functions = g_smart_processor->getAvailableFunctions(); std::stringstream ss; ss << "["; bool first = true; for (const auto &[name, func_info] : functions) { if (!first) ss << ","; ss << "{"; ss << "\"name\":\"" << name << "\","; ss << "\"description\":\"" << func_info->description << "\","; ss << "\"params\":["; bool first_param = true; for (const auto ¶m : func_info->params) { if (!first_param) ss << ","; ss << "{"; ss << "\"name\":\"" << param.name << "\","; ss << "\"type\":\"" << param.getTypeName() << "\","; ss << "\"optional\":" << (param.is_optional ? "true" : "false"); ss << "}"; first_param = false; } ss << "]"; ss << "}"; first = false; } ss << "]"; std::string result_str = ss.str(); return createWasmString(result_str); } catch (const std::exception &e) { std::string error = "{\"error\":\"" + std::string(e.what()) + "\"}"; return createWasmString(error); } } EMSCRIPTEN_KEEPALIVE const char *smart_get_function_info(const char *func_name) { if (!g_smart_processor) { g_smart_processor = new SmartJsonProcessor(); } try { if (!func_name) { std::string error = "{\"error\":\"函数名不能为空\"}"; return createWasmString(error); } std::string info = g_smart_processor->getFunctionInfo(func_name); return createWasmString(info); } catch (const std::exception &e) { std::string error = "{\"error\":\"" + std::string(e.what()) + "\"}"; return createWasmString(error); } } EMSCRIPTEN_KEEPALIVE const char *smart_test_match(const char *json_request) { if (!g_smart_processor) { g_smart_processor = new SmartJsonProcessor(); } try { if (!json_request) { auto error = SmartResponse::createError("TEST", "test", 1001, "请求数据为空"); return createWasmString(error.toJson()); } // 演示智能匹配过程 std::string request_str(json_request); // 解析请求 std::regex cmd_regex("\"req_cmd\"\\s*:\\s*\"([^\"]+)\""); std::smatch match; std::string req_cmd = "unknown"; if (std::regex_search(request_str, match, cmd_regex)) { req_cmd = match[1].str(); } auto ®istry = FunctionRegistry::instance(); auto func_info = registry.getFunction(req_cmd); if (!func_info) { auto error = SmartResponse::createError("TEST", req_cmd, 1001, "未找到函数: " + req_cmd); error.execution_info["test_type"] = "function_not_found"; return createWasmString(error.toJson()); } // 解析参数 SmartJsonProcessor processor; auto input_params = processor.parseJsonParams(request_str); // 智能匹配 auto matched_params = registry.smartMatchParams(func_info, input_params); // 显示匹配结果 std::stringstream ss; ss << "{\"test\":\"smart_match\","; ss << "\"function\":\"" << func_info->name << "\","; ss << "\"description\":\"" << func_info->description << "\","; ss << "\"input_params\":["; bool first = true; for (const auto &[key, value] : input_params) { if (!first) ss << ","; ss << "{\"key\":\"" << key << "\","; ss << "\"type\":\"" << static_cast(registry.deduceParamType(value)) << "\"}"; first = false; } ss << "],"; ss << "\"matched_params\":["; first = true; for (const auto &[key, value] : matched_params) { if (!first) ss << ","; ss << "{\"key\":\"" << key << "\","; ss << "\"type\":\"" << static_cast(registry.deduceParamType(value)) << "\"}"; first = false; } ss << "]"; ss << "}"; std::string result_str = ss.str(); return createWasmString(result_str); } catch (const std::exception &e) { std::string error = "{\"error\":\"" + std::string(e.what()) + "\"}"; return createWasmString(error); } } EMSCRIPTEN_KEEPALIVE const char *smart_get_version() { std::string version = "{\"version\":\"1.0.0\",\"name\":\"Smart WASM JSON API\"}"; return createWasmString(version); } EMSCRIPTEN_KEEPALIVE void smart_free_string(const char *str) { freeWasmString(str); } // 导出额外的辅助函数 EMSCRIPTEN_KEEPALIVE void *wasm_malloc(size_t size) { return malloc(size); } EMSCRIPTEN_KEEPALIVE void wasm_free(void *ptr) { if (ptr) { free(ptr); } }