Current section
Files
Jump to
Current section
Files
src/tobble@internal@builder.erl
-module(tobble@internal@builder).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([new/0, to_result/1, from_list/1, from_error/1, add_row/2]).
-export_type([builder/0, builder_internals/0, builder_error/0]).
-opaque builder() :: {builder, builder_internals()} |
{failed_builder, builder_error()}.
-type builder_internals() :: {builder_internals, list(list(binary()))}.
-type builder_error() :: {inconsistent_column_count_error, integer(), integer()}.
-file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 25).
-spec new() -> builder().
new() ->
{builder, {builder_internals, []}}.
-file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 38).
-spec to_result(builder()) -> {ok, tobble@internal@rows:rows(binary())} |
{error, builder_error()}.
to_result(Builder) ->
case Builder of
{builder, Internals} ->
_pipe = erlang:element(2, Internals),
_pipe@1 = lists:reverse(_pipe),
_pipe@2 = tobble@internal@rows:from_lists(_pipe@1),
gleam@result:map_error(_pipe@2, fun(Err) -> case Err of
{inconsistent_lengths_error, Expected, Got} ->
{inconsistent_column_count_error, Expected, Got}
end end);
{failed_builder, Error} ->
{error, Error}
end.
-file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 54).
-spec from_list(list(list(binary()))) -> builder().
from_list(Rows) ->
{builder, {builder_internals, lists:reverse(Rows)}}.
-file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 59).
-spec from_error(builder_error()) -> builder().
from_error(Error) ->
{failed_builder, Error}.
-file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 77).
-spec finish_build_step({ok, builder_internals()} | {error, builder_error()}) -> builder().
finish_build_step(Build_result) ->
case Build_result of
{ok, Internals} ->
{builder, Internals};
{error, Error} ->
{failed_builder, Error}
end.
-file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 63).
-spec build_on(
builder(),
fun((builder_internals()) -> {ok, builder_internals()} |
{error, builder_error()})
) -> builder().
build_on(Builder, Build) ->
case Builder of
{builder, Internals} ->
_pipe = Internals,
_pipe@1 = Build(_pipe),
finish_build_step(_pipe@1);
{failed_builder, _} ->
Builder
end.
-file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 98).
-spec last_row_column_count(builder_internals()) -> gleam@option:option(integer()).
last_row_column_count(Internals) ->
_pipe = erlang:element(2, Internals),
_pipe@1 = gleam@list:first(_pipe),
_pipe@2 = gleam@option:from_result(_pipe@1),
gleam@option:map(_pipe@2, fun erlang:length/1).
-file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 84).
-spec validate_column_count(
builder_internals(),
list(binary()),
fun(() -> {ok, builder_internals()} | {error, builder_error()})
) -> {ok, builder_internals()} | {error, builder_error()}.
validate_column_count(Internals, Columns, Then) ->
Num_columns = erlang:length(Columns),
case last_row_column_count(Internals) of
none ->
Then();
{some, Expected} when Expected =:= Num_columns ->
Then();
{some, Expected@1} ->
{error, {inconsistent_column_count_error, Expected@1, Num_columns}}
end.
-file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 29).
-spec add_row(builder(), list(binary())) -> builder().
add_row(Builder, Columns) ->
build_on(
Builder,
fun(Internals) ->
validate_column_count(
Internals,
Columns,
fun() ->
{ok,
{builder_internals,
[Columns | erlang:element(2, Internals)]}}
end
)
end
).