From 0c0e1ac4dc024de6e1cd1c35bdd59d6bc0b50388 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 30 Sep 2025 00:42:14 +0000 Subject: [PATCH 1/4] Initial plan From 41e0a96fe6774b3673a6cb00a23fe5b3bd856f5c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 30 Sep 2025 00:47:57 +0000 Subject: [PATCH 2/4] Initial plan for syntax validation endpoint implementation Co-authored-by: litlfred <662242+litlfred@users.noreply.github.com> --- .gradle/9.1.0/checksums/checksums.lock | Bin 17 -> 17 bytes .gradle/9.1.0/checksums/md5-checksums.bin | Bin 24897 -> 24897 bytes .gradle/9.1.0/checksums/sha1-checksums.bin | Bin 133829 -> 144953 bytes .gradle/9.1.0/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/.gradle/9.1.0/checksums/checksums.lock b/.gradle/9.1.0/checksums/checksums.lock index 8899156098af24aa0a1168caa463466eb296aec0..4259dc4c244a7400fdbcc1a51330b38085f50191 100644 GIT binary patch literal 17 VcmZSH%G_YFC*fod0~m0g0{}2D1iSzM literal 17 VcmZSH%G_YFC*fod0~l~50st?-1Wo_| diff --git a/.gradle/9.1.0/checksums/md5-checksums.bin b/.gradle/9.1.0/checksums/md5-checksums.bin index 5c952ce3ea3770dc78cfb870609bcbaaff24b67f..a651245799c9b541e131df19310248eee856f223 100644 GIT binary patch delta 1236 zcmXxje`w5c9LI6njOIt!?QR^=l1y?VMVmAux7~L8ZD#BT&Dmx@^Vv6Vlxia;Y?BOnX#y z>@fL+b`g_jqb0>Qygh333J#^XENr{O13~RU{s^|tCC+1xwpX)GP*)6s`kC~3T-Hqg z5}g@QMo5m0$W$}ae~ekFrg29CYXts5_6r)~xUDGWtD>IiX(rq-K%Stnj@=5luK36Y zLEr`@tDP+LMp+GkUNXI=b7u|Bf}n>kLDMeYYUMl8=_V6Q!y{-eqd`%`1wl(9uM|I- zkYU0t%ULF9?V#4c9$Zg{pec+Og60}VXPTp?C>ATC*(7i`aYB$>%2UCPtAuBnu=_HJ z`A)L4tQWAm%c+oR@(~Uz@_D4#!jLvxXI{4HOc_C`qRRS}PA+Df5y>y<*Xjd)2|TgP z&M^(1Hi{H)I3P&%(ychbH^nbz=AgUSPypcEZ0278{m^xhnTj)GLlASlaZpP)RRn~DTJ3o1g1DYW+Gs2HXDawN#Vxu($Cmt$ij zZG~pk#`9biRQPx=s7zvVkvXcoMY^CWnxLYbPQ?`l6@Rf8n{ahH$%?!971uZ?sF}ln zVj<&7O!&@Hl1f}*7T8h}X9_PkB`19@o-1mJSZlI<_gN&k>!eyy&N0O`o(TGFgspRp PZ+GteJd^3-Vpip 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 diff --git a/.gradle/9.1.0/fileHashes/fileHashes.lock b/.gradle/9.1.0/fileHashes/fileHashes.lock index 7c4049e69907dc67fd16dcc8e5080148729fe212..fa4e56b2f6c58e09bf3e8f46e53aae270d7053e4 100644 GIT binary patch literal 17 VcmZSHRDR{(oA@s^3}8^H002n#22%h4 literal 17 VcmZSHRDR{(oA@s^3}BEl1prAv2C@JE diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index c4c636a51d8ca817d71258c968297a8df5e3dd7a..50c1afc595900af8110dd8f1da62d2ad869eb145 100644 GIT binary patch literal 17 VcmZRc8C-F+LssMw0~j#P1pqKS1ZMyM literal 17 VcmZRc8C-F+LssMw0~jz_0{}1D1O)&9 From a41d717ce3bb8f2c9c42e62e6ec3469d9a272391 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 30 Sep 2025 00:53:32 +0000 Subject: [PATCH 3/4] Add FML syntax validation functionality to services library Co-authored-by: litlfred <662242+litlfred@users.noreply.github.com> --- .gradle/9.1.0/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../org/litlfred/fmlrunner/FmlRunner.kt | 7 ++ .../fmlrunner/compiler/FmlCompiler.kt | 26 +++++ .../org/litlfred/fmlrunner/types/FhirTypes.kt | 10 ++ .../org/litlfred/fmlrunner/BasicTest.kt | 94 ++++++++++++++++++ 6 files changed, 137 insertions(+) diff --git a/.gradle/9.1.0/fileHashes/fileHashes.lock b/.gradle/9.1.0/fileHashes/fileHashes.lock index fa4e56b2f6c58e09bf3e8f46e53aae270d7053e4..1236ec3f9bf74c11f8f783e683dd8baf7c8b4d0e 100644 GIT binary patch literal 17 VcmZSHRDR{(oA@s^3}8@u3jj&D2N3`O literal 17 VcmZSHRDR{(oA@s^3}8^H002n#22%h4 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 50c1afc595900af8110dd8f1da62d2ad869eb145..94f3e74fc87c462419b5be19e9f620ce1e28f54a 100644 GIT binary patch literal 17 VcmZRc8C-F+LssMw0~jzH0{}171O5O2 literal 17 VcmZRc8C-F+LssMw0~j#P1pqKS1ZMyM diff --git a/src/commonMain/kotlin/org/litlfred/fmlrunner/FmlRunner.kt b/src/commonMain/kotlin/org/litlfred/fmlrunner/FmlRunner.kt index 0814f35..07c66fe 100644 --- a/src/commonMain/kotlin/org/litlfred/fmlrunner/FmlRunner.kt +++ b/src/commonMain/kotlin/org/litlfred/fmlrunner/FmlRunner.kt @@ -28,6 +28,13 @@ class FmlRunner { return compiler.compile(fmlContent) } + /** + * Validate FML syntax without full compilation + */ + fun validateFmlSyntax(fmlContent: String): FmlSyntaxValidationResult { + return compiler.validateSyntax(fmlContent) + } + /** * Execute StructureMap on input content */ diff --git a/src/commonMain/kotlin/org/litlfred/fmlrunner/compiler/FmlCompiler.kt b/src/commonMain/kotlin/org/litlfred/fmlrunner/compiler/FmlCompiler.kt index 17b7cbf..0449ee1 100644 --- a/src/commonMain/kotlin/org/litlfred/fmlrunner/compiler/FmlCompiler.kt +++ b/src/commonMain/kotlin/org/litlfred/fmlrunner/compiler/FmlCompiler.kt @@ -464,4 +464,30 @@ class FmlCompiler { ) } } + + /** + * Validate FML syntax without full compilation + */ + fun validateSyntax(fmlContent: String): FmlSyntaxValidationResult { + return try { + // Tokenize + val tokenizer = FmlTokenizer(fmlContent) + val tokens = tokenizer.tokenize() + + // Parse for syntax validation (without requiring complete StructureMap) + val parser = FmlParser(tokens) + val result = parser.parse() + + FmlSyntaxValidationResult( + valid = result.success, + errors = result.errors, + warnings = result.warnings + ) + } catch (e: Exception) { + FmlSyntaxValidationResult( + valid = false, + errors = listOf("Syntax validation failed: ${e.message}") + ) + } + } } \ No newline at end of file diff --git a/src/commonMain/kotlin/org/litlfred/fmlrunner/types/FhirTypes.kt b/src/commonMain/kotlin/org/litlfred/fmlrunner/types/FhirTypes.kt index 3975c6f..0fa4f3d 100644 --- a/src/commonMain/kotlin/org/litlfred/fmlrunner/types/FhirTypes.kt +++ b/src/commonMain/kotlin/org/litlfred/fmlrunner/types/FhirTypes.kt @@ -94,6 +94,16 @@ data class FmlCompilationResult( val warnings: List = emptyList() ) +/** + * FML Syntax Validation Result + */ +@Serializable +data class FmlSyntaxValidationResult( + val valid: Boolean, + val errors: List = emptyList(), + val warnings: List = emptyList() +) + /** * Execution Result for StructureMap execution */ diff --git a/src/commonTest/kotlin/org/litlfred/fmlrunner/BasicTest.kt b/src/commonTest/kotlin/org/litlfred/fmlrunner/BasicTest.kt index 6d8e53b..2578465 100644 --- a/src/commonTest/kotlin/org/litlfred/fmlrunner/BasicTest.kt +++ b/src/commonTest/kotlin/org/litlfred/fmlrunner/BasicTest.kt @@ -95,4 +95,98 @@ class FmlRunnerTest { assertTrue(result.success, "Execution should succeed") } + + @Test + fun testValidFmlSyntaxValidation() { + val runner = FmlRunner() + val validFmlContent = """ + map "http://example.org/StructureMap/Patient" = "PatientTransform" + + group main(source src, target tgt) { + src.name -> tgt.fullName; + src.active -> tgt.isActive; + } + """.trimIndent() + + val result = runner.validateFmlSyntax(validFmlContent) + assertTrue(result.valid, "Valid FML syntax should pass validation") + assertTrue(result.errors.isEmpty(), "No errors should be reported for valid syntax") + } + + @Test + fun testInvalidFmlSyntaxValidation_MissingMapKeyword() { + val runner = FmlRunner() + val invalidFmlContent = """ + "http://example.org/StructureMap/Patient" = "PatientTransform" + + group main(source src, target tgt) { + src.name -> tgt.fullName; + } + """.trimIndent() + + val result = runner.validateFmlSyntax(invalidFmlContent) + assertTrue(!result.valid, "Invalid FML syntax should fail validation") + assertTrue(result.errors.isNotEmpty(), "Errors should be reported for invalid syntax") + assertTrue(result.errors.any { it.contains("map") || it.contains("Expected") }, + "Error should mention missing 'map' keyword") + } + + @Test + fun testInvalidFmlSyntaxValidation_MalformedGroup() { + val runner = FmlRunner() + val invalidFmlContent = """ + map "http://example.org/StructureMap/Patient" = "PatientTransform" + + group main(source src, target tgt { + src.name -> tgt.fullName; + } + """.trimIndent() + + val result = runner.validateFmlSyntax(invalidFmlContent) + assertTrue(!result.valid, "Invalid FML syntax should fail validation") + assertTrue(result.errors.isNotEmpty(), "Errors should be reported for malformed syntax") + } + + @Test + fun testInvalidFmlSyntaxValidation_EmptyContent() { + val runner = FmlRunner() + val emptyContent = "" + + val result = runner.validateFmlSyntax(emptyContent) + assertTrue(!result.valid, "Empty content should fail validation") + assertTrue(result.errors.isNotEmpty(), "Errors should be reported for empty content") + } + + @Test + fun testInvalidFmlSyntaxValidation_MissingClosingBrace() { + val runner = FmlRunner() + val invalidFmlContent = """ + map "http://example.org/StructureMap/Patient" = "PatientTransform" + + group main(source src, target tgt) { + src.name -> tgt.fullName; + """.trimIndent() + + val result = runner.validateFmlSyntax(invalidFmlContent) + assertTrue(!result.valid, "Invalid FML syntax should fail validation") + assertTrue(result.errors.isNotEmpty(), "Errors should be reported for missing closing brace") + } + + @Test + fun testComplexValidFmlSyntaxValidation() { + val runner = FmlRunner() + val complexValidFmlContent = """ + map "http://example.org/StructureMap/Complex" = "ComplexTransform" + + group main(source src, target tgt) { + src.name -> tgt.fullName; + src.active -> tgt.isActive; + src.email -> tgt.contactEmail; + } + """.trimIndent() + + val result = runner.validateFmlSyntax(complexValidFmlContent) + assertTrue(result.valid, "Complex valid FML syntax should pass validation") + assertTrue(result.errors.isEmpty(), "No errors should be reported for complex valid syntax") + } } \ No newline at end of file From 403c366337da336e6d1ca9ad855819fbcd302503 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 30 Sep 2025 23:57:07 +0000 Subject: [PATCH 4/4] Remove build artifacts (.gradle files) from git tracking Co-authored-by: litlfred <662242+litlfred@users.noreply.github.com> --- .gradle/9.1.0/checksums/checksums.lock | Bin 17 -> 0 bytes .gradle/9.1.0/checksums/md5-checksums.bin | Bin 24897 -> 0 bytes .gradle/9.1.0/checksums/sha1-checksums.bin | Bin 144953 -> 0 bytes .gradle/9.1.0/fileChanges/last-build.bin | Bin 1 -> 0 bytes .gradle/9.1.0/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .gradle/9.1.0/gc.properties | 0 .../buildOutputCleanup/buildOutputCleanup.lock | Bin 17 -> 0 bytes .gradle/buildOutputCleanup/cache.properties | 2 -- .gradle/vcs-1/gc.properties | 0 9 files changed, 2 deletions(-) delete mode 100644 .gradle/9.1.0/checksums/checksums.lock delete mode 100644 .gradle/9.1.0/checksums/md5-checksums.bin delete mode 100644 .gradle/9.1.0/checksums/sha1-checksums.bin delete mode 100644 .gradle/9.1.0/fileChanges/last-build.bin delete mode 100644 .gradle/9.1.0/fileHashes/fileHashes.lock delete mode 100644 .gradle/9.1.0/gc.properties delete mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 .gradle/buildOutputCleanup/cache.properties delete mode 100644 .gradle/vcs-1/gc.properties diff --git a/.gradle/9.1.0/checksums/checksums.lock b/.gradle/9.1.0/checksums/checksums.lock deleted file mode 100644 index 4259dc4c244a7400fdbcc1a51330b38085f50191..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZSH%G_YFC*fod0~m0g0{}2D1iSzM diff --git a/.gradle/9.1.0/checksums/md5-checksums.bin b/.gradle/9.1.0/checksums/md5-checksums.bin deleted file mode 100644 index a651245799c9b541e131df19310248eee856f223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24897 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 diff --git a/.gradle/9.1.0/fileChanges/last-build.bin b/.gradle/9.1.0/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/.gradle/9.1.0/fileHashes/fileHashes.lock b/.gradle/9.1.0/fileHashes/fileHashes.lock deleted file mode 100644 index 1236ec3f9bf74c11f8f783e683dd8baf7c8b4d0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZSHRDR{(oA@s^3}8@u3jj&D2N3`O diff --git a/.gradle/9.1.0/gc.properties b/.gradle/9.1.0/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index 94f3e74fc87c462419b5be19e9f620ce1e28f54a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZRc8C-F+LssMw0~jzH0{}171O5O2 diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index 195f502..0000000 --- a/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Sep 29 13:56:43 UTC 2025 -gradle.version=9.1.0 diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties deleted file mode 100644 index e69de29..0000000