func()

in internal/ui/importlist/importlist.go [112:195]


func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
	var cmd tea.Cmd

	switch msg := msg.(type) {
	case tea.KeyMsg:
		// Don't intercept the keys (e.g. "w") when user is inputting.
		if m.isUserTyping() {
			break
		}

		switch {
		case key.Matches(msg, m.listkeys.apply):
			// Leave filter applied state before applying the import list
			if m.list.FilterState() == list.FilterApplied {
				m.list.ResetFilter()
			}

			// In case all items are marked as skip, show a warning and do nothing.
			if m.isNothingToImport() {
				return m, m.list.NewStatusMessage(common.ErrorMsgStyle.Render("All resources are skipped, nothing to import"))
			}

			// Ensure all items pass validation
			if !m.userInputsAreValid() {
				return m, m.list.NewStatusMessage(common.ErrorMsgStyle.Render("One or more user input is invalid"))
			}

			return m, aztfexportclient.StartImport(m.importList(true))
		case key.Matches(msg, m.listkeys.skip):
			sel := m.list.SelectedItem()
			if sel == nil {
				return m, nil
			}
			selItem := sel.(Item)

			if !selItem.v.Skip() {
				selItem.v.TFAddr = tfaddr.TFAddr{}
				selItem.textinput.Model.SetValue("")
			} else {
				selItem.v.TFAddr = selItem.v.TFAddrCache
				selItem.textinput.Model.SetValue(selItem.v.TFAddr.String())
			}

			m.list.SetItem(selItem.idx, selItem)
			return m, nil
		case key.Matches(msg, m.listkeys.error):
			sel := m.list.SelectedItem()
			if sel == nil {
				return m, nil
			}
			selItem := sel.(Item)
			if selItem.v.ImportError == nil {
				return m, nil
			}
			return m, aztfexportclient.ShowImportError(selItem.v, selItem.idx, m.importList(false))
		case key.Matches(msg, m.listkeys.recommendation):
			sel := m.list.SelectedItem()
			if sel == nil {
				return m, nil
			}
			selItem := sel.(Item)

			if len(selItem.v.Recommendations) == 0 {
				return m, m.list.NewStatusMessage(common.InfoStyle.Render("No resource type recommendation is available..."))
			}
			return m, m.list.NewStatusMessage(common.InfoStyle.Render(fmt.Sprintf("Possible resource type(s): %s", strings.Join(selItem.v.Recommendations, ","))))
		case key.Matches(msg, m.listkeys.save):
			m.list.NewStatusMessage(common.InfoStyle.Render("Saving the resouce mapping..."))
			err := m.c.ExportResourceMapping(m.ctx, m.importList(false))
			if err == nil {
				m.list.NewStatusMessage(common.InfoStyle.Render("Resource mapping saved"))
			} else {
				m.list.NewStatusMessage(common.ErrorMsgStyle.Render(err.Error()))
			}
		case key.Matches(msg, m.list.KeyMap.Quit):
			return m, aztfexportclient.Quit(m.ctx, m.c)
		}
	case tea.WindowSizeMsg:
		// The height here minus the height occupied by the title
		m.list.SetSize(msg.Width, msg.Height-3)
	}
	m.list, cmd = m.list.Update(msg)
	return m, cmd
}