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
pub fn builder() -> Result<Builder>Errors
| Status | When |
|---|---|
Status::OUT_OF_MEMORY | native memory is exhausted |
Notes
Add nodes in depth-first preorder. An append failure makes the builder unusable.
Examples
builder
let mut builder = stardust::builder()?;
let object = builder.add(NodeInput { kind: Kind::OBJECT, ..Default::default() })?;
builder.add(NodeInput {
parent: Some(object), kind: Kind::NUMBER, key: "x", number: Number::I64(41),
..Default::default()
})?;
let result = builder.seal()?;{:value {:x 41}}C exports: stardust_document_builder_create
Builder::add
pub fn add(&mut self, node: NodeInput<'_>) -> Result<NodeId>Requires exclusive use of the receiver handle.
Parameters
| Parameter | Type | Ownership | Default | Meaning |
|---|---|---|---|---|
self | &mut Self | 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
Close consumes this owner. Rust ownership prevents later access. Thus, the safe API does not report closed for this receiver.
| Status | When |
|---|---|
Status::INVALID_ARGUMENT | the node breaks the preorder rules or has an invalid kind or number |
Status::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
let mut builder = stardust::builder()?;
let object = builder.add(NodeInput { kind: Kind::OBJECT, ..Default::default() })?;
builder.add(NodeInput {
parent: Some(object), kind: Kind::NUMBER, key: "x", number: Number::I64(41),
..Default::default()
})?;
let result = builder.seal()?;{:value {:x 41}}Add a typed integer node
let input = stardust::NodeInput { kind: Kind::NUMBER, number: Number::I64(41), ..Default::default() };
let mut builder = stardust::builder()?;
builder.add(input)?;
let 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
pub fn add_many(&mut self, nodes: &[NodeInput<'_>]) -> Result<()>Requires exclusive use of the receiver handle.
Parameters
| Parameter | Type | Ownership | Default | Meaning |
|---|---|---|---|---|
self | &mut Self | Borrowed for the call | Required | The builder owner for this operation. Keep it alive during the call. |
nodes | &[NodeInput<'_>] | Value | Required | Nodes in depth-first preorder to append together. |
Errors
Close consumes this owner. Rust ownership prevents later access. Thus, the safe API does not report closed for this receiver.
| Status | When |
|---|---|
Status::INVALID_ARGUMENT | a node breaks the preorder rules or has an invalid kind or number |
Status::OUT_OF_MEMORY | native memory is exhausted |
Examples
builder/add_many
let mut builder = stardust::builder()?;
builder.add_many(&[
NodeInput { kind: Kind::OBJECT, ..Default::default() },
NodeInput { parent: Some(0), kind: Kind::NUMBER, key: "x", number: Number::I64(41), ..Default::default() },
])?;
let result = builder.seal()?;{:value {:x 41}}C exports: stardust_document_builder_add_many, stardust_document_builder_error
Builder::seal
pub fn seal(self) -> Result<Document>Requires exclusive use of the receiver handle.
Parameters
| Parameter | Type | Ownership | Default | Meaning |
|---|---|---|---|---|
self | Self | Borrowed for the call | Required | The builder owner for this operation. Keep it alive during the call. |
Errors
Close consumes this owner. Rust ownership prevents later access. Thus, the safe API does not report closed for this receiver.
| Status | When |
|---|---|
Status::INVALID_ARGUMENT | the builder has no root or a container is still open |
Status::OUT_OF_MEMORY | native memory is exhausted |
Notes
The builder accepts no more nodes after sealing.
Examples
builder/seal
let mut builder = stardust::builder()?;
let object = builder.add(NodeInput { kind: Kind::OBJECT, ..Default::default() })?;
builder.add(NodeInput {
parent: Some(object), kind: Kind::NUMBER, key: "x", number: Number::I64(41),
..Default::default()
})?;
let result = builder.seal()?;{:value {:x 41}}C exports: stardust_document_builder_seal, stardust_document_builder_error
Builder::close
pub fn close(self)Consumes the receiver handle.
Parameters
| Parameter | Type | Ownership | Default | Meaning |
|---|---|---|---|---|
self | Self | Consumed owner | Required | The builder owner to release. Do not use it after this call. |
Errors
Close consumes this owner. Rust ownership prevents later access. Thus, the safe API does not report closed for this receiver.
Examples
builder/close
input_text holds this document:
{:x 41}let builder = stardust::builder()?;
builder.close();
let result = stardust::parse(input_text, Format::EDN)?;{:value {:x 41}}C exports: stardust_document_builder_release