Structured document representation with hierarchical node tree.
A flat array of nodes with index-based parent/child references forming a tree. Root-level nodes have no parent. Nodes are stored in document/reading order.
Fields
:nodes- List of DocumentNode structs in reading order
Examples
iex> structure = %Kreuzberg.DocumentStructure{
...> nodes: [
...> %Kreuzberg.DocumentNode{
...> id: "node-1",
...> node_type: "paragraph",
...> content: %{"text" => "Hello world"},
...> page_number: 1
...> }
...> ]
...> }
iex> structure.nodes
[%Kreuzberg.DocumentNode{...}]
Summary
Functions
Get child nodes of a specific parent node.
Get total number of nodes in structure.
Check if document structure is empty.
Creates a DocumentStructure struct from a map.
Get a node by index (0-based).
Get all nodes of a specific type.
Get all root-level nodes (nodes with no parent).
Converts a DocumentStructure struct to a map.
Types
@type t() :: %Kreuzberg.DocumentStructure{nodes: [Kreuzberg.DocumentNode.t()]}
Functions
@spec children(t(), non_neg_integer()) :: [Kreuzberg.DocumentNode.t()]
Get child nodes of a specific parent node.
Parameters
structure- ADocumentStructurestructparent_index- The index of the parent node
Returns
A list of child nodes.
Examples
iex> structure = %Kreuzberg.DocumentStructure{
...> nodes: [
...> %Kreuzberg.DocumentNode{id: "node-1", children: [1, 2]},
...> %Kreuzberg.DocumentNode{id: "node-2", parent: 0},
...> %Kreuzberg.DocumentNode{id: "node-3", parent: 0}
...> ]
...> }
iex> children = Kreuzberg.DocumentStructure.children(structure, 0)
iex> length(children)
2
@spec count(t()) :: non_neg_integer()
Get total number of nodes in structure.
Parameters
structure- ADocumentStructurestruct
Returns
The count of nodes as an integer.
Examples
iex> structure = %Kreuzberg.DocumentStructure{nodes: [%Kreuzberg.DocumentNode{}]}
iex> Kreuzberg.DocumentStructure.count(structure)
1
Check if document structure is empty.
Parameters
structure- ADocumentStructurestruct
Returns
Boolean indicating whether the structure has no nodes.
Examples
iex> structure = %Kreuzberg.DocumentStructure{nodes: []}
iex> Kreuzberg.DocumentStructure.empty?(structure)
true
Creates a DocumentStructure struct from a map.
Converts a plain map (typically from NIF/Rust) into a proper struct, handling nested node data.
Parameters
data- A map containing document structure fields
Returns
A DocumentStructure struct with properly typed fields.
Examples
iex> structure_map = %{
...> "nodes" => [
...> %{
...> "id" => "node-1",
...> "node_type" => "paragraph",
...> "content" => %{"text" => "Hello"}
...> }
...> ]
...> }
iex> structure = Kreuzberg.DocumentStructure.from_map(structure_map)
iex> length(structure.nodes)
1
@spec get_node(t(), non_neg_integer()) :: Kreuzberg.DocumentNode.t() | nil
Get a node by index (0-based).
Parameters
structure- ADocumentStructurestructindex- Zero-based index of the node to retrieve
Returns
The node at that index, or nil if out of bounds.
Examples
iex> structure = %Kreuzberg.DocumentStructure{
...> nodes: [%Kreuzberg.DocumentNode{id: "node-1"}]
...> }
iex> Kreuzberg.DocumentStructure.get_node(structure, 0)
%Kreuzberg.DocumentNode{id: "node-1", ...}
@spec nodes_by_type(t(), String.t() | atom()) :: [Kreuzberg.DocumentNode.t()]
Get all nodes of a specific type.
Parameters
structure- ADocumentStructurestructnode_type- The node type to filter by (string or atom)
Returns
A list of nodes matching the given type.
Examples
iex> structure = %Kreuzberg.DocumentStructure{
...> nodes: [
...> %Kreuzberg.DocumentNode{node_type: "paragraph"},
...> %Kreuzberg.DocumentNode{node_type: "heading"},
...> %Kreuzberg.DocumentNode{node_type: "paragraph"}
...> ]
...> }
iex> paragraphs = Kreuzberg.DocumentStructure.nodes_by_type(structure, "paragraph")
iex> length(paragraphs)
2
@spec root_nodes(t()) :: [Kreuzberg.DocumentNode.t()]
Get all root-level nodes (nodes with no parent).
Parameters
structure- ADocumentStructurestruct
Returns
A list of root-level nodes.
Examples
iex> structure = %Kreuzberg.DocumentStructure{
...> nodes: [
...> %Kreuzberg.DocumentNode{id: "node-1", parent: nil},
...> %Kreuzberg.DocumentNode{id: "node-2", parent: 0}
...> ]
...> }
iex> roots = Kreuzberg.DocumentStructure.root_nodes(structure)
iex> length(roots)
1
Converts a DocumentStructure struct to a map.
Useful for serialization and passing to external systems.
Parameters
structure- ADocumentStructurestruct
Returns
A map with string keys representing all fields.
Examples
iex> structure = %Kreuzberg.DocumentStructure{nodes: []}
iex> Kreuzberg.DocumentStructure.to_map(structure)
%{"nodes" => []}