defmodule UsCongress.BillDtd.Hierarchy do @moduledoc """ Produce a hierarchical map of nodes, called "Measures". A measure can be: - a `String` - a `%{scheme: "", ...}` - a `%{label: "", params: %{}, measure: []}` During parsing, measures are commonly merged alongside preceding ones. The function `UsCongress.BillDtd.Shape.combine/2` helps manage the rules here. """ @behaviour Saxy.Handler alias UsCongress.BillDtd.Shape def handle_event(:start_element, {name, attributes}, prior), do: {:ok, [ %{ label: name, params: attributes |> Map.new, measure: [] } | prior ]} def handle_event(:characters, chars, [%{label: name, measure: measure} = current | prior] ), do: {:ok, [Shape.merge(current, chars) | prior]} def handle_event(:end_element, "header", [ header, %{scheme: "enum"} = enum | prior ] ), do: {:ok, [ Shape.combine(enum, Shape.scheme(header)) | prior]} def handle_event(:end_element, _name, [ %{ measure: [_body]} = current, %{measure: measure } = former | prior] ), do: {:ok, [former |> Shape.combine(Shape.scheme(current)) | prior]} def handle_event(:end_element, _name, [ %{ measure: [_body]} = current, %{measure: measure} = basis | prior] ), do: {:ok, [ Shape.combine(basis, current) | prior ] } def handle_event(_, _, prior), do: {:ok, prior} end