using System; using System.Linq; using System.Linq.Dynamic.Core; using AnyOfTypes; using Newtonsoft.Json.Linq; using Stef.Validation; using WireMock.Extensions; using WireMock.Json; using WireMock.Models; namespace WireMock.Matchers; /// /// System.Linq.Dynamic.Core Expression Matcher /// /// /// public class LinqMatcher : IObjectMatcher, IStringMatcher { private readonly AnyOf[] _patterns; /// public MatchBehaviour MatchBehaviour { get; } /// public bool ThrowException { get; } /// /// Initializes a new instance of the class. /// /// The pattern. public LinqMatcher(AnyOf pattern) : this(new[] { pattern }) { } /// /// Initializes a new instance of the class. /// /// The patterns. public LinqMatcher(params AnyOf[] patterns) : this(MatchBehaviour.AcceptOnMatch, false, MatchOperator.Or, patterns) { } /// /// Initializes a new instance of the class. /// /// The match behaviour. /// The pattern. public LinqMatcher(MatchBehaviour matchBehaviour, AnyOf pattern) : this(matchBehaviour, false, MatchOperator.Or, pattern) { } /// /// Initializes a new instance of the class. /// /// The match behaviour. /// Throw an exception when the internal matching fails because of invalid input. /// The to use. (default = "Or") /// The patterns. public LinqMatcher( MatchBehaviour matchBehaviour, bool throwException = false, MatchOperator matchOperator = MatchOperator.Or, params AnyOf[] patterns) { _patterns = Guard.NotNull(patterns); MatchBehaviour = matchBehaviour; ThrowException = throwException; MatchOperator = matchOperator; } /// public double IsMatch(string? input) { double match = MatchScores.Mismatch; // Convert a single input string to a Queryable string-list with 1 entry. IQueryable queryable = new[] { input }.AsQueryable(); try { // Use the Any(...) method to check if the result matches match = MatchScores.ToScore(_patterns.Select(pattern => queryable.Any(pattern.GetPattern())).ToArray(), MatchOperator); return MatchBehaviourHelper.Convert(MatchBehaviour, match); } catch { if (ThrowException) { throw; } } return MatchBehaviourHelper.Convert(MatchBehaviour, match); } /// public double IsMatch(object? input) { double match = MatchScores.Mismatch; JArray jArray; try { jArray = new JArray { input }; } catch { jArray = new JArray { JToken.FromObject(input) }; } //enumerable = jArray.ToDynamicClassArray(); //JObject value; //switch (input) //{ // case JObject valueAsJObject: // value = valueAsJObject; // break; // case { } valueAsObject: // value = JObject.FromObject(valueAsObject); // break; // default: // return MatchScores.Mismatch; //} // Convert a single object to a Queryable JObject-list with 1 entry. //var queryable1 = new[] { value }.AsQueryable(); var queryable = jArray.ToDynamicClassArray().AsQueryable(); try { // Generate the DynamicLinq select statement. //string dynamicSelect = JsonUtils.GenerateDynamicLinqStatement(value); // Execute DynamicLinq Select statement. //var queryable2 = queryable1.Select(dynamicSelect); // Use the Any(...) method to check if the result matches. var patternsAsStringArray = _patterns.Select(p => p.GetPattern()).ToArray(); var scores = patternsAsStringArray.Select(p => queryable.Any(p)).ToArray(); match = MatchScores.ToScore(_patterns.Select(pattern => queryable.Any(pattern.GetPattern())).ToArray(), MatchOperator); return MatchBehaviourHelper.Convert(MatchBehaviour, match); } catch (Exception e) { if (ThrowException) { throw; } } return MatchBehaviourHelper.Convert(MatchBehaviour, match); } /// public AnyOf[] GetPatterns() { return _patterns; } /// public MatchOperator MatchOperator { get; } /// public string Name => "LinqMatcher"; }