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); }