コード例 #1
0
 /// <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));
 }
コード例 #2
0
 /// <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));
 }
コード例 #3
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());
            }
        }