# `GeoGenius.Providers.Delimited`
[🔗](https://github.com/agoodway/geo_genius/blob/main/lib/geo_genius/providers/delimited.ex#L1)

Streams a delimited artifact in chunks, reading its first line as the
header row and handing each data line to the provider's own row builder.

Sits directly above `GeoGenius.Providers.Batch`, which turns one chunk's
data lines into staged rows: this is the header-tracking accumulator around
it -- `:pending` until the header line is read, `{:headers, headers}` from
then on -- plus the chunking and the emit call. `GeoGenius.Providers.CSV`
and `GeoGenius.Providers.SimpleMaps` both read that shape of file and differ
only in the parser they choose and in what each builds from a line, so both
supply those two things and share everything else. A third delimited
provider supplies them too rather than copying either.

Whatever `File.stream!/1` and the parser raise is left to propagate: each
provider rescues those around its own call and reports them in the
vocabulary of the format it documents.

# `row_builder`

```elixir
@type row_builder() :: ([String.t()], [String.t()] -&gt;
                    {:ok, GeoGenius.Staging.Row.t()} | {:error, term()})
```

Builds one staged row from the file's header names and one data line's values.

# `stage`

```elixir
@spec stage(
  Path.t(),
  module(),
  pos_integer(),
  ([GeoGenius.Staging.Row.t()] -&gt; :ok),
  row_builder()
) ::
  :ok | {:error, term()}
```

Parses `path` with `parser`, emitting the staged rows of each `chunk_size`
lines in one `emit` call.

Returns the first `{:error, reason}` `row_builder` produces, staging none of
the lines after it, and `:ok` for a file every line of which built a row --
including one carrying nothing but a header.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
