func()

in internal/ui/ui.go [119:202]


func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
	if _, ok := msg.(spinner.TickMsg); !ok {
		m.meta.Logger().Log(context.Background(), log.LevelTrace, "UI update", "status", m.status, "msg", fmt.Sprintf("%#v", msg))
	}

	switch msg := msg.(type) {
	case tea.WindowSizeMsg:
		m.winsize = msg
	case tea.KeyMsg:
		switch msg.Type {
		case tea.KeyCtrlC:
			m.status = statusQuitting
			return m, aztfexportclient.Quit(m.ctx, m.meta)
		}
	case spinner.TickMsg:
		var cmd tea.Cmd
		m.spinner, cmd = m.spinner.Update(msg)
		return m, cmd
	case aztfexportclient.NewClientMsg:
		m.meta = msg
		m.status = statusInit
		return m, aztfexportclient.Init(m.ctx, m.meta)
	case aztfexportclient.InitProviderDoneMsg:
		m.status = statusListingResource
		return m, aztfexportclient.ListResource(m.ctx, m.meta)
	case aztfexportclient.ListResourceDoneMsg:
		m.status = statusBuildingImportList
		m.importlist = importlist.NewModel(m.ctx, m.meta, msg.List, 0)
		// Trigger a windows resize cmd to resize the importlist model.
		// Though we can pass the winsize as input variable during model initialization.
		// But this way we only need to maintain the resizing logic at one place (which takes consideration of the title height).
		cmd := func() tea.Msg { return m.winsize }
		return m, cmd
	case aztfexportclient.ShowImportErrorMsg:
		m.status = statusImportErrorMsg
		m.importerrormsg = msg
		return m, nil
	case aztfexportclient.StartImportMsg:
		m.status = statusImporting
		m.progress = progress.NewModel(m.ctx, m.meta, m.parallelism, msg.List)
		return m, tea.Batch(
			m.progress.Init(),
			// Resize the progress bar
			func() tea.Msg { return m.winsize },
		)
	case aztfexportclient.ImportDoneMsg:
		for idx, item := range msg.List {
			if item.ImportError != nil {
				m.status = statusBuildingImportList
				m.importlist = importlist.NewModel(m.ctx, m.meta, msg.List, idx)
				cmd := func() tea.Msg { return m.winsize }
				return m, cmd
			}
		}
		m.status = statusPushState
		return m, aztfexportclient.PushState(m.ctx, m.meta, msg.List)
	case aztfexportclient.PushStateDoneMsg:
		m.status = statusExportResourceMapping
		return m, aztfexportclient.ExportResourceMapping(m.ctx, m.meta, msg.List)
	case aztfexportclient.ExportResourceMappingDoneMsg:
		m.status = statusExportSkippedResources
		return m, aztfexportclient.ExportSkippedResources(m.ctx, m.meta, msg.List)
	case aztfexportclient.ExportSkippedResourcesDoneMsg:
		m.status = statusGeneratingCfg
		return m, aztfexportclient.GenerateCfg(m.ctx, m.meta, msg.List)
	case aztfexportclient.GenerateCfgDoneMsg:
		m.status = statusCleaningUpWorkspaceCfg
		return m, aztfexportclient.CleanUpWorkspace(m.ctx, m.meta)
	case aztfexportclient.WorkspaceCleanupDoneMsg:
		m.status = statusSummary
		return m, nil
	case aztfexportclient.QuitMsg:
		return m, tea.Quit
	case aztfexportclient.CleanTFStateMsg:
		m.meta.CleanTFState(m.ctx, msg.Addr)
		return m, nil
	case aztfexportclient.ErrMsg:
		m.status = statusError
		m.err = msg
		return m, nil
	}

	return updateChildren(msg, m)
}