// Copyright © WireMock.Net using System; using System.Linq; using AnyOfTypes; using DevLab.JmesPath; using Newtonsoft.Json; using Stef.Validation; using WireMock.Extensions; using WireMock.Models; using WireMock.Util; namespace WireMock.Matchers; /// /// http://jmespath.org/ /// public class JmesPathMatcher : IStringMatcher, IObjectMatcher { private readonly AnyOf[] _patterns; /// public object Value { get; } /// public MatchBehaviour MatchBehaviour { get; } /// /// Initializes a new instance of the class. /// /// The patterns. public JmesPathMatcher(params string[] patterns) : this(MatchBehaviour.AcceptOnMatch, MatchOperator.Or, patterns.ToAnyOfPatterns()) { } /// /// Initializes a new instance of the class. /// /// The patterns. public JmesPathMatcher(params AnyOf[] patterns) : this(MatchBehaviour.AcceptOnMatch, MatchOperator.Or, patterns) { } /// /// Initializes a new instance of the class. /// /// The to use. /// The patterns. public JmesPathMatcher(MatchOperator matchOperator = MatchOperator.Or, params AnyOf[] patterns) : this(MatchBehaviour.AcceptOnMatch, matchOperator, patterns) { } /// /// Initializes a new instance of the class. /// /// The match behaviour. /// The to use. /// The patterns. public JmesPathMatcher( MatchBehaviour matchBehaviour, MatchOperator matchOperator = MatchOperator.Or, params AnyOf[] patterns) { _patterns = Guard.NotNull(patterns); MatchBehaviour = matchBehaviour; MatchOperator = matchOperator; Value = patterns; } /// public MatchResult IsMatch(string? input) { var score = MatchScores.Mismatch; Exception? exception = null; if (!string.IsNullOrWhiteSpace(input)) { try { var results = _patterns.Select(pattern => bool.Parse(new JmesPath().Transform(input, pattern.GetPattern()))).ToArray(); score = MatchScores.ToScore(results, MatchOperator); } catch (Exception ex) { exception = ex; } } return new MatchResult(MatchBehaviourHelper.Convert(MatchBehaviour, score), exception); } /// public MatchResult IsMatch(object? input) { var score = MatchScores.Mismatch; // When input is null or byte[], return Mismatch. if (input != null && !(input is byte[])) { var inputAsString = JsonConvert.SerializeObject(input); return IsMatch(inputAsString); } return MatchBehaviourHelper.Convert(MatchBehaviour, score); } /// public AnyOf[] GetPatterns() { return _patterns; } /// public MatchOperator MatchOperator { get; } /// public string Name => nameof(JmesPathMatcher); /// public string GetCSharpCodeArguments() { return $"new {Name}" + $"(" + $"{MatchBehaviour.GetFullyQualifiedEnumValue()}, " + $"{MatchOperator.GetFullyQualifiedEnumValue()}, " + $"{MappingConverterUtils.ToCSharpCodeArguments(_patterns)}" + $")"; } }