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 =
s"""${Header}
|
|function missingFields(obj, fields) {
| return fields.filter(f => !(f in obj))
|}
|
|// Services
|${res.services.map(JavaScriptService(_)).map(_.generate).toList.mkString("\n\n")}

View File

@ -34,6 +34,8 @@ case class JavaScriptService(srv: ServiceRes) {
|}""".stripMargin
)
val membersNames = srv.members.map(_._1)
s"""
|export function ${registerName}(...args) {
| let peer;
@ -64,6 +66,11 @@ case class JavaScriptService(srv: ServiceRes) {
| 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) => {
| if (req.serviceId !== serviceId) {
| next();

View File

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

View File

@ -76,6 +76,8 @@ case class TypeScriptService(srv: ServiceRes) {
| }""".stripMargin
)
val membersNames = srv.members.map(_._1)
s"""
|export interface ${serviceTypeName} {
| ${fnDefs}
@ -111,6 +113,11 @@ case class TypeScriptService(srv: ServiceRes) {
| 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) => {
| if (req.serviceId !== serviceId) {
| next();

View File

@ -128,7 +128,9 @@ class SourcesSpec extends AsyncFlatSpec with Matchers {
content = "some random content"
compiled = AquaCompiled[FileModuleId](
FileModuleId(filePath),
Seq(Generated("_hey.custom", content))
Seq(Generated("_hey.custom", content)),
1,
1
)
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
private def writeWithResult(target: Path, content: String, size: Int) = {
private def writeWithResult(target: Path, content: String, funcsCount: Int, servicesCount: Int) = {
filesIO
.writeFile(
target,
content
)
.as(s"Result $target: compilation OK ($size functions)")
.as(s"Result $target: compilation OK ($funcsCount functions, $servicesCount services)")
.value
.map(Validated.fromEither)
}
@ -138,7 +138,7 @@ class AquaFileSources[F[_]: AquaIO: Monad: Files: Functor](
result
.leftMap(FileSystemError.apply)
.map { target =>
writeWithResult(target, compiled.content, ac.compiled.size)
writeWithResult(target, compiled.content, ac.funcsCount, ac.servicesCount)
}
.traverse(identity)
}

View File

@ -2,4 +2,4 @@ package aqua.compiler
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 { ap =>
val compiled = backend.generate(AquaRes.fromContext(ap.context, config))
AquaCompiled(ap.id, compiled)
val res = AquaRes.fromContext(ap.context, config)
val compiled = backend.generate(res)
AquaCompiled(ap.id, compiled, res.funcs.length.toInt, res.services.length.toInt)
}
)
}