Exemplo n.º 1
0
        public IReadOnlyCollection <ValidationResult> Validate(Token token, ITokenCollection tokenCollection)
        {
            var value = tokenCollection.Peek();

            if (value is null)
            {
                var error = new ParserError($"{token.Name} value is supposed to be string or array.", token.Line, token.Column);
                return(new[] { ValidationResult.Error(error) });
            }
            if (value.Name == TokenName.StartArray)
            {
                var result = _stringArrayWithUniqueValuesValidator.Validate(token, tokenCollection, _arrayFilterers);
                return(new[] { result });
            }
            else if (value.Name == TokenName.String)
            {
                value = tokenCollection.TakeToken();
                if (!_typeElementSpecification.IsSatisfied(value))
                {
                    var error = new ParserError($"{token.Name} had invalid value.", token.Line, token.Column);
                    return(new[] { ValidationResult.Error(error) });
                }
            }
            else
            {
                var error = new ParserError("Inalid type value.", token.Line, token.Column);
                return(new[] { ValidationResult.Error(error) });
            }
            return(new[] { ValidationResult.Success() });
        }
Exemplo n.º 2
0
        public IReadOnlyCollection <ValidationResult> Validate(Token token, ITokenCollection tokenCollection)
        {
            var valueToken = tokenCollection.TakeToken();

            if (valueToken is null || valueToken.Name != TokenName.String || !valueToken.Value.Any() || Fragment.Empty.Value == valueToken.Value)
            {
                var parserError = new ParserError("Id value is supposed to be string and cannot be empty", valueToken.Line, valueToken.Column);
                return(new[] { ValidationResult.Error(parserError) });
            }
            return(new[] { ValidationResult.Success() });
        }
        public IReadOnlyCollection <ValidationResult> Validate(Token token, ITokenCollection tokenCollection)
        {
            var value = tokenCollection.TakeToken();

            if (value is null || value.Name != TokenName.String)
            {
                var error = new ParserError("Value is supposed to be string.", value.Line, value.Column);
                return(new[] { ValidationResult.Error(error) });
            }
            return(new[] { ValidationResult.Success() });
        }
        public IReadOnlyCollection <ValidationResult> Validate(Token token, ITokenCollection tokenCollection)
        {
            var value = tokenCollection.TakeToken();

            if (value is null || value.Name != TokenName.Number)
            {
                var error = new ParserError("Should be number.", token.Line, token.Column);
                return(new[] { ValidationResult.Error(error) });
            }

            return(new[] { ValidationResult.Success() });
        }
Exemplo n.º 5
0
        public IReadOnlyCollection <Token> GetElementTokens(ITokenCollection tokenCollection)
        {
            var   result = new List <Token>();
            Token possibleTokenToAdd, possibleTerminatorToken;

            do
            {
                possibleTokenToAdd      = tokenCollection.TakeToken();
                possibleTerminatorToken = tokenCollection.TakeToken();
                if (possibleTerminatorToken is null || possibleTokenToAdd is null)
                {
                    throw new ArrayEndMissingException();
                }
                if (possibleTokenToAdd.Name != TokenName.Comma)
                {
                    result.Add(possibleTokenToAdd);
                }
                if (possibleTerminatorToken.Name != TokenName.Comma && possibleTerminatorToken.Name != TokenName.EndArray)
                {
                    throw new ArrayElementSeparatorException();
                }
            } while (possibleTerminatorToken.Name != TokenName.EndArray);
            return(result);
        }
Exemplo n.º 6
0
        public ValidationResult Validate(Token token, ITokenCollection tokenCollection, IEnumerable <IArrayFilterer> filterers)
        {
            var startArrayToken = tokenCollection.TakeToken();

            if (startArrayToken.Name != TokenName.StartArray)
            {
                return(Error(token, $"{token.Name} value is supposed to be an array."));
            }

            IReadOnlyCollection <Token> elementTokens;

            try
            {
                elementTokens = _elementExtractor.GetElementTokens(tokenCollection);
            }
            catch (ArrayEndMissingException e)
            {
                return(Error(token, e.Message));
            }

            foreach (var filterer in filterers)
            {
                try
                {
                    var result = filterer.GetInvalidTokens(elementTokens);
                    if (result.Any())
                    {
                        return(Error(token, filterer.Message));
                    }
                }
                catch (Exception e)
                {
                    return(Error(token, e.Message));
                }
            }

            return(ValidationResult.Success());
        }
Exemplo n.º 7
0
        public IReadOnlyCollection <ValidationResult> Validate(Token token, ITokenCollection tokenCollection)
        {
            var errors           = new List <ValidationResult>();
            var startObjectToken = tokenCollection.TakeToken();

            if (startObjectToken?.Name != TokenName.StartObject)
            {
                return new[] { Error("Object is supposed to start with '{'.", startObjectToken) }
            }
            ;

            var fieldToken = tokenCollection.TakeToken();

            while (fieldToken.Name != TokenName.EndObject)
            {
                var colonToken = tokenCollection.TakeToken();

                if (fieldToken is null)
                {
                    errors.Add(Error($"{token.Name} does not have closing curly bracket.", token));
                    return(errors);
                }

                if (colonToken is null || colonToken.Name != TokenName.Colon)
                {
                    return(new[] { Error("Object field is supposed have colon after identifier", colonToken) });
                }

                if (fieldToken.Name != TokenName.String && !_keywords.Contains(fieldToken.Name))
                {
                    return(new[] { Error("Inorrect token. It is supposed to be string", token) });
                }

                var valueToken = tokenCollection.Peek();
                if (_keywords.Contains(fieldToken.Name) && _tokenHandlerFactory.GetTokenValidator(fieldToken) != null)
                {
                    var validator = _tokenHandlerFactory.GetTokenValidator(fieldToken);
                    var result    = validator.Validate(valueToken, tokenCollection);
                    errors.AddRange(result);
                }
                else if (valueToken.Name == TokenName.StartArray)
                {
                    var result = _arrayValidator.Validate(valueToken, tokenCollection, Enumerable.Empty <IArrayFilterer>());
                    errors.Add(result);
                }
                else if (valueToken.Name == TokenName.StartObject)
                {
                    var result = Validate(valueToken, tokenCollection);
                    errors.AddRange(result);
                }
                else
                {
                    var validator = _tokenHandlerFactory.GetTokenValidator(valueToken);
                    var result    = validator.Validate(valueToken, tokenCollection);
                    errors.AddRange(result);
                }

                var terminationToken = tokenCollection.Peek();
                if (terminationToken is null || (terminationToken.Name != TokenName.Comma && terminationToken.Name != TokenName.EndObject))
                {
                    errors.Add(Error($"Expected comma or end of object.", valueToken));
                    return(errors);
                }
                if (terminationToken.Name == TokenName.Comma)
                {
                    tokenCollection.TakeToken();
                }
                fieldToken = tokenCollection.TakeToken();
            }
            return(errors);
        }