defmodule EctoShorts.SchemaHelpers do
@moduledoc """
Module that has helpers that are globably useful on ecto schemas
"""
@spec schema?(Ecto.Schema.t | any) :: boolean
@doc """
Determine if item passed in is a Ecto Schema
## Example
iex> SchemaHelpers.schema?(create_schema())
true
iex> SchemaHelpers.schema?(%{some_map: 1})
false
iex> SchemaHelpers.schema?([create_schema()])
false
"""
def schema?(%{__meta__: %{schema: _}}), do: true
def schema?(_), do: false
@spec has_schemas?(list(Ecto.Schema.t | any)) :: boolean
@doc """
Determine if any items in list are a schema
## Example
iex> SchemaHelpers.has_schemas?([%{some_map: 1}, create_schema()])
true
iex> SchemaHelpers.has_schemas?([%{some_map: 1}])
false
"""
def has_schemas?(items), do: Enum.any?(items, &schema?/1)
@spec all_schemas?(list(Ecto.Schema.t | any)) :: boolean
@doc """
Determine if all items in list are a schema
## Example
iex> SchemaHelpers.all_schemas([%{some_map: 1}, create_schema()])
false
iex> SchemaHelpers.all_schemas([create_schema(), create_schema()])
true
"""
def all_schemas?(items), do: Enum.all?(items, &schema?/1)
@spec created?(Ecto.Schema.t | any) :: boolean
@doc """
Determine if item has been created or not
## Example
iex> SchemaHelpers.created?(%{id: 2})
true
iex> SchemaHelpers.created?(%{"id" => 2})
true
iex> SchemaHelpers.created?(%{item: 3})
false
"""
def created?(%{id: _}), do: true
def created?(%{"id" => _}), do: true
def created?(_), do: false
@spec all_created?(list(Ecto.Schema.t | any)) :: boolean
@doc """
Determine if all items in list has been created or not
## Example
iex> SchemaHelpers.all_created?([%{id: 2}, %{"id" => 5}])
true
iex> SchemaHelpers.all_created?([%{"id" => 2}, %{item: 3}])
false
"""
def all_created?(items), do: Enum.all?(items, &created?/1)
@spec any_created?(list(Ecto.Schema.t | any)) :: boolean
@doc """
Determine if any items in list has been created or not
## Example
iex> SchemaHelpers.any_created?([%{id: 2}, %{"id" => 5}])
true
iex> SchemaHelpers.any_created?([%{"id" => 2}, %{item: 3}])
true
iex> SchemaHelpers.any_created?([%{test: 3}, %{item: 3}])
false
"""
def any_created?(items), do: Enum.any?(items, &created?/1)
end