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