private IEnumerable <Match> MatchSingleValue(JValue input, JValue pattern) { switch (pattern.Type) { case JTokenType.String: var patternValue = pattern.Value <string>(); if (PlaceholderHelper.IsPlaceholder(patternValue, out var placeholder)) { return(MatchCollectionHelper.CreateWithSingleGroup(new CapturingGroup { Key = placeholder, Value = (input as JValue).GetPrimitiveAsObject(), Path = input.Path })); } else { return(string.Equals(input.Value <string>(), PlaceholderHelper.Unescape(patternValue), this.stringComparison) ? MatchCollectionHelper.CreateWithEmptyMatch() : null); } case JTokenType.Integer: return(input.Value <long>() == pattern.Value <long>() ? MatchCollectionHelper.CreateWithEmptyMatch() : null); case JTokenType.Boolean: return(input.Value <bool>() == pattern.Value <bool>() ? MatchCollectionHelper.CreateWithEmptyMatch() : null); default: throw new NotSupportedJTokenTypeException(pattern); } }
private IEnumerable <Match> MatchSingleLevel(JToken input, JToken pattern) { if (pattern is JValue) { return(this.MatchSingleValue(input as JValue, pattern as JValue)); } if (pattern is JArray) { var patternArray = pattern as JArray; if (input is JArray) { if (patternArray.Count == 1) { return(this.MatchArraySinglePattern(input as JArray, patternArray.Single())); } else { throw new NotSupportedArrayToArrayMatchException(input, pattern); } } else { return(this.MatchArraySingleInput(input, patternArray)); } } if (pattern is JObject) { var matches = MatchCollectionHelper.CreateWithEmptyMatch(); foreach (var propertyPattern in pattern.Children <JProperty>()) { if (input.Type == JTokenType.Null) { return(null); } var childInput = input[propertyPattern.Name]; if (childInput == null) { return(null); } var subMatches = this.MatchSingleLevel(childInput, propertyPattern.Value); if (subMatches == null) { return(null); } matches = matches.Multiply(subMatches); } return(matches); } throw new NotSupportedJTokenTypeException(pattern); }