Skip to content

Commit

Permalink
Allow input syntax to support commands
Browse files Browse the repository at this point in the history
  • Loading branch information
reid-spencer committed Oct 30, 2023
1 parent fc3d846 commit b0f0ae3
Show file tree
Hide file tree
Showing 9 changed files with 75 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,8 @@ case class SequenceDiagram(sds: SequenceDiagramSupport, useCase: UseCase) extend
val name = part.id.value
part match
case u: User => sb.append(s"${ndnt()}actor $name as ${u.is_a.s}")
case i: Input => sb.append(s"${ndnt()}participant $name as ${i.alias} ${i.id.value}")
case o: Output => sb.append(s"${ndnt()}participant $name as ${o.alias} ${o.id.value}")
case i: Input => sb.append(s"${ndnt()}participant $name as ${i.nounAlias} ${i.id.value}")
case o: Output => sb.append(s"${ndnt()}participant $name as ${o.nounAlias} ${o.id.value}")
case g: Group => sb.append(s"${ndnt()}participant $name as ${g.alias} ${g.id.value}")
case d: Definition => sb.append(s"${ndnt()}participant $name as ${d.identify}")
nl
Expand All @@ -96,8 +96,8 @@ case class SequenceDiagram(sds: SequenceDiagramSupport, useCase: UseCase) extend
val link = sds.makeDocLink(part)
part match
case _: User => sb.append(s"${ndnt()}link $name: User @ $link")
case i: Input => sb.append(s"${ndnt()}link $name: ${i.alias} @ $link")
case o: Output => sb.append(s"${ndnt()}link $name: ${o.alias} @ $link")
case i: Input => sb.append(s"${ndnt()}link $name: ${i.nounAlias} @ $link")
case o: Output => sb.append(s"${ndnt()}link $name: ${o.nounAlias} @ $link")
case g: Group => sb.append(s"${ndnt()}link $name: ${g.alias} @ $link")
case d: Definition => sb.append(s"${ndnt()}link $name: ${d.kind} @ $link")
nl
Expand Down
16 changes: 10 additions & 6 deletions language/src/main/scala/com/reactific/riddl/language/AST.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3397,22 +3397,23 @@ object AST { // extends ast.AbstractDefinitions with ast.Definitions with ast.Op
*/
case class Output(
loc: At,
alias: String,
nounAlias: String,
id: Identifier,
verbAlias: String,
putOut: TypeRef,
outputs: Seq[OutputDefinition] = Seq.empty[OutputDefinition],
brief: Option[LiteralString] = None,
description: Option[Description] = None
) extends ApplicationDefinition
with OutputDefinition
with GroupDefinition {
override def kind: String = "Output"
override def kind: String = if nounAlias.nonEmpty then nounAlias else "output"
override def isAppRelated: Boolean = true

override lazy val contents: Seq[OutputDefinition] = outputs

/** Format the node to a string */
override def format: String = s"${if id.isEmpty then "inoutputput" else id.format} presents ${putOut.format}"
override def format: String = s"$kind $verbAlias ${putOut.format}"
}

/** A reference to an View using a path identifier
Expand Down Expand Up @@ -3441,22 +3442,25 @@ object AST { // extends ast.AbstractDefinitions with ast.Definitions with ast.Op
*/
case class Input(
loc: At,
alias: String,
nounAlias: String,
id: Identifier,
verbAlias: String,
putIn: TypeRef,
inputs: Seq[InputDefinition] = Seq.empty[InputDefinition],
brief: Option[LiteralString] = None,
description: Option[Description] = None
) extends ApplicationDefinition
with GroupDefinition
with InputDefinition {
override def kind: String = "Input"
override def kind: String = if nounAlias.nonEmpty then nounAlias else "input"
override def isAppRelated: Boolean = true

override lazy val contents: Seq[Definition] = inputs

/** Format the node to a string */
override def format: String = s"${if id.isEmpty then "input" else id.format} acquires ${putIn.format}"
override def format: String = {
s"$kind $verbAlias ${putIn.format}"
}
}

/** A reference to an Input using a path identifier
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ private[parsing] trait ApplicationParser {
}
}

private def presentationAliases[u: P]: P[Unit] = {
StringIn(Keywords.presents, "shows", "displays", "writes", "emits")
private def presentationAliases[u: P]: P[String] = {
StringIn("presents", "shows", "displays", "writes", "emits").!
}

private def outputDefinitions[u: P]: P[Seq[OutputDefinition]] = {
Expand All @@ -69,12 +69,13 @@ private[parsing] trait ApplicationParser {
}
}


private def appOutput[u: P]: P[Output] = {
P(
location ~ outputAliases ~/ identifier ~ presentationAliases ~/ typeRef ~
outputDefinitions ~ briefly ~ description
).map { case (loc, alias, id, putOut, outputs, brief, description) =>
Output(loc, alias, id, putOut, outputs, brief, description)
).map { case (loc, nounAlias, id, verbAlias, putOut, outputs, brief, description) =>
Output(loc, nounAlias, id, verbAlias, putOut, outputs, brief, description)
}
}

Expand All @@ -89,16 +90,17 @@ private[parsing] trait ApplicationParser {
}
}

private def acquisitionAliases[u: P]: P[Unit] = {
StringIn(Keywords.acquires, "reads", "takes", "accepts", "admits")
private def acquisitionAliases[u: P]: P[String] = {
StringIn("acquires", "reads", "takes", "accepts", "admits",
"initiates", "submits", "triggers", "activates", "starts").!
}

private def appInput[u: P]: P[Input] = {
P(
location ~ inputAliases ~/ identifier ~ acquisitionAliases ~ typeRef ~
inputDefinitions ~ briefly ~ description
).map { case (loc, alias, id, putIn, inputs, brief, description) =>
Input(loc, alias, id, putIn, inputs, brief, description)
).map { case (loc, inputAlias, id, acquisitionAlias, putIn, inputs, brief, description) =>
Input(loc, inputAlias, id, acquisitionAlias, putIn, inputs, brief, description)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -245,12 +245,6 @@ private[parsing] trait CommonParser extends NoWhiteSpaceParsers {
)
}

def inputAliases[u: P]: P[String] = {
P(
StringIn(Keywords.input, "form", "text", "button", "picklist", "select").!
)
}

def outputAliases[u: P]: P[String] = {
P(
StringIn(
Expand All @@ -264,4 +258,14 @@ private[parsing] trait CommonParser extends NoWhiteSpaceParsers {
).!
)
}

def inputAliases[u: P]: P[String] = {
P(
StringIn(Keywords.input,
"form", "text", "button", "picklist", "selector", "menu"
).!
)
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ private[parsing] trait ReferenceParser extends CommonParser {
P((identifier ~ Punctuation.colon).?)
}

private def commandRef[u: P]: P[CommandRef] = {
def commandRef[u: P]: P[CommandRef] = {
P(location ~ Keywords.command ~ maybeName ~ pathIdentifier)
.map(tpl => (CommandRef.apply _).tupled(tpl))
}
Expand Down
8 changes: 8 additions & 0 deletions language/src/test/input/snippets/application/inputs.riddl
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
domain foo {
command DoIt is { what_to_do: String }
application input_tests is {
page top is {
button pressMe initiates command DoIt
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.reactific.riddl.language.parsing

import com.reactific.riddl.language.Messages.Messages
import com.reactific.riddl.language.ParsingTest

import java.nio.file.Path
import org.apache.commons.io.FileUtils

import java.io.File
import scala.jdk.CollectionConverters.*

/** Parsing tests that try a variety of code snippets that should parse */
class SnippetsFileTest extends ParsingTest {

val topDir = Path.of(s"language/src/test/input/snippets")
val files: Iterable[File] = FileUtils.listFiles(topDir.toFile, Array("riddl"), true).asScala
"Snippet Files" should {
"app parse correctly" in {
for {file <- files} do
info(s"File: $file")
val input = RiddlParserInput(file)
parseTopLevelDomains(input) match
case Left(msgs: Messages) =>
fail(msgs.format)
case Right(root) =>
succeed
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -749,7 +749,7 @@ case class ValidationPass(
destination match {
case Some(d) if d.isAppRelated =>
d match {
case output @ Output(loc, alias, id, putOut, _, _, _) =>
case output@Output(loc, _, id, _, putOut, _, _, _) =>
checkTypeRef(putOut, parents.head, parents.tail) match {
case Some(Type(_, _, typEx, _, _)) if typEx.isContainer =>
typEx match {
Expand All @@ -775,7 +775,7 @@ case class ValidationPass(
destination match {
case Some(d) if d.isVital =>
o match {
case input @ Input(loc, alias, id, putIn, _, _, _) =>
case input@Input(loc, _, id, _, putIn, _, _, _) =>
checkTypeRef(putIn, parents.head, parents.tail) match {
case Some(Type(_, _, typEx, _, _)) if typEx.isContainer =>
typEx match {
Expand Down
3 changes: 1 addition & 2 deletions project/Helpers.scala
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,7 @@ object C {
// "-explain",
// "-explain-types",
"-Werror",
"-pagewidth",
"120"
"-pagewidth", "120"
)

def scala_3_doc_options(version: String): Seq[String] = {
Expand Down

0 comments on commit b0f0ae3

Please sign in to comment.