namespace ZB.MOM.WW.OtOpcUa.Commons.Engines;
///
/// Abstraction over the scripted-alarm predicate engine. Production binds this to a
/// wrapper around ScriptedAlarmEngine from Core.ScriptedAlarms; default
/// binding is which keeps the alarm in its
/// current state (so an unconfigured node never spuriously alarms).
///
public interface IScriptedAlarmEvaluator
{
ScriptedAlarmEvalResult Evaluate(string alarmId, string predicate, IReadOnlyDictionary dependencies);
}
/// Result of one alarm-predicate evaluation. Active is only meaningful when
/// Success is true; on failure the caller should keep the prior state and log Reason.
public sealed record ScriptedAlarmEvalResult(bool Success, bool Active, string? Reason)
{
public static ScriptedAlarmEvalResult Ok(bool active) => new(true, active, null);
public static ScriptedAlarmEvalResult Failure(string reason) => new(false, false, reason);
}
/// Default that always returns Active = false, Success = true. Safe no-op:
/// no alarm fires when no real engine is bound.
public sealed class NullScriptedAlarmEvaluator : IScriptedAlarmEvaluator
{
public static readonly NullScriptedAlarmEvaluator Instance = new();
private NullScriptedAlarmEvaluator() { }
public ScriptedAlarmEvalResult Evaluate(string alarmId, string predicate, IReadOnlyDictionary dependencies)
=> ScriptedAlarmEvalResult.Ok(active: false);
}