Skip to content

recipe crud

Scaffold a CRUD pattern, model + 5-method service + 3 screens, all wired together.

A multi-step recipe that scaffolds a typical CRUD-shaped resource end to end: a model, a service with five methods, three screens, plus all the routing, DI, and navigation wiring.

Terminal window
swiftspawn recipe crud <Resource> [--in <feature>] [--from <path-or-url>] [--with-tests] [--dry-run] [--force] [--quiet] [--verbose]

recipe crud Movie is roughly equivalent to:

  1. generate model Movie (with --from if provided).
  2. generate service Movie, but with five methods instead of one: fetch, fetchOne, create, update, delete.
  3. generate screen MovieList on Movies --uses MovieService
  4. generate screen MovieDetail on Movies --uses MovieService
  5. generate screen MovieEdit on Movies --uses MovieService

All routes are added, all navigation is wired, and the service is registered in DI.

The feature folder defaults to <Resource>s (so Movie becomes Movies). Override with --in <feature>.

If --from is supplied, the model fields are inferred from the JSON sample. Without it, the model is an empty skeleton you fill in.

This is the fastest way to get from “I have an API and a sample response” to “I have a working SwiftUI app fetching and displaying data.”

Terminal window
swiftspawn recipe crud Movie
swiftspawn recipe crud Movie --in Movies --from sample.json --with-tests
swiftspawn recipe crud Movie --from https://api.example.com/movies/1
Features/Movies/Models/Movie.swift
Services/MovieService.swift
Services/MovieServiceImpl.swift
Services/MockMovieService.swift
Features/Movies/MovieList/MovieListView.swift
Features/Movies/MovieList/MovieListViewModel.swift
Features/Movies/MovieDetail/MovieDetailView.swift
Features/Movies/MovieDetail/MovieDetailViewModel.swift
Features/Movies/MovieEdit/MovieEditView.swift
Features/Movies/MovieEdit/MovieEditViewModel.swift

With --with-tests, the matching *ViewModelTests.swift for each screen.

  • Adds case movieList, case movieDetail, case movieEdit to Route.swift.
  • Wires those cases into RootView.swift.
  • Registers movieService in DIContainer.swift.
FlagDescription
--in <feature>Feature folder to nest screens under. Defaults to <Resource>s.
--from <path-or-url>Path or URL to a JSON sample for the model.
--with-testsAlso generate test files for each screen.
--dry-runPreview without writing.
--forceOverwrite existing files.
CodeMeaning
2Invalid resource name.
5Not in a swiftspawn project.
7Route.swift is missing markers.
9, 10, 11JSON sample issues (file, URL, parse).