Esempio n. 1
0
        /// <summary>
        ///     Identifies the potential consumer.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>PotentialConsumerResult.</returns>
        public PotentialConsumerResult IdentifyPotentialConsumer(PotentialConsumerRequest request)
        {
            var consumptionResultsForTheParsersWhoCanConsume = request.ChainIdentificationResult.Chain
                                                               .Select(x => x.CanConsume(request.Instance, request.Info))
                                                               .Where(x => x.NumConsumed > 0).ToList();

            return(new PotentialConsumerResult(request.ChainIdentificationResult.Chain,
                                               consumptionResultsForTheParsersWhoCanConsume, request.Info));
        }
Esempio n. 2
0
        /// <summary>
        ///     Parses the specified arguments.
        /// </summary>
        /// <param name="args">The arguments.</param>
        /// <returns>The result of the parsing</returns>
        /// <exception cref="NoFactoryFunctionException"></exception>
        /// <exception cref="UnexpectedArgException"></exception>
        public virtual IParseResult Parse(string[] args)
        {
            ChainIdentificationResult chainRes = null;

            try
            {
                chainRes = ChainIdentificationStrategy.Identify(new ChainIdentificationRequest(args, Context));
                var mutatedArgs = ArgsMutator.Mutate(new MutateArgsRequest(args, chainRes.Chain, Context));
                var info        = IterationInfoFactory.Create(new IterationInfoRequest(chainRes, mutatedArgs, args));
                if (chainRes.IdentifiedParser.FactoryFunction == null)
                {
                    throw new NoFactoryFunctionException(chainRes.IdentifiedParser);
                }
                var instance = chainRes.IdentifiedParser.FactoryFunction();
                while (!info.IsComplete())
                {
                    var potentialConsumerRequest = new PotentialConsumerRequest(chainRes, info, instance);
                    var potentialConsumerResult  =
                        PotentialConsumerStrategy.IdentifyPotentialConsumer(potentialConsumerRequest);
                    if (!potentialConsumerResult.Success)
                    {
                        throw new UnexpectedArgException(info);
                    }
                    var selected           = ConsumerSelectionStrategy.Select(potentialConsumerResult);
                    var consumptionRequest = ConsumptionRequestFactory.Create(potentialConsumerResult, selected);
                    var consumptionResult  = selected.ConsumingParameter.Consume(instance, consumptionRequest);
                    if (consumptionResult.ParseExceptions.Any())
                    {
                        return(new ParseResult(new Dictionary <object, Parser>(), consumptionResult.ParseExceptions));
                    }
                    info = consumptionResult.Info;
                }

                return(ParseResultFactory.Create(new Dictionary <object, Parser>
                {
                    [instance] = chainRes.IdentifiedParser
                }, null));
            }
            catch (ParseException e)
            {
                return(new ParseResult(null, e.ToEnumerableOfOne()));
            }
            finally
            {
                chainRes?.Chain.ToList().ForEach(p => p.Reset());
            }
        }