/// <summary> /// Initializes a new instance of the <see cref="IterationInfoRequest" /> class. /// </summary> /// <param name="chainIdentificationResult">The chain identification result.</param> /// <param name="mutatedArgs">The mutated arguments.</param> /// <param name="originalArgs">The original arguments.</param> public IterationInfoRequest(ChainIdentificationResult chainIdentificationResult, string[] mutatedArgs, string[] originalArgs) { ChainIdentificationResult = chainIdentificationResult.ThrowIfArgumentNull(nameof(chainIdentificationResult)); MutatedArgs = mutatedArgs.ThrowIfArgumentNull(nameof(mutatedArgs)); OriginalArgs = originalArgs.ThrowIfArgumentNull(nameof(originalArgs)); }
/// <summary> /// Initializes a new instance of the <see cref="PotentialConsumerRequest" /> class. /// </summary> /// <param name="chainIdentificationResult">The chain identification result.</param> /// <param name="info">The information.</param> /// <param name="instance">The instance.</param> public PotentialConsumerRequest(ChainIdentificationResult chainIdentificationResult, IterationInfo info, object instance) { ChainIdentificationResult = chainIdentificationResult.ThrowIfArgumentNull(nameof(chainIdentificationResult)); Info = info.ThrowIfArgumentNull(nameof(info)); Instance = instance.ThrowIfArgumentNull(nameof(instance)); }
/// <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()); } }