Check service definition fields in TS and JS, fix functions and services count in output (#305)

This commit is contained in:
Dima 2021-09-17 11:21:04 +03:00 committed by GitHub
parent b0c193a42c
commit 93dec7846c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 44 additions and 19 deletions

View File

@ -9,6 +9,10 @@ case class JavaScriptFile(res: AquaRes) {
def generate: String = def generate: String =
s"""${Header} s"""${Header}
|
|function missingFields(obj, fields) {
| return fields.filter(f => !(f in obj))
|}
| |
|// Services |// Services
|${res.services.map(JavaScriptService(_)).map(_.generate).toList.mkString("\n\n")} |${res.services.map(JavaScriptService(_)).map(_.generate).toList.mkString("\n\n")}

View File

@ -34,8 +34,10 @@ case class JavaScriptService(srv: ServiceRes) {
|}""".stripMargin |}""".stripMargin
) )
val membersNames = srv.members.map(_._1)
s""" s"""
| export function ${registerName}(...args) { |export function ${registerName}(...args) {
| let peer; | let peer;
| let serviceId; | let serviceId;
| let service; | let service;
@ -64,16 +66,21 @@ case class JavaScriptService(srv: ServiceRes) {
| service = args[2]; | service = args[2];
| } | }
| |
| peer.internals.callServiceHandler.use((req, resp, next) => { | const incorrectServiceDefinitions = missingFields(service, [${membersNames.map { n => s"'$n'"}.mkString(", ")}]);
| if (req.serviceId !== serviceId) { | if (!incorrectServiceDefinitions.length) {
| next(); | throw new Error("Error registering service ${srv.name}: missing functions: " + incorrectServiceDefinitions.map((d) => "'" + d + "'").join(", "))
| return; | }
| }
| |
| ${fnHandlers} | peer.internals.callServiceHandler.use((req, resp, next) => {
| if (req.serviceId !== serviceId) {
| next();
| return;
| }
| |
| next(); |${fnHandlers}
| }); |
| next();
| });
| } | }
""".stripMargin """.stripMargin
} }

View File

@ -9,6 +9,10 @@ case class TypeScriptFile(res: AquaRes) {
def generate: String = def generate: String =
s"""${Header} s"""${Header}
|
|function missingFields(obj: any, fields: string[]): string[] {
| return fields.filter(f => !(f in obj))
|}
| |
|// Services |// Services
|${res.services.map(TypeScriptService(_)).map(_.generate).toList.mkString("\n\n")} |${res.services.map(TypeScriptService(_)).map(_.generate).toList.mkString("\n\n")}

View File

@ -76,6 +76,8 @@ case class TypeScriptService(srv: ServiceRes) {
| }""".stripMargin | }""".stripMargin
) )
val membersNames = srv.members.map(_._1)
s""" s"""
|export interface ${serviceTypeName} { |export interface ${serviceTypeName} {
| ${fnDefs} | ${fnDefs}
@ -111,6 +113,11 @@ case class TypeScriptService(srv: ServiceRes) {
| service = args[2]; | service = args[2];
| } | }
| |
| const incorrectServiceDefinitions = missingFields(service, [${membersNames.map { n => s"'$n'" }.mkString(", ")}]);
| if (!!incorrectServiceDefinitions.length) {
| throw new Error("Error registering service ${srv.name}: missing functions: " + incorrectServiceDefinitions.map((d) => "'" + d + "'").join(", "))
| }
|
| peer.internals.callServiceHandler.use((req, resp, next) => { | peer.internals.callServiceHandler.use((req, resp, next) => {
| if (req.serviceId !== serviceId) { | if (req.serviceId !== serviceId) {
| next(); | next();

View File

@ -128,7 +128,9 @@ class SourcesSpec extends AsyncFlatSpec with Matchers {
content = "some random content" content = "some random content"
compiled = AquaCompiled[FileModuleId]( compiled = AquaCompiled[FileModuleId](
FileModuleId(filePath), FileModuleId(filePath),
Seq(Generated("_hey.custom", content)) Seq(Generated("_hey.custom", content)),
1,
1
) )
resolved <- sourceGen.write(targetPath)(compiled) resolved <- sourceGen.write(targetPath)(compiled)
_ = { _ = {

View File

@ -108,13 +108,13 @@ class AquaFileSources[F[_]: AquaIO: Monad: Files: Functor](
} }
// Write content to a file and return a success message // Write content to a file and return a success message
private def writeWithResult(target: Path, content: String, size: Int) = { private def writeWithResult(target: Path, content: String, funcsCount: Int, servicesCount: Int) = {
filesIO filesIO
.writeFile( .writeFile(
target, target,
content content
) )
.as(s"Result $target: compilation OK ($size functions)") .as(s"Result $target: compilation OK ($funcsCount functions, $servicesCount services)")
.value .value
.map(Validated.fromEither) .map(Validated.fromEither)
} }
@ -138,7 +138,7 @@ class AquaFileSources[F[_]: AquaIO: Monad: Files: Functor](
result result
.leftMap(FileSystemError.apply) .leftMap(FileSystemError.apply)
.map { target => .map { target =>
writeWithResult(target, compiled.content, ac.compiled.size) writeWithResult(target, compiled.content, ac.funcsCount, ac.servicesCount)
} }
.traverse(identity) .traverse(identity)
} }

View File

@ -2,4 +2,4 @@ package aqua.compiler
import aqua.backend.Generated import aqua.backend.Generated
case class AquaCompiled[I](sourceId: I, compiled: Seq[Generated]) case class AquaCompiled[I](sourceId: I, compiled: Seq[Generated], funcsCount: Int, servicesCount: Int)

View File

@ -86,8 +86,9 @@ object AquaCompiler extends Logging {
} }
.map( .map(
_.map { ap => _.map { ap =>
val compiled = backend.generate(AquaRes.fromContext(ap.context, config)) val res = AquaRes.fromContext(ap.context, config)
AquaCompiled(ap.id, compiled) val compiled = backend.generate(res)
AquaCompiled(ap.id, compiled, res.funcs.length.toInt, res.services.length.toInt)
} }
) )
} }