/// <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)); }
/// <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()); } }