Exemple #1
0
        public bool Resolve(IParserResult prIn, out IParserResult prOut, IBehaviors context)
        {
            IEnumerable <IRule <IParserResult> > rules =
                _rules.Union(
                    RuleDeriver.Instance.DeriveRules(prIn.CliSpecification))
                .ToList( );

            HelpOption hlpOpt = (HelpOption)prIn.CliSpecification.Options.FirstOrDefault(opt => opt is HelpOption);

            if (hlpOpt != null)
            {
                rules = rules.Select(
                    r => new HelpIsSetOr(hlpOpt, r));
            }

            RuleCheckerBase <IParserResult> rc = new RuleCheckerBase <IParserResult>(rules);

            if (rc.Check(prIn, context) == NonViolation <IParserResult> .Instance)
            {
                prOut = prIn;
                return(true);
            }

            IViolation <IParserResult> violation;

            prOut = (IParserResult)prIn.Clone( );
            while ((violation = rc.Check(prOut, context)) != NonViolation <IParserResult> .Instance)
            {
                _config.Out.WriteLine( );
                _config.Out.WriteLine(prOut);
                _config.Out.WriteLine($"> {violation.Description}");
                if (!violation.HasSolution)
                {
                    _config.Out.WriteLine("> conflict has no solution");
                    prOut = null;
                    return(false);
                }

                switch (Prompt(violation.Solutions, out ISolution <IParserResult> chosenSolution))
                {
                case UserAction.Cancel:
                    prOut = null;
                    return(false);

                case UserAction.AutoSolve:
                    AutoSolve(prOut, out prOut, rules, context);
                    break;

                case UserAction.ApplySolution:
                    ApplySolution(prOut, out prOut, chosenSolution, context);
                    break;
                }
            }

            return(true);
        }
Exemple #2
0
        private static void AutoSolve(
            IParserResult prIn,
            out IParserResult prOut,
            IEnumerable <IRule <IParserResult> > rules,
            IBehaviors context)
        {
            prOut = (IParserResult)prIn.Clone( );
            GenericRuleChecker <IParserResult> grc = new GenericRuleChecker <IParserResult>(rules, prOut, true, context);

            prOut = grc.Subject;
        }
Exemple #3
0
 private static void ApplySolution(
     IParserResult prIn,
     out IParserResult prOut,
     ISolution <IParserResult> chosenSolution,
     IBehaviors context)
 {
     prOut = (IParserResult)prIn.Clone( );
     foreach (IAction <IParserResult> action in chosenSolution.Actions)
     {
         action.Apply(prOut, context);
     }
 }