// Copyright © WireMock.Net using Stef.Validation; using WireMock.Extensions; namespace WireMock.Matchers; /// /// FuncMatcher - matches using a custom function /// /// public class FuncMatcher : IFuncMatcher { private readonly Func? _stringFunc; private readonly Func? _bytesFunc; /// public MatchBehaviour MatchBehaviour { get; } /// /// Initializes a new instance of the class for string matching. /// /// The function to check if a string is a match. /// The match behaviour. public FuncMatcher(Func func, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) { _stringFunc = Guard.NotNull(func); MatchBehaviour = matchBehaviour; } /// /// Initializes a new instance of the class for byte array matching. /// /// The function to check if a byte[] is a match. /// The match behaviour. public FuncMatcher(Func func, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) { _bytesFunc = Guard.NotNull(func); MatchBehaviour = matchBehaviour; } /// public MatchResult IsMatch(object? value) { if (value is string stringValue && _stringFunc != null) { try { return MatchResult.From(Name, MatchBehaviour, _stringFunc(stringValue)); } catch (Exception ex) { return MatchResult.From(Name, ex); } } if (value is byte[] bytesValue && _bytesFunc != null) { try { return MatchResult.From(Name, MatchBehaviour, _bytesFunc(bytesValue)); } catch (Exception ex) { return MatchResult.From(Name, ex); } } return MatchResult.From(Name, MatchScores.Mismatch); } /// public string Name => nameof(FuncMatcher); /// public string GetCSharpCodeArguments() { var funcType = _stringFunc != null ? "Func" : "Func"; return $"new {Name}" + $"(" + $"/* {funcType} function */, " + $"{MatchBehaviour.GetFullyQualifiedEnumValue()}" + $")"; } }