posexional v0.5.4 Posexional.Row

this module represent a row in a positional file

Link to this section Summary

Functions

merge fields from another row

finds a field in the row by its name

calculate the row total length based on the passed fields

Given a row and a field name calculate the field offset

read a positional file row and convert it back to a keyword list of values

outputs a row

Link to this section Functions

Link to this function

add_field(row, field)

add_field(
  %Posexional.Row{
    fields: term(),
    name: term(),
    row_guesser: term(),
    separator: term()
  },
  struct()
) :: %Posexional.Row{
  fields: term(),
  name: term(),
  row_guesser: term(),
  separator: term()
}
Link to this function

add_fields(row, fields)

add_fields(
  %Posexional.Row{
    fields: term(),
    name: term(),
    row_guesser: term(),
    separator: term()
  },
  []
) :: %Posexional.Row{
  fields: term(),
  name: term(),
  row_guesser: term(),
  separator: term()
}
Link to this function

fields_from(to, row)

fields_from(
  %Posexional.Row{
    fields: term(),
    name: term(),
    row_guesser: term(),
    separator: term()
  },
  %Posexional.Row{
    fields: term(),
    name: term(),
    row_guesser: term(),
    separator: term()
  }
) :: %Posexional.Row{
  fields: term(),
  name: term(),
  row_guesser: term(),
  separator: term()
}

merge fields from another row

Link to this function

find_field(row, name)

find_field(
  %Posexional.Row{
    fields: term(),
    name: term(),
    row_guesser: term(),
    separator: term()
  },
  atom()
) :: %Posexional.Field.Value{
  alignment: term(),
  default: term(),
  filler: term(),
  name: term(),
  size: term()
}

finds a field in the row by its name

Examples

iex> Posexional.Row.new(:row_test, []) |> Posexional.Row.find_field(:test)
nil

iex> Posexional.Row.new(:row_test, [Posexional.Field.Value.new(:test, 5)]) |> Posexional.Row.find_field(:test)
Posexional.Field.Value.new(:test, 5)

iex> Posexional.Row.new(:row_test, [Posexional.Field.Value.new(:test, 5), Posexional.Field.Value.new(:test2, 5)])
...>   |> Posexional.Row.find_field(:test2)
Posexional.Field.Value.new(:test2, 5)
Link to this function

length(row)

length(%Posexional.Row{
  fields: term(),
  name: term(),
  row_guesser: term(),
  separator: term()
}) :: integer()

calculate the row total length based on the passed fields

Examples

iex> Posexional.Row.new(:row_test, [])
...>   |> Posexional.Row.length
0

iex> Posexional.Row.new(:row_test, [Posexional.Field.Value.new(:test1, 10), Posexional.Field.Value.new(:test2, 20)])
...>   |> Posexional.Row.length
30
Link to this function

manage_counters(row, counters)

manage_counters(
  %Posexional.Row{
    fields: term(),
    name: term(),
    row_guesser: term(),
    separator: term()
  },
  [{atom(), pid()}]
) :: %Posexional.Row{
  fields: term(),
  name: term(),
  row_guesser: term(),
  separator: term()
}
Link to this function

new(name, fields, opts \\ [])

new(atom(), [], Keyword.t()) :: %Posexional.Row{
  fields: term(),
  name: term(),
  row_guesser: term(),
  separator: term()
}
Link to this function

offset(row, field_name)

offset(
  %Posexional.Row{
    fields: term(),
    name: term(),
    row_guesser: term(),
    separator: term()
  },
  atom()
) :: integer()

Given a row and a field name calculate the field offset

Examples

iex> Posexional.Row.new(:test, [Posexional.Field.Value.new(:test1, 10), Posexional.Field.Value.new(:test2, 20)])
...>     |> Posexional.Row.offset(:test1)
1

iex> Posexional.Row.new(:test, [Posexional.Field.Value.new(:test1, 10), Posexional.Field.Value.new(:test2, 20)])
...>    |> Posexional.Row.offset(:test2)
11

iex> Posexional.Row.new(:test, [Posexional.Field.Value.new(:test1, 10), Posexional.Field.Value.new(:test2, 20)])
...>     |> Posexional.Row.offset(:test_not_existent)
** (ArgumentError) the field test_not_existent doesn't exists

iex> Posexional.Row.new(:test, [])
...>     |> Posexional.Row.offset(:test)
nil
Link to this function

read(row, content)

read(
  %Posexional.Row{
    fields: term(),
    name: term(),
    row_guesser: term(),
    separator: term()
  },
  binary()
) :: Keyword.t()

read a positional file row and convert it back to a keyword list of values

Link to this function

write(row, values)

write(
  %Posexional.Row{
    fields: term(),
    name: term(),
    row_guesser: term(),
    separator: term()
  },
  Keyword.t()
) :: {atom(), binary()}

outputs a row

Examples

iex> Posexional.Row.new(:row_test, []) |> Posexional.Row.write([test: "test"])
{:ok, ""}

iex> Posexional.Row.new(:row_test, [Posexional.Field.Value.new(:test1, 5), Posexional.Field.Value.new(:test2, 10)])
...>   |> Posexional.Row.write([test1: "test1", test2: "test2"])
{:ok, "test1test2     "}

iex> Posexional.Row.new(:row_test, [Posexional.Field.Value.new(:test1, 5), Posexional.Field.Value.new(:test2, 10)])
...>   |> Posexional.Row.write([test1: "test1", non_existent: "test2"])
{:ok, "test1          "}

iex> Posexional.Row.new(:row_test, [Posexional.Field.Value.new(:test1, 6)])
...>   |> Posexional.Row.write([test1: "test1", not_configured: "test2"])
{:ok, "test1 "}

iex> Posexional.Row.new(:row_test, [Posexional.Field.Value.new(:test1, 5)])
...>   |> Posexional.Row.write([not_configured: "test2", another: "test3"])
{:ok, "     "}

iex> Posexional.Row.new(:row_test, [Posexional.Field.Empty.new(5)])
...>   |> Posexional.Row.write([])
{:ok, "     "}