Current section

Files

Jump to
hl7v2 lib hl7v2 type fn.ex
Raw

lib/hl7v2/type/fn.ex

defmodule HL7v2.Type.FN do
@moduledoc """
Family Name (FN) -- HL7v2 sub-component composite type.
Used as component 1 of XPN (Extended Person Name). Contains 5
sub-components delimited by `&` when embedded in a composite field.
Sub-components:
1. Surname (ST) -- required
2. Own Surname Prefix (ST)
3. Own Surname (ST)
4. Surname Prefix From Partner/Spouse (ST)
5. Surname From Partner/Spouse (ST)
"""
@behaviour HL7v2.Type
alias HL7v2.Type
defstruct [
:surname,
:own_surname_prefix,
:own_surname,
:surname_prefix_from_partner,
:surname_from_partner
]
@type t :: %__MODULE__{
surname: binary() | nil,
own_surname_prefix: binary() | nil,
own_surname: binary() | nil,
surname_prefix_from_partner: binary() | nil,
surname_from_partner: binary() | nil
}
@doc """
Parses a family name from a list of sub-components.
## Examples
iex> HL7v2.Type.FN.parse(["Smith"])
%HL7v2.Type.FN{surname: "Smith"}
iex> HL7v2.Type.FN.parse(["Smith", "Van"])
%HL7v2.Type.FN{surname: "Smith", own_surname_prefix: "Van"}
iex> HL7v2.Type.FN.parse([])
%HL7v2.Type.FN{}
"""
@spec parse(list()) :: t()
def parse(components) when is_list(components) do
%__MODULE__{
surname: Type.get_component(components, 0),
own_surname_prefix: Type.get_component(components, 1),
own_surname: Type.get_component(components, 2),
surname_prefix_from_partner: Type.get_component(components, 3),
surname_from_partner: Type.get_component(components, 4)
}
end
@doc """
Encodes a family name to a list of sub-component strings.
## Examples
iex> HL7v2.Type.FN.encode(%HL7v2.Type.FN{surname: "Smith"})
["Smith"]
iex> HL7v2.Type.FN.encode(%HL7v2.Type.FN{surname: "Smith", own_surname_prefix: "Van"})
["Smith", "Van"]
iex> HL7v2.Type.FN.encode(nil)
[]
"""
@spec encode(t() | nil) :: list()
def encode(nil), do: []
def encode(%__MODULE__{} = fn_type) do
[
fn_type.surname || "",
fn_type.own_surname_prefix || "",
fn_type.own_surname || "",
fn_type.surname_prefix_from_partner || "",
fn_type.surname_from_partner || ""
]
|> Type.trim_trailing()
end
end