Building documents
These operations construct a document one node at a time. For most operations, parse a document in your selected format. Use these operations only when you cannot parse the document from text.
- Create a builder.
- Add the nodes in preorder.
- Seal the builder to create an owned document.
Operations
| Operation | Returns | Summary |
|---|---|---|
| builder | builder | Create an owned document builder. |
| Builder.add | node | builder.add(node) appends one node and returns its preorder ID. |
| Builder.add_many | none | builder.add_many(nodes) appends nodes in order in one native call. |
| Builder.seal | document | builder.seal() transfers the constructed document into an independent owned document. |
| Builder.close | none | Release the builder handle. |
builder
def builder(*, library: str | None = None) -> BuilderParameters
| Parameter | Type | Ownership | Default | Meaning |
|---|---|---|---|---|
library | str | None | Value | None | Loaded native library used by this call. |
Errors
| Status | When |
|---|---|
"out_of_memory" | native memory is exhausted |
Notes
Add nodes in depth-first preorder. An append failure makes the builder unusable.
Examples
builder
async with (await stardust.builder()) as builder:
object_node = (await builder.add(stardust.NodeInput(kind="object")))
(await builder.add(stardust.NodeInput(parent=object_node, kind="number", key="x", number=41)))
result = (await builder.seal()){:value {:x 41}}C exports: stardust_document_builder_create
Builder.add
def add(self, node: NodeInput) -> intRequires exclusive use of the receiver handle.
Parameters
| Parameter | Type | Ownership | Default | Meaning |
|---|---|---|---|---|
self | Builder | Borrowed for the call | Required | The builder owner for this operation. Keep it alive during the call. |
node | NodeInput | Value | Required | The next node's kind, parent and typed value. |
Errors
| Status | When |
|---|---|
"invalid_argument" | the node breaks the preorder rules or has an invalid kind or number |
"closed" | the builder is closed |
"out_of_memory" | native memory is exhausted |
Notes
The root has no parent. Each later parent must be an open container or one of its ancestors.
Examples
builder/add
async with (await stardust.builder()) as builder:
object_node = (await builder.add(stardust.NodeInput(kind="object")))
(await builder.add(stardust.NodeInput(parent=object_node, kind="number", key="x", number=41)))
result = (await builder.seal()){:value {:x 41}}Add a typed integer node
input = stardust.NodeInput(kind="number", number=41)
async with (await stardust.builder()) as builder:
(await builder.add(input))
result = input{:value {:parent nil
:kind "number"
:boolean false
:number 41
:key ""
:text ""}}C exports: stardust_document_builder_add_many, stardust_document_builder_error
Builder.add_many
def add_many(self, nodes) -> NoneRequires exclusive use of the receiver handle.
Parameters
| Parameter | Type | Ownership | Default | Meaning |
|---|---|---|---|---|
self | Builder | Borrowed for the call | Required | The builder owner for this operation. Keep it alive during the call. |
nodes | Node_Inputs | Value | Required | Nodes in depth-first preorder to append together. |
Errors
| Status | When |
|---|---|
"invalid_argument" | a node breaks the preorder rules or has an invalid kind or number |
"closed" | the builder is closed |
"out_of_memory" | native memory is exhausted |
Examples
builder/add_many
async with (await stardust.builder()) as builder:
(await builder.add_many([
stardust.NodeInput(kind="object"),
stardust.NodeInput(parent=0, kind="number", key="x", number=41),
]))
result = (await builder.seal()){:value {:x 41}}C exports: stardust_document_builder_add_many, stardust_document_builder_error
Builder.seal
def seal(self) -> DocumentRequires exclusive use of the receiver handle.
Parameters
| Parameter | Type | Ownership | Default | Meaning |
|---|---|---|---|---|
self | Builder | Borrowed for the call | Required | The builder owner for this operation. Keep it alive during the call. |
Errors
| Status | When |
|---|---|
"invalid_argument" | the builder has no root or a container is still open |
"closed" | the builder is closed |
"out_of_memory" | native memory is exhausted |
Notes
The builder accepts no more nodes after sealing.
Examples
builder/seal
async with (await stardust.builder()) as builder:
object_node = (await builder.add(stardust.NodeInput(kind="object")))
(await builder.add(stardust.NodeInput(parent=object_node, kind="number", key="x", number=41)))
result = (await builder.seal()){:value {:x 41}}C exports: stardust_document_builder_seal, stardust_document_builder_error
Builder.close
def close(self) -> NoneConsumes the receiver handle.
Parameters
| Parameter | Type | Ownership | Default | Meaning |
|---|---|---|---|---|
self | Builder | Consumed owner | Required | The builder owner to release. Do not use it after this call. |
Examples
builder/close
input_text holds this document:
{:x 41}builder = (await stardust.builder())
(await builder.close())
result = (await stardust.parse(input_text, "edn")){:value {:x 41}}C exports: stardust_document_builder_release