Utility class that ensures a required host network service is published. It calls a provided publish function and on failure or exception runs a provided cleanup action exactly once, returning an OperationResult<T> success or failure.
#nullable enable
using System;
using Hexagon.V2.Kernel;
namespace Hexagon.V2.Runtime;
/// <summary>
/// Testable publication transaction for required host network services.
/// Cleanup is attempted exactly once whenever publication does not succeed.
/// </summary>
internal static class HostServicePublication
{
public static OperationResult<T> RequirePublished<T>(
T value,
Func<bool> publish,
Action cleanup )
{
ArgumentNullException.ThrowIfNull( value );
ArgumentNullException.ThrowIfNull( publish );
ArgumentNullException.ThrowIfNull( cleanup );
try
{
if ( publish() ) return OperationResult<T>.Success( value );
return FailAfterCleanup<T>(
cleanup,
"Hexagon host services could not be network-published." );
}
catch ( Exception exception )
{
return FailAfterCleanup<T>(
cleanup,
$"Hexagon host-service publication threw: {exception.Message}" );
}
}
private static OperationResult<T> FailAfterCleanup<T>( Action cleanup, string message )
{
try { cleanup(); }
catch ( Exception cleanupException )
{
return OperationResult<T>.Failure(
ErrorCode.InternalError,
$"{message} Partial-service cleanup also failed: {cleanupException.Message}" );
}
return OperationResult<T>.Failure( ErrorCode.InternalError, message );
}
}