Mermaid for diagrams.mbt: lossless CST, parser, AST, printer and conversion to diagram models
///|
test {
let source = "sequenceDiagram\n%% the client calls the API\nparticipant Client\nClient ->> API :GET /forecast\n"
let r = @mermaid.read(source)
assert_eq(r.tree.text(), source)
assert_eq(r.diagnostics.length(), 0)
let ast = r.ast.unwrap()
assert_eq(
@mermaid.print(ast),
"sequenceDiagram\n participant Client\n Client->>API: GET /forecast\n",
)
let model = @mermaid.to_sequence(ast).sequence
assert_eq(model.participants.length(), 2)
}///|
test {
let source = "sequenceDiagram\nALT Is sick\n B ->>- A : Not so good\nELSE is well\nNote Over A , B: fine\nEND\n"
let printed = @mermaid.print(@mermaid.read(source).ast.unwrap())
assert_eq(
printed,
"sequenceDiagram\n alt Is sick\n B->>-A: Not so good\n else is well\n note over A,B: fine\n end\n",
)
assert_eq(@mermaid.read(printed).ast, @mermaid.read(source).ast)
}///|
test {
let r = @mermaid.read("sequenceDiagram\nA->>B: hi\nfrobnicate A\n")
let d = r.diagnostics[0]
assert_eq(d.code, "mermaid/unknown-statement")
assert_eq(d.span.unwrap().start.line, 3)
assert_eq(r.ast.unwrap().statements.length(), 1)
}| Code | Meaning |
|---|---|
| mermaid/missing-header | The source does not start with sequenceDiagram. There is no AST. |
| mermaid/unexpected-header | The source has a second sequenceDiagram. |
| mermaid/unknown-statement | The statement is not one that the grammar knows. |
| mermaid/missing-message-text | A message has no : and text. |
| mermaid/invalid-message | A message has no receiver. |
| mermaid/invalid-participant | A participant, actor, create, destroy, activate or deactivate statement has no valid name, or its @{...} configuration is not closed. |
| mermaid/invalid-note | A note has no placement, no participant or no text, or left of or right of has two participants. |
| mermaid/invalid-autonumber | autonumber has something other than a start, a step or off. |
| mermaid/invalid-link | A link, links, properties or details statement has no participant or no text. |
| mermaid/invalid-title | A title has no text. |
| mermaid/missing-end | A frame, such as loop or box, has no end. The span is the frame keyword. |
| mermaid/unexpected-end | An end has no open frame. |
| mermaid/misplaced-section | else is not in alt, and is not in par, or option is not in critical. |
| mermaid/invalid-in-box | A box has a statement that is not a participant declaration. |
| mermaid/unclosed-directive | A %%{ directive has no closing }%%. |
| mermaid/unclosed-description | An accDescr { has no closing }. |
///|
test {
assert_eq(@mermaid.diagnostic_codes.iter().to_array(), [
"mermaid/missing-header", "mermaid/unexpected-header", "mermaid/unknown-statement",
"mermaid/missing-message-text", "mermaid/invalid-message", "mermaid/invalid-participant",
"mermaid/invalid-note", "mermaid/invalid-autonumber", "mermaid/invalid-link", "mermaid/invalid-title",
"mermaid/missing-end", "mermaid/unexpected-end", "mermaid/misplaced-section", "mermaid/invalid-in-box",
"mermaid/unclosed-directive", "mermaid/unclosed-description",
])
}| Code | Meaning |
|---|---|
| mermaid/inactive-deactivation | The participant has no active activation. |
| mermaid/destroyed-participant | A statement uses a destroyed participant. |
| mermaid/conflicting-participant-kind | A declaration changes an already declared kind. |
| mermaid/invalid-participant-config | A configuration has invalid fields or an unknown kind. |
| mermaid/missing-destroying-message | A destroy statement has no associated next message involving its participant. |
| mermaid/invalid-links | A links value is not a JSON object. |
| mermaid/conflicting-box-group | A participant is declared in two different boxes. |
| mermaid/duplicate-creation | A create statement names an existing participant. |
///|
test {
let source = "sequenceDiagram\nparticipant W\nlink W: shape @ smithy:example.weather/Weather\nC->>W: example.weather/GetForecast\n"
let converted = @mermaid.to_sequence(@mermaid.read(source).ast.unwrap())
assert_eq(converted.diagnostics.length(), 0)
assert_eq(converted.sequence.participant("W").unwrap().link.unwrap().target, "example.weather#Weather")
}///|
test {
let r = @mermaid.render_svg("sequenceDiagram\nClient->>API: GET /forecast\n")
assert_eq(r.media_type, "image/svg+xml")
assert_true(r.output.unwrap().has_prefix("<svg xmlns=\"http://www.w3.org/2000/svg\""))
}let conversion_diagnostic_codes : ReadOnlyArray[String]let diagnostic_codes : ReadOnlyArray[String]Install
Download zipMermaid for diagrams.mbt: lossless CST, parser, AST, printer and conversion to diagram models