| 696 | var errSkillsListed = errors.New("skills listed") |
| 697 | |
| 698 | func selectSkillsWithSelector(opts *InstallOptions, skills []discovery.Skill, canPrompt bool, sel skillSelector) ([]discovery.Skill, error) { |
| 699 | checkCollisions := func(ss []discovery.Skill) error { |
| 700 | if err := collisionError(ss); err != nil { |
| 701 | fmt.Fprintf(opts.IO.ErrOut, "Hint: install individually using the full name: gh skill install %s namespace/skill-name\n", sel.sourceHint) |
| 702 | return err |
| 703 | } |
| 704 | return nil |
| 705 | } |
| 706 | |
| 707 | if opts.All { |
| 708 | if err := checkCollisions(skills); err != nil { |
| 709 | return nil, err |
| 710 | } |
| 711 | return skills, nil |
| 712 | } |
| 713 | |
| 714 | if opts.SkillName != "" { |
| 715 | return sel.matchByName(opts, skills) |
| 716 | } |
| 717 | |
| 718 | if !canPrompt { |
| 719 | if err := listAvailableSkills(opts, skills, sel); err != nil { |
| 720 | return nil, err |
| 721 | } |
| 722 | return nil, errSkillsListed |
| 723 | } |
| 724 | |
| 725 | if sel.fetchDescriptions != nil { |
| 726 | sel.fetchDescriptions() |
| 727 | } |
| 728 | |
| 729 | labelWidth := opts.IO.TerminalWidth() - multiSelectLabelMargin |
| 730 | if labelWidth < 1 { |
| 731 | labelWidth = 1 |
| 732 | } |
| 733 | |
| 734 | selected, err := opts.Prompter.MultiSelectWithSearch( |
| 735 | "Select skill(s) to install:", |
| 736 | "Filter skills", |
| 737 | nil, |
| 738 | []string{allSkillsKey}, |
| 739 | skillSearchFunc(skills, labelWidth), |
| 740 | ) |
| 741 | if err != nil { |
| 742 | return nil, err |
| 743 | } |
| 744 | |
| 745 | if len(selected) == 0 { |
| 746 | return nil, fmt.Errorf("must select at least one skill") |
| 747 | } |
| 748 | |
| 749 | for _, s := range selected { |
| 750 | if s == allSkillsKey { |
| 751 | if err := checkCollisions(skills); err != nil { |
| 752 | return nil, err |
| 753 | } |
| 754 | return skills, nil |
| 755 | } |