using System.Linq; using System.Linq.Dynamic.Core; using JetBrains.Annotations; using Newtonsoft.Json.Linq; using WireMock.Util; namespace WireMock.Matchers { /// /// System.Linq.Dynamic.Core Expression Matcher /// /// /// public class LinqMatcher : IObjectMatcher, IStringMatcher { private readonly string[] _patterns; /// public MatchBehaviour MatchBehaviour { get; } /// /// Initializes a new instance of the class. /// /// The pattern. public LinqMatcher([NotNull] string pattern) : this(new[] { pattern }) { } /// /// Initializes a new instance of the class. /// /// The patterns. public LinqMatcher([NotNull] string[] patterns) : this(MatchBehaviour.AcceptOnMatch, patterns) { } /// /// Initializes a new instance of the class. /// /// The match behaviour. /// The pattern. public LinqMatcher(MatchBehaviour matchBehaviour, [NotNull] string pattern) : this(matchBehaviour, new[] { pattern }) { } /// /// Initializes a new instance of the class. /// /// The match behaviour. /// The patterns. public LinqMatcher(MatchBehaviour matchBehaviour, [NotNull] string[] patterns) { MatchBehaviour = matchBehaviour; _patterns = patterns; } /// 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))); return MatchBehaviourHelper.Convert(MatchBehaviour, match); } catch { // just ignore exception // TODO add logging? } return MatchBehaviourHelper.Convert(MatchBehaviour, match); } /// public double IsMatch(object input) { double match = MatchScores.Mismatch; JObject value; switch (input) { case JObject valueAsJObject: value = valueAsJObject; break; default: value = JObject.FromObject(input); break; } // Convert a single object to a Queryable JObject-list with 1 entry. var queryable1 = new[] { value }.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. match = MatchScores.ToScore(_patterns.Select(pattern => queryable2.Any(pattern))); return MatchBehaviourHelper.Convert(MatchBehaviour, match); } catch { // just ignore exception // TODO add logging? } return MatchBehaviourHelper.Convert(MatchBehaviour, match); } /// public string[] GetPatterns() { return _patterns; } /// public string Name => "LinqMatcher"; } }