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))
TRON33 B
Offset (hex)Bytes (hex)Meaning
0054 52 4F 4Emagic TRON
041C 78txt "x"
0602 29000000000000 00i64 41
0F0F 0A 04000000 0600 0000map leaf, size 10: @4 → @6

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))
TRON33 B
Offset (hex)Bytes (hex)Meaning
0054 52 4F 4Emagic TRON
041C 78txt "x"
0602 29000000000000 00i64 41
0F0F 0A 04000000 0600 0000map leaf, size 10: @4 → @6

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)
TRON158 B
Offset (hex)Bytes (hex)Meaning
0054 52 4F 4Emagic TRON
043C 6B6579txt "key"
080Ctxt ""
090F 0A 04000000 0800 0000map leaf, size 10: @4 → @8
134C 6B696E64txt "kind"
186C 6E756D626572txt "number"
1F0F 0A 13000000 1800 0000map leaf, size 10: @13 → @18
296C 6E756D626572txt "number"
3002 29000000000000 00i64 41
390F 0A 29000000 3000 0000map leaf, size 10: @29 → @30
436C 706172656E74txt "parent"
4A00nil
4B0F 0A 43000000 4A00 0000map leaf, size 10: @43 → @4A
554C 74657874txt "text"
5A0Ctxt ""
5B0F 0A 55000000 5A00 0000map leaf, size 10: @55 → @5A
657C 626F6F6C65616Etxt "boolean"
6D01bit false
6E0F 0A 65000000 6D00 0000map leaf, size 10: @65 → @6D
7807 1E A1190000 0900 0000 1F000000 3900 0000 4B000000 5B00 0000 6E000000map branch, size 30, depth 0 (root), slots 0, 5, 7, 8, 11, 12: @9 → @1F → @39 → @4B → @5B → @6E

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))
TRON33 B
Offset (hex)Bytes (hex)Meaning
0054 52 4F 4Emagic TRON
041C 78txt "x"
0602 29000000000000 00i64 41
0F0F 0A 04000000 0600 0000map leaf, size 10: @4 → @6

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))
TRON33 B
Offset (hex)Bytes (hex)Meaning
0054 52 4F 4Emagic TRON
041C 78txt "x"
0602 29000000000000 00i64 41
0F0F 0A 04000000 0600 0000map leaf, size 10: @4 → @6

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:

TRON33 B
Offset (hex)Bytes (hex)Meaning
0054 52 4F 4Emagic TRON
041C 78txt "x"
0602 29000000000000 00i64 41
0F0F 0A 04000000 0600 0000map leaf, size 10: @4 → @6
clojure79 B
(let [builder (sd/builder)]
  (sd/close builder)
  (sd/parse input-text :tron))
TRON33 B
Offset (hex)Bytes (hex)Meaning
0054 52 4F 4Emagic TRON
041C 78txt "x"
0602 29000000000000 00i64 41
0F0F 0A 04000000 0600 0000map leaf, size 10: @4 → @6

C exports: stardust_document_builder_release