-module(db@schema). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([create_table/1, get_part_table/2, add_string_column/3, add_int_column/2, add_bool_column/2, add_serial_column/2, add_foreign_key_column/4, generate_create_table_sql/1, generate_drop_table_sql/1]). -export_type([column/0, table/0]). -type column() :: {string_column, binary(), integer()} | {int_column, binary()} | {bool_column, binary()} | {foreign_key_column, binary(), binary(), binary(), binary()} | {serial_column, binary()}. -type table() :: {table, binary(), list(column())}. -file("/Users/ashercohen/Desktop/ASHERSOPRO/funsies/src/db/schema.gleam", 27). -spec create_table(binary()) -> table(). create_table(Name) -> {table, Name, []}. -file("/Users/ashercohen/Desktop/ASHERSOPRO/funsies/src/db/schema.gleam", 38). -spec check_if_column(table(), binary()) -> {ok, column()} | {error, nil}. check_if_column(Table, Column_name) -> _pipe = erlang:element(3, Table), gleam@list:find(_pipe, fun(Column) -> case Column of {string_column, Name, _} -> Name =:= Column_name; {int_column, Name@1} -> Name@1 =:= Column_name; {bool_column, Name@2} -> Name@2 =:= Column_name; {foreign_key_column, Name@3, _, _, _} -> Name@3 =:= Column_name; {serial_column, Name@4} -> Name@4 =:= Column_name end end). -file("/Users/ashercohen/Desktop/ASHERSOPRO/funsies/src/db/schema.gleam", 31). -spec get_part_table(table(), list(binary())) -> table(). get_part_table(Table, Columns) -> Filtered_columns = begin _pipe = Columns, gleam@list:filter_map( _pipe, fun(Column_name) -> check_if_column(Table, Column_name) end ) end, {table, erlang:element(2, Table), Filtered_columns}. -file("/Users/ashercohen/Desktop/ASHERSOPRO/funsies/src/db/schema.gleam", 51). -spec add_string_column(table(), binary(), integer()) -> table(). add_string_column(Table, Name, Size) -> {table, erlang:element(2, Table), lists:append(erlang:element(3, Table), [{string_column, Name, Size}])}. -file("/Users/ashercohen/Desktop/ASHERSOPRO/funsies/src/db/schema.gleam", 55). -spec add_int_column(table(), binary()) -> table(). add_int_column(Table, Name) -> {table, erlang:element(2, Table), lists:append(erlang:element(3, Table), [{int_column, Name}])}. -file("/Users/ashercohen/Desktop/ASHERSOPRO/funsies/src/db/schema.gleam", 59). -spec add_bool_column(table(), binary()) -> table(). add_bool_column(Table, Name) -> {table, erlang:element(2, Table), lists:append(erlang:element(3, Table), [{bool_column, Name}])}. -file("/Users/ashercohen/Desktop/ASHERSOPRO/funsies/src/db/schema.gleam", 93). -spec add_serial_column(table(), binary()) -> table(). add_serial_column(Table, Name) -> {table, erlang:element(2, Table), lists:append(erlang:element(3, Table), [{serial_column, Name}])}. -file("/Users/ashercohen/Desktop/ASHERSOPRO/funsies/src/db/schema.gleam", 97). -spec sql_type(column()) -> binary(). sql_type(Column) -> case Column of {string_column, _, Size} -> <<<<"VARCHAR("/utf8, (gleam@int:to_string(Size))/binary>>/binary, ")"/utf8>>; {int_column, _} -> <<"INT"/utf8>>; {bool_column, _} -> <<"BOOLEAN"/utf8>>; {foreign_key_column, _, _, _, _} -> <<"INT"/utf8>>; {serial_column, _} -> <<"SERIAL"/utf8>> end. -file("/Users/ashercohen/Desktop/ASHERSOPRO/funsies/src/db/schema.gleam", 63). -spec add_foreign_key_column(table(), binary(), table(), binary()) -> table(). add_foreign_key_column(Table, Name, References_table, References_column) -> Column_referenced = case gleam@list:find( erlang:element(3, References_table), fun(A) -> erlang:element(2, A) =:= References_column end ) of {ok, C} -> C; {error, _} -> _assert_subject = gleam@list:first( erlang:element(3, References_table) ), {ok, Value} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, value => _assert_fail, module => <<"db/schema"/utf8>>, function => <<"add_foreign_key_column"/utf8>>, line => 76}) end, Value end, {table, erlang:element(2, Table), lists:append( erlang:element(3, Table), [{foreign_key_column, Name, erlang:element(2, References_table), References_column, gleam@string:capitalise(sql_type(Column_referenced))}] )}. -file("/Users/ashercohen/Desktop/ASHERSOPRO/funsies/src/db/schema.gleam", 108). -spec generate_create_table_sql(table()) -> binary(). generate_create_table_sql(Table) -> Columns_sql = begin _pipe = erlang:element(3, Table), _pipe@1 = gleam@list:map( _pipe, fun(Column) -> Column_type = sql_type(Column), case Column of {string_column, Name, _} -> <<<>/binary, Column_type/binary>>; {int_column, Name@1} -> <<<>/binary, Column_type/binary>>; {bool_column, Name@2} -> <<<>/binary, Column_type/binary>>; {foreign_key_column, Name@3, Ref_table, Ref_column, _} -> <<<<<<<<<<<<<>/binary, Column_type/binary>>/binary, " REFERENCES "/utf8>>/binary, Ref_table/binary>>/binary, "("/utf8>>/binary, Ref_column/binary>>/binary, ")"/utf8>>; {serial_column, Name@4} -> <<<>/binary, Column_type/binary>> end end ), gleam@string:join(_pipe@1, <<", "/utf8>>) end, <<<<<<<<"CREATE TABLE "/utf8, (erlang:element(2, Table))/binary>>/binary, " ("/utf8>>/binary, Columns_sql/binary>>/binary, ");"/utf8>>. -file("/Users/ashercohen/Desktop/ASHERSOPRO/funsies/src/db/schema.gleam", 134). -spec generate_drop_table_sql(table()) -> binary(). generate_drop_table_sql(Table) -> <<<<"DROP TABLE "/utf8, (erlang:element(2, Table))/binary>>/binary, ";"/utf8>>.