trySkipTemplate handles the template step, which depends on async-loaded data.
()
| 290 | |
| 291 | // trySkipTemplate handles the template step, which depends on async-loaded data. |
| 292 | func (m *createModel) trySkipTemplate() tea.Cmd { |
| 293 | if m.presets == nil || m.presets.Template == nil { |
| 294 | m.initStep() |
| 295 | return nil |
| 296 | } |
| 297 | |
| 298 | if !m.templatesLoaded || !m.snapshotsLoaded { |
| 299 | // Data not loaded yet — show spinner, re-attempt when data arrives |
| 300 | return nil |
| 301 | } |
| 302 | |
| 303 | raw := *m.presets.Template |
| 304 | |
| 305 | // Check templates by key or display name |
| 306 | for _, t := range m.templates { |
| 307 | if t.Key == raw || strings.EqualFold(t.Template.DisplayName, raw) { |
| 308 | m.config.Template = t.Key |
| 309 | m.selectedSnapshot = nil |
| 310 | m.skippedSteps[stepTemplate] = true |
| 311 | if m.presets.DiskSizeGB == nil { |
| 312 | m.config.DiskSizeGB = m.defaultDiskSizeGB() |
| 313 | } |
| 314 | m.step++ |
| 315 | return m.trySkipCurrentStep() // continue the skip chain |
| 316 | } |
| 317 | } |
| 318 | |
| 319 | // Check snapshots by name |
| 320 | for i, s := range m.snapshots { |
| 321 | if s.Name == raw { |
| 322 | m.config.Template = s.Name |
| 323 | m.selectedSnapshot = &m.snapshots[i] |
| 324 | m.skippedSteps[stepTemplate] = true |
| 325 | if m.presets.DiskSizeGB == nil { |
| 326 | m.config.DiskSizeGB = m.defaultDiskSizeGB() |
| 327 | } |
| 328 | m.step++ |
| 329 | return m.trySkipCurrentStep() |
| 330 | } |
| 331 | } |
| 332 | |
| 333 | // Not found — user picks manually |
| 334 | m.initStep() |
| 335 | return nil |
| 336 | } |
| 337 | |
| 338 | // initStep sets up step-specific state (cursor, focus, sub-phases) when arriving at a visible step. |
| 339 | func (m *createModel) initStep() { |
no test coverage detected