IValidable
IValidable is an interface for classes whose state can be validated.
/// <summary>Interface for classes whose state can be verified to be valid.</summary>
public interface IValidable
{
/// <summary>Check object for invalid state causes.</summary>
/// <returns>Return validation messages.</returns>
IEnumerable<IMessage> Validate();
}
.Validate() returns all validation messages.
MyClass myClass = new MyClass(null, null);
IEnumerable<IMessage> messages = myClass.Validate();
WriteLine(string.Join(", ", messages)); // Parameter 'Name' cannot be null., Parameter 'Label' cannot be null.
.ValidateSingle() returns a single validation message, prioritizing critical ones.
MyClass myClass = new MyClass(null, null);
IMessage message = myClass.ValidateSingle();
WriteLine(message); // Parameter 'Name' cannot be null.
.AssertGood() asserts that all validation messages are Good. If not ValidationException is thrown.
MyClass myClass = new MyClass("ABC", "Hello").AssertGood();
.AssertNotBad() asserts that all validation codes are Good or Uncertain. If not ValidationException is thrown.
try
{
MyClass myClass = new MyClass(null, null).AssertNotBad();
}
catch (Exception e) when (e.HResult == SystemMessages.ArgumentNull.WithParamName.HResult)
{
// "Avalanche.Message.ValidationException: (Parameter 'Name' cannot be null.) (Parameter 'Label' cannot be null.)"
// " at validable.Run() in validable.cs:line 41"
WriteLine(e);
}
IValidable implementation returns messages as validation codes. See mscorlib.dll for scraped Argument, ArgumentNull and ArgumentOutOfRange validation messages.
public class MyClass : IValidable
{
public string? Name;
public string? Label;
public MyClass(string? name, string? label)
{
Name = name;
Label = label;
}
/// <summary>Validate class</summary>
/// <returns>Return validation errors.</returns>
public IEnumerable<IMessage> Validate()
{
// Place codes here
StructList2<IMessage> codes = new();
// Validate 'Name' not null
if (Name == null) codes.Add( SystemMessages.ArgumentNull.WithParamName.NameOf(Name) );
// Validate 'Label' not null
if (Label == null) codes.Add( SystemMessages.ArgumentNull.WithParamName.NameOf(Label) );
// Good
if (codes.Count == 0) codes.Add(HResult.S_OK.New());
// Return
return codes.ToArray(); // If empty returns singleton T[0].
}
}
Full Example
Full example
using System;
using System.Collections.Generic;
using Avalanche.Utilities;
using Avalanche.Message;
using static System.Console;
using Avalanche.StatusCode;
class validation
{
public static void Run()
{
{
// <01>
MyClass myClass = new MyClass(null, null);
IMessage message = myClass.ValidateSingle();
WriteLine(message); // Parameter 'Name' cannot be null.
// </01>
}
{
// <02>
MyClass myClass = new MyClass(null, null);
IEnumerable<IMessage> messages = myClass.Validate();
WriteLine(string.Join(", ", messages)); // Parameter 'Name' cannot be null., Parameter 'Label' cannot be null.
// </02>
}
{
// <03>
MyClass myClass = new MyClass("ABC", "Hello");
IMessage message = myClass.ValidateSingle();
WriteLine(message); // "Operation successful"
// </03>
}
{
// <11>
MyClass myClass = new MyClass("ABC", "Hello").AssertGood();
// </11>
}
// <12>
try
{
MyClass myClass = new MyClass(null, null).AssertNotBad();
}
catch (Exception e) when (e.HResult == SystemMessages.ArgumentNull.WithParamName.HResult)
{
// "Avalanche.Message.ValidationException: (Parameter 'Name' cannot be null.) (Parameter 'Label' cannot be null.)"
// " at validable.Run() in validable.cs:line 41"
WriteLine(e);
}
// </12>
}
// <90>
public class MyClass : IValidable
{
public string? Name;
public string? Label;
public MyClass(string? name, string? label)
{
Name = name;
Label = label;
}
/// <summary>Validate class</summary>
/// <returns>Return validation errors.</returns>
public IEnumerable<IMessage> Validate()
{
// Place codes here
StructList2<IMessage> codes = new();
// Validate 'Name' not null
if (Name == null) codes.Add( SystemMessages.ArgumentNull.WithParamName.NameOf(Name) );
// Validate 'Label' not null
if (Label == null) codes.Add( SystemMessages.ArgumentNull.WithParamName.NameOf(Label) );
// Good
if (codes.Count == 0) codes.Add(HResult.S_OK.New());
// Return
return codes.ToArray(); // If empty returns singleton T[0].
}
}
// </90>
}