Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,34 @@ chart.EdgeStyling.LinkStyleDefault("color:blue");
var mermaid = chart.Render();
```

## Sequence API status (Mermaid v11)

- Backward compatible API: existing `SequenceDiagramBuilder` calls (`AddMember`, `Message`, `Messaging`, `AltOr`, `Optional`, `Parallel`, `Rect`, `Build`) are preserved.
- New additive API: `Alt(... elseBlocks ...)`, `Break(...)`, `Critical(... options ...)`, `Box(...)`, `Create(...)`, `Destroy(...)`.
- Mermaid v11 additions: participant stereotypes (`boundary/control/entity/database/collections/queue`) and additional message arrows (bidirectional and half-arrows).

### Quick sequence example

```csharp
using FluentMermaid.SequenceDiagram;
using FluentMermaid.SequenceDiagram.Enum;

var sequence = new SequenceDiagramBuilder(autoNumber: true);
var api = sequence.AddMember("API", MemberType.Control);
var db = sequence.AddMember("DB", MemberType.Database);

sequence.Create(db);
sequence.Box("Aqua", "Persistence", d =>
{
d.Critical("Write transaction", c => c.Message(api, db, "INSERT", MessageType.SolidArrow),
("Timeout", o => o.Break("Abort", b => b.Note(api, NoteLocation.RightOf, "rollback"))),
("OK", o => o.NoteOver("committed", api, db)));
});
sequence.Destroy(db);

var mermaid = sequence.Build();
```

# Roadmap
- [x] [Flowchart](https://mermaid.js.org/syntax/flowchart.html)
- [x] [Sequence diagram](https://mermaid.js.org/syntax/sequenceDiagram.html)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System.Diagnostics;
using System.Diagnostics;
using FluentMermaid.SequenceDiagram;
using FluentMermaid.SequenceDiagram.Enum;
using FluentMermaid.SequenceDiagram.Interfaces;
Expand Down Expand Up @@ -44,12 +44,25 @@ private static string CreateSequenceDiagram()

IMember bob = builder.AddMember("Bob", MemberType.Participant);
bob.AddLink("Wiki", new Uri("https://wiki.contoso.com/alice"));
IMember kitchen = builder.AddMember("KitchenService", MemberType.Control);
IMember pantryDb = builder.AddMember("PantryDb", MemberType.Database);

builder.AltOr(
"Alice hungry",
diagram => diagram.Message(alice, bob, "Wait Bob, I need something to eat", MessageType.Solid),
"Alice not hungry",
diagram => diagram.Message(alice, bob, "Ok, let`s go", MessageType.Solid));

builder.Create(pantryDb);
builder.Box("Aqua", "Dinner prep", diagram =>
{
diagram.Critical(
"Order snack",
critical => critical.Message(kitchen, pantryDb, "Reserve ingredients", MessageType.SolidArrow),
("Kitchen timeout", option => option.Break("Abort dinner", aborted => aborted.NoteOver("Order cancelled", alice, bob))),
("Kitchen available", option => option.NoteOver("Snack is ready", alice, bob)));
});
builder.Destroy(pantryDb);

builder.NoteOver("Teenagers", alice, bob);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using FluentMermaid.SequenceDiagram;
using FluentMermaid.SequenceDiagram;
using FluentMermaid.SequenceDiagram.Enum;
using FluentMermaid.SequenceDiagram.Interfaces;
using Microsoft.AspNetCore.Mvc;
Expand Down Expand Up @@ -27,12 +27,25 @@ private static string CreateSequenceDiagram()

IMember bob = builder.AddMember("Bob", MemberType.Participant);
bob.AddLink("Wiki", new Uri("https://wiki.contoso.com/alice"));
IMember kitchen = builder.AddMember("KitchenService", MemberType.Control);
IMember pantryDb = builder.AddMember("PantryDb", MemberType.Database);

builder.AltOr(
"Alice hungry",
diagram => diagram.Message(alice, bob, "Wait Bob, I need something to eat", MessageType.Solid),
"Alice not hungry",
diagram => diagram.Message(alice, bob, "Ok, let`s go", MessageType.Solid));

builder.Create(pantryDb);
builder.Box("Aqua", "Dinner prep", diagram =>
{
diagram.Critical(
"Order snack",
critical => critical.Message(kitchen, pantryDb, "Reserve ingredients", MessageType.SolidArrow),
("Kitchen timeout", option => option.Break("Abort dinner", aborted => aborted.NoteOver("Order cancelled", alice, bob))),
("Kitchen available", option => option.NoteOver("Snack is ready", alice, bob)));
});
builder.Destroy(pantryDb);

builder.NoteOver("Teenagers", alice, bob);

Expand Down
30 changes: 30 additions & 0 deletions src/FluentMermaid/SequenceDiagram/Actions/BoxStart.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using System.Text;
using FluentMermaid.SequenceDiagram.Interfaces;

namespace FluentMermaid.SequenceDiagram.Actions;

internal readonly struct BoxStart : IAction
{
public BoxStart(string? color, string? label)
{
Color = color;
Label = label;
}

public string? Color { get; }

public string? Label { get; }

public void RenderTo(StringBuilder builder)
{
builder.Append("box");

if (!string.IsNullOrWhiteSpace(Color))
builder.Append(' ').Append(Color);

if (!string.IsNullOrWhiteSpace(Label))
builder.Append(' ').Append(Label);

builder.AppendLine();
}
}
23 changes: 23 additions & 0 deletions src/FluentMermaid/SequenceDiagram/Actions/BreakStart.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System.Text;
using FluentMermaid.SequenceDiagram.Interfaces;

namespace FluentMermaid.SequenceDiagram.Actions;

internal readonly struct BreakStart : IAction
{
public BreakStart(string? title)
{
Title = title;
}

public string? Title { get; }

public void RenderTo(StringBuilder builder)
{
builder.Append("break");
if (!string.IsNullOrWhiteSpace(Title))
builder.Append(' ').Append(Title);

builder.AppendLine();
}
}
24 changes: 24 additions & 0 deletions src/FluentMermaid/SequenceDiagram/Actions/Create.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using System.Text;
using FluentMermaid.SequenceDiagram.Enum;
using FluentMermaid.SequenceDiagram.Interfaces;

namespace FluentMermaid.SequenceDiagram.Actions;

internal readonly struct Create : IAction
{
public Create(IMember member)
{
Member = member;
}

public IMember Member { get; }

public void RenderTo(StringBuilder builder)
{
builder
.Append("create ")
.Append(Member.Type == MemberType.Actor ? "actor" : "participant")
.Append(' ')
.AppendLine(Member.Id);
}
}
23 changes: 23 additions & 0 deletions src/FluentMermaid/SequenceDiagram/Actions/CriticalStart.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System.Text;
using FluentMermaid.SequenceDiagram.Interfaces;

namespace FluentMermaid.SequenceDiagram.Actions;

internal readonly struct CriticalStart : IAction
{
public CriticalStart(string? title)
{
Title = title;
}

public string? Title { get; }

public void RenderTo(StringBuilder builder)
{
builder.Append("critical");
if (!string.IsNullOrWhiteSpace(Title))
builder.Append(' ').Append(Title);

builder.AppendLine();
}
}
21 changes: 21 additions & 0 deletions src/FluentMermaid/SequenceDiagram/Actions/Destroy.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System.Text;
using FluentMermaid.SequenceDiagram.Interfaces;

namespace FluentMermaid.SequenceDiagram.Actions;

internal readonly struct Destroy : IAction
{
public Destroy(IMember member)
{
Member = member;
}

public IMember Member { get; }

public void RenderTo(StringBuilder builder)
{
builder
.Append("destroy ")
.AppendLine(Member.Id);
}
}
4 changes: 2 additions & 2 deletions src/FluentMermaid/SequenceDiagram/Actions/Message.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System.Text;
using System.Text;
using FluentMermaid.SequenceDiagram.Enum;
using FluentMermaid.SequenceDiagram.Extensions;
using FluentMermaid.SequenceDiagram.Interfaces;
Expand Down Expand Up @@ -34,6 +34,6 @@ public void RenderTo(StringBuilder builder)
.Append(Type.Render())
.Append(To.Id)
.Append(": ")
.AppendLine(Text);
.AppendLine(Text.RenderText());
}
}
4 changes: 2 additions & 2 deletions src/FluentMermaid/SequenceDiagram/Actions/Note.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System.Text;
using System.Text;
using FluentMermaid.SequenceDiagram.Enum;
using FluentMermaid.SequenceDiagram.Extensions;
using FluentMermaid.SequenceDiagram.Interfaces;
Expand Down Expand Up @@ -31,6 +31,6 @@ public void RenderTo(StringBuilder builder)
.Append(' ')
.Append(Member.Id)
.Append(':')
.AppendLine(Text);
.AppendLine(Text.RenderText());
}
}
4 changes: 2 additions & 2 deletions src/FluentMermaid/SequenceDiagram/Actions/NoteOver.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System.Text;
using System.Text;
using FluentMermaid.SequenceDiagram.Enum;
using FluentMermaid.SequenceDiagram.Extensions;
using FluentMermaid.SequenceDiagram.Interfaces;
Expand Down Expand Up @@ -26,6 +26,6 @@ public void RenderTo(StringBuilder builder)
.Append(' ')
.AppendJoin(',', Members.Select(m => m.Id))
.Append(':')
.AppendLine(Text);
.AppendLine(Text.RenderText());
}
}
23 changes: 23 additions & 0 deletions src/FluentMermaid/SequenceDiagram/Actions/OptionStart.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System.Text;
using FluentMermaid.SequenceDiagram.Interfaces;

namespace FluentMermaid.SequenceDiagram.Actions;

internal readonly struct OptionStart : IAction
{
public OptionStart(string? title)
{
Title = title;
}

public string? Title { get; }

public void RenderTo(StringBuilder builder)
{
builder.Append("option");
if (!string.IsNullOrWhiteSpace(Title))
builder.Append(' ').Append(Title);

builder.AppendLine();
}
}
10 changes: 8 additions & 2 deletions src/FluentMermaid/SequenceDiagram/Enum/MemberType.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
namespace FluentMermaid.SequenceDiagram.Enum;
namespace FluentMermaid.SequenceDiagram.Enum;

public enum MemberType
{
Participant,
Actor
Actor,
Boundary,
Control,
Entity,
Database,
Collections,
Queue
}
22 changes: 20 additions & 2 deletions src/FluentMermaid/SequenceDiagram/Enum/MessageType.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace FluentMermaid.SequenceDiagram.Enum;
namespace FluentMermaid.SequenceDiagram.Enum;

public enum MessageType
{
Expand All @@ -9,5 +9,23 @@ public enum MessageType
SolidCross,
DottedCross,
SolidOpenArrow,
DottedOpenArrow
DottedOpenArrow,
SolidBidirectionalArrow,
DottedBidirectionalArrow,
SolidTopHalfArrow,
DottedTopHalfArrow,
SolidBottomHalfArrow,
DottedBottomHalfArrow,
SolidReverseTopHalfArrow,
DottedReverseTopHalfArrow,
SolidReverseBottomHalfArrow,
DottedReverseBottomHalfArrow,
SolidTopStickHalfArrow,
DottedTopStickHalfArrow,
SolidBottomStickHalfArrow,
DottedBottomStickHalfArrow,
SolidReverseTopStickHalfArrow,
DottedReverseTopStickHalfArrow,
SolidReverseBottomStickHalfArrow,
DottedReverseBottomStickHalfArrow
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using FluentMermaid.SequenceDiagram.Enum;
using FluentMermaid.SequenceDiagram.Enum;

namespace FluentMermaid.SequenceDiagram.Extensions;

Expand All @@ -9,6 +9,12 @@ public static string Render(this MemberType type)
{
MemberType.Actor => "actor",
MemberType.Participant => "participant",
MemberType.Boundary => "boundary",
MemberType.Control => "control",
MemberType.Entity => "entity",
MemberType.Database => "database",
MemberType.Collections => "collections",
MemberType.Queue => "queue",
_ => throw new ArgumentOutOfRangeException(nameof(type), type, null)
};
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using FluentMermaid.SequenceDiagram.Enum;
using FluentMermaid.SequenceDiagram.Enum;

namespace FluentMermaid.SequenceDiagram.Extensions;

Expand All @@ -15,6 +15,24 @@ public static string Render(this MessageType type)
MessageType.DottedCross => "--x",
MessageType.SolidOpenArrow => "-)",
MessageType.DottedOpenArrow => "--)",
MessageType.SolidBidirectionalArrow => "<<->>",
MessageType.DottedBidirectionalArrow => "<<-->>",
MessageType.SolidTopHalfArrow => "-|\\",
MessageType.DottedTopHalfArrow => "--|\\",
MessageType.SolidBottomHalfArrow => "-|/",
MessageType.DottedBottomHalfArrow => "--|/",
MessageType.SolidReverseTopHalfArrow => "/|-",
MessageType.DottedReverseTopHalfArrow => "/|--",
MessageType.SolidReverseBottomHalfArrow => "\\|-",
MessageType.DottedReverseBottomHalfArrow => "\\|--",
MessageType.SolidTopStickHalfArrow => "-\\\\",
MessageType.DottedTopStickHalfArrow => "--\\\\",
MessageType.SolidBottomStickHalfArrow => "-//",
MessageType.DottedBottomStickHalfArrow => "--//",
MessageType.SolidReverseTopStickHalfArrow => "//-",
MessageType.DottedReverseTopStickHalfArrow => "//--",
MessageType.SolidReverseBottomStickHalfArrow => "\\\\-",
MessageType.DottedReverseBottomStickHalfArrow => "\\\\--",
_ => throw new ArgumentOutOfRangeException(nameof(type), type, null)
};
}
Loading
Loading