Packages
io_ansi_table
0.3.7
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.
# """
@moduledoc false
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, options) do
spec = options |> Enum.reduce(spec, &validate/2)
if skip_update?(options), do: spec, else: update(spec)
end
@spec deploy(Spec.t, [Access.container]) :: Spec.t
def deploy(spec, maps) do
spec
|> Row.rows(maps)
|> Column.column_widths()
end
## Private functions
@spec skip_update?(Keyword.t) :: boolean
defp skip_update?(options) do
options |> Keyword.keys() |> Enum.all?(& &1 in [:bell, :count, :style])
end
@spec init() :: t
defp init() do
%{
align_specs: Config.align_specs(),
bell: Config.bell(),
count: Config.count(),
headers: Config.headers(),
header_fixes: Config.header_fixes(),
margins: Config.margins(),
max_width: Config.max_width(),
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
header_fixes = Map.merge(@default_header_fixes, spec.header_fixes)
Map.put(spec, :header_fixes, header_fixes)
end
@spec sort_symbols(t) :: t
defp sort_symbols(spec) do
sort_symbols = Keyword.merge(@default_sort_symbols, spec.sort_symbols)
Map.put(spec, :sort_symbols, sort_symbols)
end
@spec margins(t) :: t
defp margins(spec) do
margins = Keyword.merge(@default_margins, spec.margins)
Map.put(spec, :margins, margins)
end
@spec validate(tuple, Spec.t) :: Spec.t
defp validate({key, value}, spec) when key in @options do
Map.put(spec, key, apply(Config, key, [value]))
end
defp validate({_key, _value}, spec), do: spec
end