public CoconaCompletionCandidatesMetadata GetMetadata(CommandOptionDescriptor option)
        {
            var attr = option.ParameterAttributes.OfType <CompletionCandidatesAttribute>().SingleOrDefault();

            if (attr == null)
            {
                if (option.OptionType.IsEnum)
                {
                    return(new CoconaCompletionCandidatesMetadata(
                               CompletionCandidateType.Provider,
                               typeof(EnumCompletionCandidatesProvider),
                               option
                               ));
                }

                return(new CoconaCompletionCandidatesMetadata(
                           CompletionCandidateType.Default,
                           typeof(StaticCompletionCandidatesProvider),
                           option
                           ));
            }
            else
            {
                return(new CoconaCompletionCandidatesMetadata(
                           attr.CandidateType,
                           attr.CandidatesProviderType,
                           option
                           ));
            }
        }
예제 #2
0
        public void Option_EnumValues()
        {
            var option = new CommandOptionDescriptor(
                typeof(TestEnum),
                "test",
                Array.Empty <char>(),
                "",
                CoconaDefaultValue.None,
                string.Empty,
                CommandOptionFlags.None,
                new Attribute[] { }
                );
            var metadata = new CoconaCompletionCandidatesMetadata(
                CompletionCandidateType.Provider,
                typeof(EnumCompletionCandidatesProvider),
                option
                );

            var provider   = new EnumCompletionCandidatesProvider();
            var candidates = provider.GetCandidates(metadata);

            candidates.ResultType.Should().Be(CompletionCandidateResultType.Keywords);
            candidates.Values.Should().HaveCount(2);
            candidates.Values[0].Value.Should().Be("Alice");
            candidates.Values[0].Description.Should().Be(string.Empty);
            candidates.Values[1].Value.Should().Be("Karen");
            candidates.Values[1].Description.Should().Be(string.Empty);
        }
예제 #3
0
        public void OnTheFly()
        {
            var serviceProvider = new ServiceCollection().BuildServiceProvider();
            var activator       = new CoconaInstanceActivator();

            var option = new CommandOptionDescriptor(
                typeof(int),
                "test",
                Array.Empty <char>(),
                "",
                CoconaDefaultValue.None,
                string.Empty,
                CommandOptionFlags.None,
                new Attribute[] { }
                );
            var factory  = new CoconaCompletionCandidatesProviderFactory(serviceProvider, activator);
            var metadata = new CoconaCompletionCandidatesMetadata(
                CompletionCandidateType.Provider,
                typeof(TestOnTheFlyProvider),
                option
                );
            var provider = factory.CreateOnTheFlyProvider(metadata);

            provider.Should().BeOfType <TestOnTheFlyProvider>();
        }
예제 #4
0
 public CoconaCompletionCandidatesMetadata(
     CompletionCandidateType candidateType,
     Type candidatesProviderType,
     CommandOptionDescriptor commandOption
     )
 {
     CandidateType          = candidateType;
     CandidatesProviderType = candidatesProviderType;
     ParameterType          = commandOption.OptionType;
     ParameterAttributes    = commandOption.ParameterAttributes;
     CommandOption          = commandOption;
     CommandArgument        = null;
 }
예제 #5
0
 private string BuildParameterLabel(CommandOptionDescriptor option)
 {
     return((option.ShortName.Any() ? string.Join(", ", option.ShortName.Select(x => $"-{x}")) + ", " : "") +
            $"--{option.Name}" +
            (
                option.OptionType == typeof(bool)
                 ? option.DefaultValue.HasValue && option.DefaultValue.Value != null && option.DefaultValue.Value.Equals(true)
                     ? "=<true|false>"
                     : ""
                 : option.IsEnumerableLike
                     ? $" <{option.ValueName}>..."
                     : $" <{option.ValueName}>"
            ));
 }
예제 #6
0
        public void GetMetadata_Option_Enum()
        {
            var factory = new CoconaCompletionCandidatesMetadataFactory();
            var option  = new CommandOptionDescriptor(
                typeof(TestEnum),
                "test",
                Array.Empty <char>(),
                "",
                CoconaDefaultValue.None,
                string.Empty,
                CommandOptionFlags.None,
                new Attribute[] { }
                );

            var metadata = factory.GetMetadata(option);

            metadata.CandidateType.Should().Be(CompletionCandidateType.Provider);
            metadata.CandidatesProviderType.Should().Be <EnumCompletionCandidatesProvider>();
        }
예제 #7
0
        public void ResolveOverload_Ambiguous()
        {
            var matcher        = new CoconaCommandMatcher();
            var commandOption0 = new CommandOptionDescriptor(typeof(bool), "foo", new[] { 'm' }, string.Empty, CoconaDefaultValue.None, null, CommandOptionFlags.None, Array.Empty <Attribute>());
            var commandOption1 = new CommandOptionDescriptor(typeof(bool), "bar", new[] { 'm' }, string.Empty, CoconaDefaultValue.None, null, CommandOptionFlags.None, Array.Empty <Attribute>());
            var command        = CreateCommand(
                "A",
                new ICommandParameterDescriptor[]
            {
                commandOption0, commandOption1
            },
                new CommandOverloadDescriptor[]
            {
                new CommandOverloadDescriptor(commandOption0, null, CreateCommand("A2", Array.Empty <ICommandParameterDescriptor>()), StringComparer.OrdinalIgnoreCase),
                new CommandOverloadDescriptor(commandOption0, null, CreateCommand("A3", Array.Empty <ICommandParameterDescriptor>()), StringComparer.OrdinalIgnoreCase),
            });
            var parsedCommandLine = new ParsedCommandLine(new CommandOption[] { new CommandOption(commandOption0, "true") }, new CommandArgument[] { }, new string[] { });

            Assert.Throws <CoconaException>(() => matcher.ResolveOverload(command, parsedCommandLine));
        }
예제 #8
0
        public void ResolveOverload_Overload_1()
        {
            var matcher       = new CoconaCommandMatcher();
            var commandOption = new CommandOptionDescriptor(typeof(string), "mode", new[] { 'm' }, string.Empty, CoconaDefaultValue.None, null, CommandOptionFlags.None, Array.Empty <Attribute>());
            var command       = CreateCommand(
                "A",
                new ICommandParameterDescriptor[]
            {
                commandOption
            },
                new CommandOverloadDescriptor[]
            {
                new CommandOverloadDescriptor(commandOption, "foo", CreateCommand("A2", Array.Empty <ICommandParameterDescriptor>()), StringComparer.OrdinalIgnoreCase),
                new CommandOverloadDescriptor(commandOption, "bar", CreateCommand("A3", Array.Empty <ICommandParameterDescriptor>()), StringComparer.OrdinalIgnoreCase),
            });
            var parsedCommandLine = new ParsedCommandLine(new CommandOption[] { }, new CommandArgument[] { }, new string[] { });
            var resolved          = matcher.ResolveOverload(command, parsedCommandLine);

            resolved.Should().NotBeNull();
            resolved.Name.Should().Be("A");
        }
예제 #9
0
        public void Option_Default()
        {
            var option = new CommandOptionDescriptor(
                typeof(int),
                "test",
                Array.Empty <char>(),
                "",
                CoconaDefaultValue.None,
                string.Empty,
                CommandOptionFlags.None,
                new Attribute[] { }
                );
            var metadata = new CoconaCompletionCandidatesMetadata(
                CompletionCandidateType.Provider,
                typeof(StaticCompletionCandidatesProvider),
                option
                );
            var provider   = new EnumCompletionCandidatesProvider();
            var candidates = provider.GetCandidates(metadata);

            candidates.ResultType.Should().Be(CompletionCandidateResultType.Default);
        }
예제 #10
0
 public StaticCompletionCandidates GetStaticCandidatesFromOption(CommandOptionDescriptor option)
 {
     return(new StaticCompletionCandidates(CompletionCandidateResult.Default));
 }
예제 #11
0
 public StaticCompletionCandidates GetStaticCandidatesFromOption(CommandOptionDescriptor option)
 {
     return(GetStaticCandidatesCore(_completionCandidatesMetadataFactory.GetMetadata(option)));
 }
예제 #12
0
 private string GetArgumentValues(CommandOptionDescriptor option)
 {
     return(GetArgumentValuesCore(_completionCandidates.GetStaticCandidatesFromOption(option), option.Name));
 }