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. |
| add | node | builder.add(node) appends one node and returns its preorder ID. |
| add-many | none | builder.add_many(nodes) appends nodes in order in one native call. |
| seal | document | builder.seal() transfers the constructed document into an independent owned document. |
| close | none | Release the builder handle. |
builder
[][options]Parameters
| Parameter | Type | Ownership | Default | Meaning |
|---|---|---|---|---|
options | map | Value | {} | Binding options map. The :library key selects the loaded native library. Omission uses the binding's default library. |
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
(with-open [builder (sd/builder)]
(let [object (sd/add builder {:kind :object})]
(sd/add builder {:parent object :kind :number :key "x" :number 41}))
(sd/seal builder)){
"x": 41
}C exports: stardust_document_builder_create
add
[builder node]Requires exclusive use of the receiver handle.
Parameters
| Parameter | Type | Ownership | Default | Meaning |
|---|---|---|---|---|
builder | Builder | Borrowed for the call | Required | The builder owner for this operation. Keep it alive during the call. |
node | node-input | 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
(with-open [builder (sd/builder)]
(let [object (sd/add builder {:kind :object})]
(sd/add builder {:parent object :kind :number :key "x" :number 41}))
(sd/seal builder)){
"x": 41
}Add a typed integer node
(let [input {:parent nil :kind :number :number 41 :boolean false :key "" :text ""}]
(with-open [builder (sd/builder)]
(sd/add builder input))
input){
"parent": null,
"kind": "number",
"boolean": false,
"number": 41,
"key": "",
"text": ""
}C exports: stardust_document_builder_add_many, stardust_document_builder_error
add-many
[builder nodes]Requires exclusive use of the receiver handle.
Parameters
| Parameter | Type | Ownership | Default | Meaning |
|---|---|---|---|---|
builder | 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
(with-open [builder (sd/builder)]
(sd/add-many builder [{:kind :object} {:parent 0 :kind :number :key "x" :number 41}])
(sd/seal builder)){
"x": 41
}C exports: stardust_document_builder_add_many, stardust_document_builder_error
seal
[builder]Requires exclusive use of the receiver handle.
Parameters
| Parameter | Type | Ownership | Default | Meaning |
|---|---|---|---|---|
builder | 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
(with-open [builder (sd/builder)]
(let [object (sd/add builder {:kind :object})]
(sd/add builder {:parent object :kind :number :key "x" :number 41}))
(sd/seal builder)){
"x": 41
}C exports: stardust_document_builder_seal, stardust_document_builder_error
close
[handle]Consumes the receiver handle.
Parameters
| Parameter | Type | Ownership | Default | Meaning |
|---|---|---|---|---|
handle | 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
}
(let [builder (sd/builder)]
(sd/close builder)
(sd/parse input-text :json)){
"x": 41
}C exports: stardust_document_builder_release