Packages
io_ansi_table
0.4.21
1.0.40
1.0.39
1.0.38
1.0.37
1.0.36
1.0.34
1.0.33
1.0.32
1.0.31
1.0.30
1.0.29
1.0.28
1.0.27
1.0.26
1.0.25
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.16
1.0.15
1.0.14
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.4.32
0.4.31
0.4.30
0.4.29
0.4.28
0.4.27
0.4.26
0.4.25
0.4.24
0.4.23
0.4.22
0.4.21
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.29
0.3.28
0.3.27
0.3.26
0.3.25
0.3.24
0.3.23
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Writes data to "stdio" in a table with borders and colors. Can choose a table style to change the look of the table.
Current section
Files
Jump to
Current section
Files
lib/io/ansi/table/spec.ex
defmodule IO.ANSI.Table.Spec do
@moduledoc """
Holds the specification of the table to be formatted.
"""
use PersistConfig
alias IO.ANSI.Table.{Column, Config, Heading, Row}
@type t :: map
@default_header_fixes Application.get_env(@app, :default_header_fixes)
@default_margins Application.get_env(@app, :default_margins)
@default_sort_symbols Application.get_env(@app, :default_sort_symbols)
@options Application.get_env(@app, :options)
@spec new() :: t
def new(), do: init() |> update()
@spec apply(t, Keyword.t()) :: t
def apply(spec, []), do: spec
def apply(spec, options) do
spec = Enum.reduce(options, spec, &validate/2)
options
|> Keyword.keys()
|> Enum.all?(&(&1 in [:bell, :count, :style]))
|> if(do: spec, else: update(spec))
end
@spec deploy(t, [Access.container()]) :: t
def deploy(spec, maps) do
spec
|> Row.rows(maps)
|> Column.column_widths()
end
## Private functions
@spec init() :: t
defp init() do
%{
align_attrs: [],
align_specs: Config.align_specs(),
bell: Config.bell(),
column_widths: [],
count: Config.count(),
headers: Config.headers(),
header_fixes: Config.header_fixes(),
headings: [],
left_margin: "",
margins: Config.margins(),
max_width: Config.max_width(),
rows: [],
sort_attrs: [],
sort_specs: Config.sort_specs(),
sort_symbols: Config.sort_symbols(),
style: Config.style()
}
end
@spec update(t) :: t
defp update(spec) do
spec
|> header_fixes()
|> sort_symbols()
|> margins()
|> Column.align_attrs()
|> Column.sort_attrs()
|> Column.left_margin()
|> Heading.headings()
end
@spec header_fixes(t) :: t
defp header_fixes(spec) do
update_in(spec.header_fixes, &Map.merge(@default_header_fixes, &1))
end
@spec sort_symbols(t) :: t
defp sort_symbols(spec) do
update_in(spec.sort_symbols, &Keyword.merge(@default_sort_symbols, &1))
end
@spec margins(t) :: t
defp margins(spec) do
update_in(spec.margins, &Keyword.merge(@default_margins, &1))
end
@spec validate(tuple, t) :: t
defp validate({key, value}, spec) when key in @options do
%{spec | key => apply(Config, key, [value])}
end
defp validate({_key, _value}, spec), do: spec
end