Rework completion interfaces

- Use same interface type in a generic interactive completions
  in a method level and option value level.
- Change CompletionResolver to have same function signature
  as with options and use CompletionContext to keep
  relevant information.
- Fixes #449
This commit is contained in:
Janne Valkealahti
2022-07-06 09:02:06 +01:00
parent 2520e0681f
commit 32f77c1917
9 changed files with 57 additions and 47 deletions

View File

@@ -23,7 +23,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@@ -37,7 +36,6 @@ import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.messaging.handler.invocation.InvocableHandlerMethod;
import org.springframework.shell.Availability;
import org.springframework.shell.CompletionContext;
import org.springframework.shell.CompletionProposal;
import org.springframework.shell.MethodTargetRegistrar;
import org.springframework.shell.Utils;
@@ -45,6 +43,7 @@ import org.springframework.shell.command.CommandCatalog;
import org.springframework.shell.command.CommandRegistration;
import org.springframework.shell.command.CommandRegistration.Builder;
import org.springframework.shell.command.CommandRegistration.OptionSpec;
import org.springframework.shell.completion.CompletionResolver;
import org.springframework.shell.standard.ShellOption.NoValueProvider;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
@@ -149,12 +148,12 @@ public class StandardMethodTargetRegistrar implements MethodTargetRegistrar, App
optionSpec.required();
}
if (!ClassUtils.isAssignable(NoValueProvider.class, so.valueProvider())) {
Function<CompletionContext, List<CompletionProposal>> completionFunction = ctx -> {
CompletionResolver completionResolver = ctx -> {
ValueProvider valueProviderBean = this.applicationContext.getBean(so.valueProvider());
List<CompletionProposal> complete = valueProviderBean.complete(ctx);
return complete;
};
optionSpec.completion(completionFunction);
optionSpec.completion(completionResolver);
}
}
}