* @brief Set frame parser code for a source. */
| 2918 | * @brief Set frame parser code for a source. |
| 2919 | */ |
| 2920 | API::CommandResponse API::Handlers::ProjectHandler::parserSetCode(const QString& id, |
| 2921 | const QJsonObject& params) |
| 2922 | { |
| 2923 | if (!params.contains(QStringLiteral("code"))) { |
| 2924 | return CommandResponse::makeError( |
| 2925 | id, ErrorCode::MissingParam, QStringLiteral("Missing required parameter: code")); |
| 2926 | } |
| 2927 | |
| 2928 | const QString code = params.value(QStringLiteral("code")).toString(); |
| 2929 | const int sourceId = params.contains(Keys::SourceId) ? params.value(Keys::SourceId).toInt() : 0; |
| 2930 | auto& model = DataModel::ProjectModel::instance(); |
| 2931 | const int srcCount = static_cast<int>(model.sources().size()); |
| 2932 | |
| 2933 | if (sourceId < 0 || sourceId >= srcCount) |
| 2934 | return CommandResponse::makeError( |
| 2935 | id, ErrorCode::InvalidParam, QStringLiteral("Invalid sourceId")); |
| 2936 | |
| 2937 | const bool hasLanguage = params.contains(QStringLiteral("language")); |
| 2938 | int savedLanguage = 0; |
| 2939 | if (hasLanguage) { |
| 2940 | const int language = params.value(QStringLiteral("language")).toInt(); |
| 2941 | if (language != SerialStudio::JavaScript && language != SerialStudio::Lua |
| 2942 | && language != SerialStudio::Native) |
| 2943 | return CommandResponse::makeError( |
| 2944 | id, |
| 2945 | ErrorCode::InvalidParam, |
| 2946 | QStringLiteral("Invalid language: must be 0 (JavaScript), 1 (Lua) or 2 (Built-In)")); |
| 2947 | |
| 2948 | if (language == SerialStudio::Native) |
| 2949 | return setNativeParserFromDescriptor(id, sourceId, code); |
| 2950 | |
| 2951 | savedLanguage = model.frameParserLanguage(sourceId); |
| 2952 | |
| 2953 | model.updateSourceFrameParserLanguage(sourceId, language); |
| 2954 | |
| 2955 | auto& parser = DataModel::FrameParser::instance(); |
| 2956 | const bool prevSuppress = model.suppressMessageBoxes(); |
| 2957 | model.setSuppressMessageBoxes(true); |
| 2958 | parser.setSuppressMessageBoxes(true); |
| 2959 | |
| 2960 | const bool ok = parser.loadScript(sourceId, code, false); |
| 2961 | |
| 2962 | parser.setSuppressMessageBoxes(prevSuppress); |
| 2963 | model.setSuppressMessageBoxes(prevSuppress); |
| 2964 | |
| 2965 | if (!ok) { |
| 2966 | model.updateSourceFrameParserLanguage(sourceId, savedLanguage); |
| 2967 | return CommandResponse::makeError( |
| 2968 | id, |
| 2969 | ErrorCode::InvalidParam, |
| 2970 | QStringLiteral("Script engine rejected the parser code (check logs)")); |
| 2971 | } |
| 2972 | } |
| 2973 | |
| 2974 | if (sourceId == 0) |
| 2975 | model.setFrameParserCode(code); |
| 2976 | else |
| 2977 | model.updateSourceFrameParser(sourceId, code); |
nothing calls this directly
no test coverage detected