// Copyright © WireMock.Net using Stef.Validation; using WireMock.Extensions; using WireMock.Matchers.Request; namespace WireMock.Matchers; /// /// The MatchResult which contains the score (value between 0.0 - 1.0 of the similarity) and an optional error message. /// public class MatchResult { /// /// A value between 0.0 - 1.0 of the similarity. /// public double Score { get; set; } /// /// The exception message) in case the matching fails. /// [Optional] /// public Exception? Exception { get; set; } /// /// The name or description of the matcher. /// public required string Name { get; set; } /// /// The child MatchResults in case of multiple matchers. /// public MatchResult[]? MatchResults { get; set; } /// /// Is the value a perfect match? /// public bool IsPerfect() => MatchScores.IsPerfect(Score); /// /// Create a MatchResult. /// /// The name or description of the matcher. /// The match behaviour. /// Is this a match? /// The exception in case the matching fails. [Optional] public static MatchResult From(string name, MatchBehaviour matchBehaviour, bool isMatch, Exception? exception = null) { return From(name, MatchBehaviourHelper.Convert(matchBehaviour, MatchScores.ToScore(isMatch)), exception); } /// /// Create a MatchResult. /// /// The name or description of the matcher. /// A value between 0.0 - 1.0 of the similarity. /// The exception in case the matching fails. [Optional] public static MatchResult From(string name, double score = 0, Exception? exception = null) { return new MatchResult { Name = name, Score = score, Exception = exception }; } /// /// Create a MatchResult from exception. /// /// The name or description of the matcher. /// The exception in case the matching fails. /// MatchResult public static MatchResult From(string name, Exception exception) { return From(name, MatchScores.Mismatch, exception); } /// /// Create a MatchResult from multiple MatchResults. /// /// The name or description of the matcher. /// A list of MatchResults. /// The MatchOperator /// MatchResult public static MatchResult From(string name, IReadOnlyList matchResults, MatchOperator matchOperator) { Guard.NotNullOrEmpty(matchResults); if (matchResults.Count == 1) { return matchResults[0]; } return new MatchResult { Name = name, MatchResults = matchResults.ToArray(), Score = MatchScores.ToScore(matchResults.Select(r => r.Score).ToArray(), matchOperator), Exception = matchResults.Select(m => m.Exception).OfType().ToArray().ToException() }; } /// /// Expand to Tuple /// /// Tuple : Score and Exception public (double Score, Exception? Exception) Expand() { return (Score, Exception); } /// /// Convert to . /// public MatchDetail ToMatchDetail() { return new MatchDetail { Name = Name, MatcherType = typeof(MatchResult).Name, Score = Score, Exception = Exception, MatchDetails = MatchResults?.Select(mr => mr.ToMatchDetail()).ToArray() }; } }