Current section

Files

Jump to
hl7v2 lib hl7v2 segment obx.ex
Raw

lib/hl7v2/segment/obx.ex

defmodule HL7v2.Segment.OBX do
@moduledoc """
Observation/Result (OBX) segment -- HL7v2 v2.5.1.
Carries a single observation value. OBX-5 type varies based on OBX-2 (Value Type).
19 fields per HL7 v2.5.1 specification.
After base parsing, OBX-5 (observation_value) is re-parsed through
`HL7v2.Segment.OBXValue` using the data type declared in OBX-2 (value_type).
Unsupported value types are preserved as raw values. See `HL7v2.Segment.OBXValue`
for the full list of supported OBX-2 codes.
"""
use HL7v2.Segment,
id: "OBX",
fields: [
{1, :set_id, HL7v2.Type.SI, :o, 1},
{2, :value_type, HL7v2.Type.ID, :c, 1},
{3, :observation_identifier, HL7v2.Type.CE, :r, 1},
{4, :observation_sub_id, HL7v2.Type.ST, :c, 1},
{5, :observation_value, :raw, :c, :unbounded},
{6, :units, HL7v2.Type.CE, :o, 1},
{7, :references_range, HL7v2.Type.ST, :o, 1},
{8, :abnormal_flags, HL7v2.Type.IS, :o, :unbounded},
{9, :probability, HL7v2.Type.NM, :o, 1},
{10, :nature_of_abnormal_test, HL7v2.Type.ID, :o, :unbounded},
{11, :observation_result_status, HL7v2.Type.ID, :r, 1},
{12, :effective_date_of_reference_range, HL7v2.Type.TS, :o, 1},
{13, :user_defined_access_checks, HL7v2.Type.ST, :o, 1},
{14, :date_time_of_the_observation, HL7v2.Type.TS, :o, 1},
{15, :producers_id, HL7v2.Type.CE, :o, 1},
{16, :responsible_observer, HL7v2.Type.XCN, :o, :unbounded},
{17, :observation_method, HL7v2.Type.CE, :o, :unbounded},
{18, :equipment_instance_identifier, HL7v2.Type.EI, :o, :unbounded},
{19, :date_time_of_the_analysis, HL7v2.Type.TS, :o, 1}
]
alias HL7v2.Segment.OBXValue
@impl HL7v2.Segment
@spec parse(list(), HL7v2.Separator.t()) :: t()
def parse(raw_fields, separators \\ HL7v2.Separator.default()) do
obx = HL7v2.Segment.do_parse(__MODULE__, @segment_fields, raw_fields, separators)
case obx.value_type do
nil ->
obx
vt ->
parsed = OBXValue.parse(obx.observation_value, vt)
%{obx | observation_value: parsed}
end
end
@impl HL7v2.Segment
@spec encode(t()) :: list()
def encode(%__MODULE__{} = obx) do
# Convert typed observation_value back to raw before base encode
raw_obx =
case obx.value_type do
nil ->
obx
vt ->
raw_value = OBXValue.encode(obx.observation_value, vt)
%{obx | observation_value: raw_value}
end
HL7v2.Segment.do_encode(raw_obx, @segment_fields)
end
end