From fc07701de83417bbf581f74c7826043925a7e0d7 Mon Sep 17 00:00:00 2001 From: Vadim Laletin Date: Wed, 9 Oct 2024 21:14:41 +0200 Subject: [PATCH] Re-throw fhirpath error with details about linkId. Closes #80 --- sdc-qrf/src/components.tsx | 36 ++++++++++++++--------- sdc-qrf/src/utils.ts | 60 +++++++++++++++++++++++--------------- 2 files changed, 59 insertions(+), 37 deletions(-) diff --git a/sdc-qrf/src/components.tsx b/sdc-qrf/src/components.tsx index 786368d0..bbdda222 100644 --- a/sdc-qrf/src/components.tsx +++ b/sdc-qrf/src/components.tsx @@ -78,20 +78,28 @@ export function QuestionItem(props: QuestionItemProps) { if (!isGroupItem(questionItem, context) && calculatedExpression) { // TODO: Add support for x-fhir-query if (calculatedExpression.language === 'text/fhirpath') { - const newValues = fhirpath.evaluate( - context.context || {}, - calculatedExpression.expression!, - context as ItemContext, - ); - const newAnswers = newValues.length - ? repeats - ? newValues.map((answer: any) => ({ value: wrapAnswerValue(type, answer) })) - : [{ value: wrapAnswerValue(type, newValues[0]) }] - : undefined; - - if (!isEqual(newAnswers, prevAnswers)) { - const allValues = _.set(_.cloneDeep(formValues), fieldPath, newAnswers); - setFormValues(allValues, fieldPath, newAnswers); + try { + const newValues = fhirpath.evaluate( + context.context || {}, + calculatedExpression.expression!, + context as ItemContext, + ); + const newAnswers = newValues.length + ? repeats + ? newValues.map((answer: any) => ({ + value: wrapAnswerValue(type, answer), + })) + : [{ value: wrapAnswerValue(type, newValues[0]) }] + : undefined; + + if (!isEqual(newAnswers, prevAnswers)) { + const allValues = _.set(_.cloneDeep(formValues), fieldPath, newAnswers); + setFormValues(allValues, fieldPath, newAnswers); + } + } catch (err: unknown) { + throw Error( + `FHIRPath expression evaluation failure for "calculatedExpression" in ${questionItem.linkId}: ${err}`, + ); } } } diff --git a/sdc-qrf/src/utils.ts b/sdc-qrf/src/utils.ts index 025f46aa..09838384 100644 --- a/sdc-qrf/src/utils.ts +++ b/sdc-qrf/src/utils.ts @@ -110,15 +110,25 @@ export function calcContext( qrItem: QuestionnaireResponseItem, ): ItemContext { // TODO: add root variable support - return { - ...(variables || []).reduce( - (acc, curVariable) => ({ - ...acc, - [curVariable.name!]: fhirpath.evaluate(qrItem || {}, curVariable.expression!, acc), - }), - { ...initialContext, context: qrItem, qitem: qItem }, - ), - }; + try { + return { + ...(variables || []).reduce( + (acc, curVariable) => ({ + ...acc, + [curVariable.name!]: fhirpath.evaluate( + qrItem || {}, + curVariable.expression!, + acc, + ), + }), + { ...initialContext, context: qrItem, qitem: qItem }, + ), + }; + } catch (err: unknown) { + throw Error( + `FHIRPath expression evaluation failure for "variable" in ${qItem.linkId}: ${err}`, + ); + } } export function compareValue(firstAnswerValue: AnswerValue, secondAnswerValue: AnswerValue) { @@ -501,21 +511,25 @@ function isQuestionEnabled(args: IsQuestionEnabledArgs) { } if (enableWhenExpression && enableWhenExpression.language === 'text/fhirpath') { - const expressionResult = fhirpath.evaluate( - args.context.resource, - enableWhenExpression.expression!, - args.context ?? {}, - )[0]; - - if (typeof expressionResult !== 'boolean') { - throw Error(` - linkId: ${args.qItem.linkId} - Expression result: ${expressionResult} - The result of enableWhenExpression is not a boolean value - `); - } + try { + const expressionResult = fhirpath.evaluate( + args.context.resource, + enableWhenExpression.expression!, + args.context ?? {}, + )[0]; + + if (typeof expressionResult !== 'boolean') { + throw Error( + `The result of enableWhenExpression is not a boolean value. Expression result: ${expressionResult}`, + ); + } - return expressionResult; + return expressionResult; + } catch (err: unknown) { + throw Error( + `FHIRPath expression evaluation failure for "enableWhenExpression" in ${args.qItem.linkId}: ${err}`, + ); + } } const iterFn = enableBehavior === 'any' ? _.some : _.every;