Skip to content

Commit

Permalink
Integrate SequenceDiagram with Hugo command
Browse files Browse the repository at this point in the history
Signed-off-by: reidspencer <reid.spencer@yoppworks.com>
  • Loading branch information
reid-spencer committed Oct 6, 2023
1 parent 99207a8 commit 0d426f4
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,22 @@ case class SequenceDiagram(sds: SequenceDiagramSupport, useCase: UseCase) extend

final val indent_per_level = 4

def generate: String = {
def generate: Seq[String] = {
sb.append("sequenceDiagram"); nl
sb.append(s"${ndnt()}autonumber"); nl
val parts: Seq[Definition] = actors.values.toSeq.sortBy(_.kind)
makeParticipants(parts)
generateInteractions(useCase.contents, indent_per_level)
nl
sb.toString()
sb.toString().split('\n').toSeq
}

def actorsFirst(a: (String, Definition), b: (String, Definition)): Boolean = {
a._2 match
case _: User if b._2.isInstanceOf[User] => a._1 < b._1
case _: User => true
case _: Definition if b._2.isInstanceOf[User] => false
case _: Definition => a._1 < b._1
}

private val actors: Map[String, Definition] = {
Expand All @@ -64,6 +72,7 @@ case class SequenceDiagram(sds: SequenceDiagramSupport, useCase: UseCase) extend
.filterNot(_._1.isEmpty)
.map(x => x._1 -> x._2.getOrElse(RootContainer.empty))
.distinctBy(_._1) // reduce to the distinct ones
.sortWith(actorsFirst)
.toMap
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class SequenceDiagramTest extends ValidatingTest {
val useCase = epic.cases.head
val sd = SequenceDiagram(new SDS(result), useCase)
val diagram = sd.generate
println(diagram)
println(diagram.mkString("\n"))
diagram mustNot be(empty)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
package com.reactific.riddl.hugo

import com.reactific.riddl.commands.TranslatingState
import com.reactific.riddl.diagrams.mermaid.MermaidDiagramsPlugin
import com.reactific.riddl.diagrams.mermaid.{MermaidDiagramsPlugin, SequenceDiagramSupport}
import com.reactific.riddl.language.AST.*
import com.reactific.riddl.language.Messages.Accumulator
import com.reactific.riddl.language.{AST, CommonOptions}
Expand All @@ -32,12 +32,12 @@ import java.nio.file.Path
*/
@SuppressWarnings(Array("org.wartremover.warts.Var"))
case class HugoTranslatorState(
result: PassesResult,
passesResult: PassesResult,
options: HugoCommand.Options = HugoCommand.Options(),
commonOptions: CommonOptions = CommonOptions(),
logger: Logger = SysLogger()
) extends TranslatingState[MarkdownWriter] {

) extends TranslatingState[MarkdownWriter] with SequenceDiagramSupport {
val result: PassesResult = passesResult
final val symbolTable: SymbolsOutput = result.symbols
final val refMap: ReferenceMap = result.refMap
final val root: RootContainer = result.root // base class compliance
Expand Down Expand Up @@ -143,6 +143,8 @@ case class HugoTranslatorState(
makeDocLink(definition, parents)
}

def makeLinkFor(definition: Definition): String = makeDocLink(definition)

def makeDocAndParentsLinks(definition: Definition): String = {
val parents = symbolTable.parentsOf(definition)
val docLink = makeDocLink(definition, makeParents(parents))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -891,11 +891,7 @@ case class MarkdownWriter(filePath: Path, state: HugoTranslatorState) extends Te
}
}
list("Visualizations", epic.shownBy.map(u => s"($u)[$u]"))
listOf("Use Cases", epic.cases)
h2("Sequence Diagram")
// FIXME: val diagram = SequenceDiagram(state, epic,)
// FIXME: val lines = diagram.toLines
// FIXME: emitMermaidDiagram(lines)
toc("Use Cases", mkTocSeq(epic.cases))
emitUsage(epic)
emitTerms(epic.terms)
emitDescription(epic.description, epic)
Expand All @@ -911,9 +907,11 @@ case class MarkdownWriter(filePath: Path, state: HugoTranslatorState) extends Te
leafHead(uc, weight = 20)
val parList = state.makeParents(parents)
emitDefDoc(uc, parList)
// TODO: Emit a sequence diagram for the steps

}
h2("Sequence Diagram")
val sd = SequenceDiagram(state, uc)
val lines = sd.generate
emitMermaidDiagram(lines)
}

def emitConnector(conn: Connector, parents: Seq[String]): this.type = {
leafHead(conn, weight = 20)
Expand Down

0 comments on commit 0d426f4

Please sign in to comment.