IMessageDescription
IMessageDescription is a description of message with formatting template, parameters and status code.
/// <summary>Message description</summary>
public interface IMessageDescription : IUserDataContainer
{
/// <summary>Numeric identifier of the message type (in undetermined numbering schema).</summary>
int? Code { get; set; }
/// <summary>HResult code.</summary>
int? HResult { get; set; }
/// <summary>Http StatusCode</summary>
int? HttpStatusCode { get; set; }
/// <summary>String identifier as canonical string, e.g. <![CDATA["MyLibrary.MyEvent"]]>.</summary>
string Key { get; set; }
/// <summary>Message template that has parameters as placeholders.</summary>
ITemplateText Template { get; set; }
/// <summary>Message severity level for logging.</summary>
MessageLevel? Severity { get; set; }
/// <summary>Description about event. May contain xml.</summary>
string? Description { get; set; }
/// <summary>Link to the help Uniform Resource Name (URN) or Uniform Resource Locator (URL).</summary>
string? HelpLink { get; set; }
/// <summary>Exception info as: <see cref="Type"/>, <see cref="string"/> or <see cref="Delegate"/> constructor as <![CDATA[Func<IMessage, Exception>]]>.</summary>
object? Exception { get; set; }
}
MessageDescription is the default implementation.
IMessageDescription messageDescription = new MessageDescription(
key: "MyLibrary.Uncertain",
code: 0x0AC40000 | StatusCodes.Uncertain,
messageTemplate: "'{object}': Uncertain status"
).SetReadOnly();
MessageDescription can be created with initializer { }. ITemplateText represent the template string.
IMessageDescription messageDescription = new MessageDescription
{
Key = "MyLibrary.Uncertain",
Code = 0x0AC40000 | StatusCodes.Uncertain,
Template = TemplateFormat.BraceAlphaNumeric.Breakdown["'{object}': Uncertain status"],
Description = "Status code is uncertain."
}.SetReadOnly();
.Template.Breakdown.FormatTemplate() returns string.Format() compatible formatting template.
IMessageDescription messageDescription = new MessageDescription("Uncertain", 0x4AC40000, "'{object}': Uncertain status");
WriteLine(messageDescription.Template.Breakdown.FormatTemplate()); // "'{0}': Uncertain status"
WriteLine(messageDescription.Template.Breakdown.FormatTemplate(), "MyObject"); // "'MyObject': Uncertain status"
.Template.Breakdown.LoggerTemplate() returns logger template format.
IMessageDescription messageDescription = new MessageDescription("Uncertain", 0x4AC40000, "'{object}': Uncertain status");
WriteLine(messageDescription.Template.Breakdown.LoggerTemplate()); // "'{object}': Uncertain status"
.Template.ParameterNames returns parameter names.
IMessageDescription messageDescription = new MessageDescription("Uncertain", 0x4AC40000, "'{object}': Uncertain status");
WriteLine(string.Join(", ", messageDescription.Template.ParameterNames)); // "object"
IMessageDescription messageDescription = new MessageDescription("Uncertain", 0x4AC40000, "'{object}': Uncertain status");
WriteLine(string.Join(", ", messageDescription.Template.ParameterNames)); // "object"
Exception
.SetException(type) assigns the default exception type.
IMessageDescription bad = new MessageDescription("MyLibrary.Bad", 0x8AC40000, "'{object}': Bad")
.SetException(typeof(InvalidOperationException));
.GetExceptionTypeName() returns the assigned default exception as type name string.
WriteLine(bad.GetExceptionTypeName()); // "System.InvalidOperationException"
If not explicitly requested for specific type, the constructed exception is of assigned type.
InvalidOperationException e = (InvalidOperationException)bad.NewException("MyObj");
.SetException(string) assigns the default exception type as string, either assembly qualified or non-qualified.
IMessageDescription bad = new MessageDescription("MyLibrary.Bad", 0x8AC40000, "'{object}': Bad")
.SetException("System.InvalidOperationException");
// Print exception type
WriteLine(bad.GetExceptionTypeName()); // "System.InvalidOperationException"
// Create exception
InvalidOperationException e = (InvalidOperationException)bad.NewException("MyObj");
.SetException(delegate) assigns exception constructor delegate.
IMessageDescription bad = new MessageDescription("MyLibrary.Bad", 0x8AC40000, "'{object}': Bad")
.SetException(InvalidOperationException(IMessage m) => new InvalidOperationException(m.Print()));
// Print exception type
WriteLine(bad.GetExceptionTypeName()); // "System.InvalidOperationException"
// Create exception
InvalidOperationException e = (InvalidOperationException)bad.NewException("MyObj");
Constructor delegate can take inner exception as argument.
IMessageDescription bad = new MessageDescription("MyLibrary.Bad", 0x8AC40000, "'{object}': Bad")
.SetException(InvalidOperationException(IMessage m, Exception? innerException) => new InvalidOperationException(m.Print(), innerException));
// Print exception type
WriteLine(bad.GetExceptionTypeName()); // "System.InvalidOperationException"
// Create exception
Exception e = bad.New("MyObj").SetError(new Exception("inner exception")).NewException();
// Print inner exception
WriteLine(e.InnerException);
Full Example
Full example
using System;
using System.Collections.Generic;
using Avalanche.Utilities;
using Avalanche.Message;
using static System.Console;
using Microsoft.Extensions.Logging;
using Avalanche.Template;
class messagedescription
{
public static void Run()
{
{
// <01>
IMessageDescription messageDescription = new MessageDescription(
key: "MyLibrary.Uncertain",
code: 0x0AC40000 | StatusCodes.Uncertain,
messageTemplate: "'{object}': Uncertain status"
).SetReadOnly();
// </01>
}
{
// <02>
IMessageDescription messageDescription = new MessageDescription
{
Key = "MyLibrary.Uncertain",
Code = 0x0AC40000 | StatusCodes.Uncertain,
Template = TemplateFormat.BraceAlphaNumeric.Breakdown["'{object}': Uncertain status"],
Description = "Status code is uncertain."
}.SetReadOnly();
// </02>
}
{
// <02B>
IMessageDescription messageDescription = new MessageDescription("Uncertain", 0x4AC40000, "'{object}': Uncertain status");
WriteLine(messageDescription.Template.Breakdown.FormatTemplate()); // "'{0}': Uncertain status"
WriteLine(messageDescription.Template.Breakdown.FormatTemplate(), "MyObject"); // "'MyObject': Uncertain status"
// </02B>
}
{
// <02C>
IMessageDescription messageDescription = new MessageDescription("Uncertain", 0x4AC40000, "'{object}': Uncertain status");
WriteLine(messageDescription.Template.Breakdown.LoggerTemplate()); // "'{object}': Uncertain status"
// </02C>
}
{
// <02D>
IMessageDescription messageDescription = new MessageDescription("Uncertain", 0x4AC40000, "'{object}': Uncertain status");
WriteLine(string.Join(", ", messageDescription.Template.ParameterNames)); // "object"
// </02D>
}
{
// <03>
List<IMessageDescription> list = new List<IMessageDescription>
{
CoreMessages.Instance.BadNotValid,
CoreMessages.Instance.Uncertain,
CoreMessages.Instance.GoodValid
};
list.Sort(MessageDescriptionComparer.CodeKeyTemplate);
// </03>
}
{
// <05>
IMessageDescription good = new MessageDescription("MyLibrary.Good", 0x0AC40000, "'{object}': Good").SetReadOnly();
IMessageDescription uncertain = new MessageDescription("MyLibrary.Uncertain", 0x4AC40000, "'{object}': Uncertain").SetReadOnly();
IMessageDescription bad = new MessageDescription("MyLibrary.Bad", 0x8AC40000, "'{object}': Bad").SetReadOnly();
WriteLine(good.IsGood()); // True
WriteLine(good.IsBad()); // False
WriteLine(good.IsUncertain()); // False
WriteLine(good.IsNotBad()); // True
WriteLine(good.IsNotGood()); // False
// </05>
}
{
// <10>
IMessageDescription bad = new MessageDescription("MyLibrary.Bad", 0x8AC40000, "'{object}': Bad")
.SetException(typeof(InvalidOperationException));
// </10>
// <11>
WriteLine(bad.GetExceptionTypeName()); // "System.InvalidOperationException"
// </11>
// <12>
InvalidOperationException e = (InvalidOperationException)bad.NewException("MyObj");
// </12>
}
{
// <13>
IMessageDescription bad = new MessageDescription("MyLibrary.Bad", 0x8AC40000, "'{object}': Bad")
.SetException("System.InvalidOperationException");
// Print exception type
WriteLine(bad.GetExceptionTypeName()); // "System.InvalidOperationException"
// Create exception
InvalidOperationException e = (InvalidOperationException)bad.NewException("MyObj");
// </13>
}
{
// <14>
IMessageDescription bad = new MessageDescription("MyLibrary.Bad", 0x8AC40000, "'{object}': Bad")
.SetException(InvalidOperationException(IMessage m) => new InvalidOperationException(m.Print()));
// Print exception type
WriteLine(bad.GetExceptionTypeName()); // "System.InvalidOperationException"
// Create exception
InvalidOperationException e = (InvalidOperationException)bad.NewException("MyObj");
// </14>
}
{
// <15>
IMessageDescription bad = new MessageDescription("MyLibrary.Bad", 0x8AC40000, "'{object}': Bad")
.SetException(InvalidOperationException(IMessage m, Exception? innerException) => new InvalidOperationException(m.Print(), innerException));
// Print exception type
WriteLine(bad.GetExceptionTypeName()); // "System.InvalidOperationException"
// Create exception
Exception e = bad.New("MyObj").SetError(new Exception("inner exception")).NewException();
// Print inner exception
WriteLine(e.InnerException);
// </15>
}
}
}