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.

  1. Create a builder.
  2. Add the nodes in preorder.
  3. Seal the builder to create an owned document.

Operations

OperationReturnsSummary
builderbuilderCreate an owned document builder.
addnodebuilder.add(node) appends one node and returns its preorder ID.
add-manynonebuilder.add_many(nodes) appends nodes in order in one native call.
sealdocumentbuilder.seal() transfers the constructed document into an independent owned document.
closenoneRelease the builder handle.

builder

clojure2 B
[]
clojure9 B
[options]

Parameters

ParameterTypeOwnershipDefaultMeaning
optionsmapValue{}Binding options map. The :library key selects the loaded native library. Omission uses the binding's default library.

Errors

StatusWhen
:out-of-memorynative memory is exhausted

Notes

Add nodes in depth-first preorder. An append failure makes the builder unusable.

Examples

builder

clojure176 B
(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))
Result / 16 B
{:value {:x 41}}

C exports: stardust_document_builder_create

add

clojure14 B
[builder node]

Requires exclusive use of the receiver handle.

Parameters

ParameterTypeOwnershipDefaultMeaning
builderBuilderBorrowed for the callRequiredThe builder owner for this operation. Keep it alive during the call.
nodenode-inputValueRequiredThe next node's kind, parent and typed value.

Errors

StatusWhen
:invalid-argumentthe node breaks the preorder rules or has an invalid kind or number
:closedthe builder is closed
:out-of-memorynative 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

clojure176 B
(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))
Result / 16 B
{:value {:x 41}}

Add a typed integer node

clojure156 B
(let [input {:parent nil :kind :number :number 41 :boolean false :key "" :text ""}]
  (with-open [builder (sd/builder)]
    (sd/add builder input))
  input)
Result / 137 B
{:value {:parent  nil
         :kind    "number"
         :boolean false
         :number  41
         :key     ""
         :text    ""}}

C exports: stardust_document_builder_add_many, stardust_document_builder_error

add-many

clojure15 B
[builder nodes]

Requires exclusive use of the receiver handle.

Parameters

ParameterTypeOwnershipDefaultMeaning
builderBuilderBorrowed for the callRequiredThe builder owner for this operation. Keep it alive during the call.
nodesNode_InputsValueRequiredNodes in depth-first preorder to append together.

Errors

StatusWhen
:invalid-argumenta node breaks the preorder rules or has an invalid kind or number
:closedthe builder is closed
:out-of-memorynative memory is exhausted

Examples

builder/add_many

clojure142 B
(with-open [builder (sd/builder)]
  (sd/add-many builder [{:kind :object} {:parent 0 :kind :number :key "x" :number 41}])
  (sd/seal builder))
Result / 16 B
{:value {:x 41}}

C exports: stardust_document_builder_add_many, stardust_document_builder_error

seal

clojure9 B
[builder]

Requires exclusive use of the receiver handle.

Parameters

ParameterTypeOwnershipDefaultMeaning
builderBuilderBorrowed for the callRequiredThe builder owner for this operation. Keep it alive during the call.

Errors

StatusWhen
:invalid-argumentthe builder has no root or a container is still open
:closedthe builder is closed
:out-of-memorynative memory is exhausted

Notes

The builder accepts no more nodes after sealing.

Examples

builder/seal

clojure176 B
(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))
Result / 16 B
{:value {:x 41}}

C exports: stardust_document_builder_seal, stardust_document_builder_error

close

clojure8 B
[handle]

Consumes the receiver handle.

Parameters

ParameterTypeOwnershipDefaultMeaning
handleBuilderConsumed ownerRequiredThe builder owner to release. Do not use it after this call.

Examples

builder/close

input-text holds this document:

edn7 B
{:x 41}
clojure78 B
(let [builder (sd/builder)]
  (sd/close builder)
  (sd/parse input-text :edn))
Result / 16 B
{:value {:x 41}}

C exports: stardust_document_builder_release