Rothanzl.SaunterFork
0.0.2
See the version list below for details.
dotnet add package Rothanzl.SaunterFork --version 0.0.2
NuGet\Install-Package Rothanzl.SaunterFork -Version 0.0.2
<PackageReference Include="Rothanzl.SaunterFork" Version="0.0.2" />
paket add Rothanzl.SaunterFork --version 0.0.2
#r "nuget: Rothanzl.SaunterFork, 0.0.2"
// Install Rothanzl.SaunterFork as a Cake Addin #addin nuget:?package=Rothanzl.SaunterFork&version=0.0.2 // Install Rothanzl.SaunterFork as a Cake Tool #tool nuget:?package=Rothanzl.SaunterFork&version=0.0.2
Rothanzl's fork of Saunter
Saunter
Saunter is an AsyncAPI documentation generator for dotnet.
ℹ Note that pre version 1.0.0, the API is regarded as unstable and breaking changes may be introduced.
Getting Started
Install the Saunter package
dotnet add package Rothanzl.SaunterFork
In the
ConfigureServices
method ofStartup.cs
, configure Saunter.// Add Saunter to the application services. services.AddAsyncApiSchemaGeneration(options => { // Specify example type(s) from assemblies to scan. options.AssemblyMarkerTypes = new[] {typeof(StreetlightMessageBus)}; // Build as much (or as little) of the AsyncApi document as you like. // Saunter will generate Channels, Operations, Messages, etc, but you // may want to specify Info here. options.AsyncApi = new AsyncApiDocument { Info = new Info("Streetlights API", "1.0.0") { Description = "The Smartylighting Streetlights API allows you\nto remotely manage the city lights.", License = new License("Apache 2.0") { Url = "https://www.apache.org/licenses/LICENSE-2.0" } }, Servers = { { "mosquitto", new Server("test.mosquitto.org", "mqtt") } } }; });
TODO
Add saunter middleware to host the AsyncApi json document. In the
Configure
method ofStartup.cs
:app.UseEndpoints(endpoints => { endpoints.MapAsyncApiDocuments(); endpoints.MapAsyncApiUi(); });
Use the published AsyncApi document:
// HTTP GET /asyncapi/asyncapi.json { // Properties from Startup.cs "asyncapi": "2.1.0", "info": { "title": "Streetlights API", "version": "1.0.0", "description": "The Smartylighting Streetlights API allows you\nto remotely manage the city lights.", // ... }, // Properties generated from Attributes "channels": { "light/measured": { "publish": { "operationId": "PublishLightMeasuredEvent", "summary": "Inform about environmental lighting conditions for a particular streetlight.", //... }
Use the published AsyncAPI UI:
Configuration
See the options source code for detailed info.
Common options are below:
services.AddAsyncApiSchemaGeneration(options =>
{
options.AssemblyMarkerTypes = new[] { typeof(Startup) }; // Tell Saunter where to scan for your classes.
options.AddChannelItemFilter<MyChannelItemFilter>(); // Dynamically update ChanelItems
options.AddOperationFilter<MyOperationFilter>(); // Dynamically update Operations
options.Middleware.Route = "/asyncapi/asyncapi.json"; // AsyncAPI JSON document URL
options.Middleware.UiBaseRoute = "/asyncapi/ui/"; // AsyncAPI UI URL
options.Middleware.UiTitle = "My AsyncAPI Documentation"; // AsyncAPI UI page title
}
JSON Schema Settings
The JSON schema generation can be customized using the options.JsonSchemaGeneratorSettings
. Saunter defaults to the popular camelCase
naming strategy for both properties and types.
For example, setting to use PascalCase:
services.AddAsyncApiSchemaGeneration(options =>
{
options.JsonSchemaGeneratorSettings.TypeNameGenerator = new DefaultTypeNameGenerator();
// Note: need to assign a new JsonSerializerSettings, not just set the properties within it.
options.JsonSchemaGeneratorSettings.SerializerSettings = new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver(),
Formatting = Formatting.Indented;
};
}
You have access to the full range of both NJsonSchema and JSON.NET settings to configure the JSON schema generation, including custom ContractResolvers.
Bindings
Bindings are used to describe protocol specific information. These can be added to the AsyncAPI document and then applied to different components by setting the BindingsRef
property in the relevant attributes [OperationAttribute]
, [MessageAttribute]
, [ChannelAttribute]
// Startup.cs
services.AddAsyncApiSchemaGeneration(options =>
{
options.AsyncApi = new AsyncApiDocument
{
Components =
{
ChannelBindings =
{
["my-amqp-binding"] = new ChannelBindings
{
Amqp = new AmqpChannelBinding
{
Is = AmqpChannelBindingIs.RoutingKey,
Exchange = new AmqpChannelBindingExchange
{
Name = "example-exchange",
VirtualHost = "/development"
}
}
}
}
}
}
});
[Channel("light.measured", BindingsRef = "my-amqp-binding")] // Set the BindingsRef property
public void PublishLightMeasuredEvent(Streetlight streetlight, int lumens) {}
Available bindings:
Multiple AsyncAPI documents
You can generate multiple AsyncAPI documents by using the ConfigureNamedAsyncApi
extension method.
// Startup.cs
// Add Saunter to the application services.
services.AddAsyncApiSchemaGeneration(options =>
{
// Specify example type(s) from assemblies to scan.
options.AssemblyMarkerTypes = new[] {typeof(FooMessageBus)};
}
// Configure one or more named AsyncAPI documents
services.ConfigureNamedAsyncApi("Foo", asyncApi =>
{
asyncApi.Info = new Info("Foo API", "1.0.0");
// ...
});
services.ConfigureNamedAsyncApi("Bar", asyncApi =>
{
asyncApi.Info = new Info("Bar API", "1.0.0");
// ...
});
Classes need to be decorated with the AsyncApiAttribute
specifying the name of the AsyncAPI document.
[AsyncApi("Foo")]
public class FooMessageBus
{
// Any channels defined in this class will be added to the "Foo" document
}
[AsyncApi("Bar")]
public class BarMessageBus
{
// Any channels defined in this class will be added to the "Bar" document
}
Each document can be accessed by specifying the name in the URL
// GET /asyncapi/foo/asyncapi.json
{
"info": {
"title": "Foo API"
}
}
// GET /asyncapi/bar/asyncapi.json
{
"info": {
"title": "Bar API"
}
}
Contributing
See our contributing guide.
Feel free to get involved in the project by opening issues, or submitting pull requests.
You can also find me on the AsyncAPI community slack.
Thanks
- This project is heavily inspired by Swashbuckle.
- We use NJsonSchema for the JSON schema heavy lifting,
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net6.0
- NJsonSchema (>= 10.7.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.