| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 | package initimport (	"fmt"	ti "github.com/charmbracelet/bubbles/textinput"	tea "github.com/charmbracelet/bubbletea"	"github.com/langgenius/dify-plugin-daemon/internal/types/entities/plugin_entities")type profile struct {	cursor int	inputs []ti.Model	warning string}func newProfile() profile {	name := ti.New()	name.Placeholder = "Plugin name, a directory will be created with this name"	name.CharLimit = 128	name.Prompt = "Plugin name (press Enter to next step): "	name.Focus()	author := ti.New()	author.Placeholder = "Author name"	author.CharLimit = 128	author.Prompt = "Author (press Enter to next step): "	return profile{		inputs: []ti.Model{name, author},	}}func (p profile) Name() string {	return p.inputs[0].Value()}func (p profile) Author() string {	return p.inputs[1].Value()}func (p profile) View() string {	s := fmt.Sprintf("Edit profile of the plugin\n%s\n%s\n", p.inputs[0].View(), p.inputs[1].View())	if p.warning != "" {		s += fmt.Sprintf("\033[31m%s\033[0m\n", p.warning)	}	return s}func (p *profile) checkRule() bool {	if p.inputs[p.cursor].Value() == "" {		p.warning = "Name and author cannot be empty"		return false	} else if p.cursor == 0 && !plugin_entities.PluginNameRegex.MatchString(p.inputs[p.cursor].Value()) {		p.warning = "Plugin name must be 1-128 characters long, and can only contain letters, numbers, dashes and underscores"		return false	} else {		p.warning = ""	}	return true}func (p profile) Update(msg tea.Msg) (subMenu, subMenuEvent, tea.Cmd) {	var cmds []tea.Cmd	switch msg := msg.(type) {	case tea.KeyMsg:		switch msg.String() {		case "ctrl+c":			return p, SUB_MENU_EVENT_NONE, tea.Quit		case "down":			// check if empty			if !p.checkRule() {				return p, SUB_MENU_EVENT_NONE, nil			}			// focus next			p.cursor++			if p.cursor >= len(p.inputs) {				p.cursor = 0			}		case "up":			if !p.checkRule() {				return p, SUB_MENU_EVENT_NONE, nil			}			p.cursor--			if p.cursor < 0 {				p.cursor = len(p.inputs) - 1			}		case "enter":			if !p.checkRule() {				return p, SUB_MENU_EVENT_NONE, nil			}			// submit			if p.cursor == len(p.inputs)-1 {				return p, SUB_MENU_EVENT_NEXT, nil			}			// move to next			p.cursor++		}	}	// update cursor	for i := 0; i < len(p.inputs); i++ {		if i == p.cursor {			p.inputs[i].Focus()		} else {			p.inputs[i].Blur()		}	}	// update view	for i := range p.inputs {		var cmd tea.Cmd		p.inputs[i], cmd = p.inputs[i].Update(msg)		if cmd != nil {			cmds = append(cmds, cmd)		}	}	return p, SUB_MENU_EVENT_NONE, tea.Batch(cmds...)}func (p profile) Init() tea.Cmd {	return nil}
 |