# `IO.ANSI.Table.Header`
[🔗](https://github.com/RaymondLoranger/io_ansi_table/blob/main/lib/io/ansi/table/header.ex#L1)

Finds the align or sort attribute of a header.
Also converts a header into a "heading".

# `align_attr`

```elixir
@type align_attr() :: :left | :center | :right
```

Align atribute

# `align_spec`

```elixir
@type align_spec() :: t() | {align_attr(), t()}
```

Align spec

# `sort_attr`

```elixir
@type sort_attr() :: MapSorter.SortSpec.sort_dir()
```

Sort atribute

# `sort_spec`

```elixir
@type sort_spec() :: MapSorter.SortSpec.t()
```

Sort spec

# `sort_symbol`

```elixir
@type sort_symbol() :: {sort_attr(), String.t()} | {:pos, sym_pos() | [sym_pos()]}
```

Sort symbol

# `sym_pos`

```elixir
@type sym_pos() :: :leading | :trailing
```

Symbol position

# `t`

```elixir
@type t() :: Map.key()
```

Header

# `find_attr`

```elixir
@spec find_attr(t(), [align_spec() | sort_spec()], :left | :asc) ::
  align_attr() | sort_attr() | nil
```

Finds the align or sort attribute of a `header`.

## Examples

    iex> alias IO.ANSI.Table.Header
    iex> sort_specs = ["dept", desc: "hired"]
    iex> {
    ...>   Header.find_attr("dept" , sort_specs, :asc),
    ...>   Header.find_attr("hired", sort_specs, :asc),
    ...>   Header.find_attr("job"  , sort_specs, :asc)
    ...> }
    {:asc, :desc, nil}

    iex> alias IO.ANSI.Table.Header
    iex> sort_specs = ["dept", desc: {"hired", Date}]
    iex> {
    ...>   Header.find_attr("dept" , sort_specs, :asc),
    ...>   Header.find_attr("hired", sort_specs, :asc),
    ...>   Header.find_attr("job"  , sort_specs, :asc)
    ...> }
    {:asc, :desc, nil}

    iex> alias IO.ANSI.Table.Header
    iex> sort_specs = [{"hired", Date}, "job", {:desc, "dept"}]
    iex> {
    ...>   Header.find_attr("dept" , sort_specs, :asc),
    ...>   Header.find_attr("hired", sort_specs, :asc),
    ...>   Header.find_attr("job"  , sort_specs, :asc)
    ...> }
    {:desc, :asc, :asc}

    iex> alias IO.ANSI.Table.Header
    iex> sort_specs = [{"hired", Date}, desc: "dept"]
    iex> {
    ...>   Header.find_attr("dept" , sort_specs, :asc),
    ...>   Header.find_attr("hired", sort_specs, :asc),
    ...>   Header.find_attr("job"  , sort_specs, :asc)
    ...> }
    {:desc, :asc, nil}

    iex> alias IO.ANSI.Table.Header
    iex> align_specs = ["dept", right: "hired"]
    iex> {
    ...>   Header.find_attr("dept" , align_specs, :left),
    ...>   Header.find_attr("hired", align_specs, :left),
    ...>   Header.find_attr("job"  , align_specs, :left)
    ...> }
    {:left, :right, nil}

# `to_heading`

```elixir
@spec to_heading(t(), IO.ANSI.Table.Spec.t()) :: String.t()
```

Converts a `header` into a "heading".

## Examples

    iex> alias IO.ANSI.Table.{Header, Spec}
    iex> spec = Spec.new([:col_4, :col_1, :col_2], sort_specs: [asc: :col_2])
    iex> Header.to_heading(:col_2, spec)
    "Col 2↑"

---

*Consult [api-reference.md](api-reference.md) for complete listing*
