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
FromValuedocumentfrom_value(value) copies host values into an owned document.
NewBuilderbuilderCreate an owned document builder.
Builder.Addnodebuilder.add(node) appends one node and returns its preorder ID.
Builder.AddManynonebuilder.add_many(nodes) appends nodes in order in one native call.
Builder.Sealdocumentbuilder.seal() transfers the constructed document into an independent owned document.
Builder.ClosenoneRelease the builder handle.

FromValue

from_value(value) copies host values into an owned document.

  • Numbers use i64 or finite f64.
  • Host maps cannot preserve duplicate keys.
  • Use documents to preserve the full structure.
go44B
func FromValue(value any) (*Document, error)
  • Concurrency: Other calls can overlap this call, except the release of a handle that this call uses.
  • Ownership: The caller owns the returned handle and releases it.

Parameters

ParameterTypeOwnershipDefaultMeaning
valueanyValueRequiredA host value to copy into native document nodes.

Errors

StatusWhen
StatusInvalidArgumentthe value has a host type with no document form, a number outside i64 or finite f64, or a cycle
StatusOutOfMemorynative memory is exhausted

Examples

Copy a host integer into a native document

go95B
result, err := stardust.FromValue(int64(41))
if err != nil {
	return err
}
defer result.Close()
Result / 2B
41

C exports: stardust_document_builder_create, stardust_document_builder_add_many, stardust_document_builder_seal, stardust_document_builder_error, stardust_document_builder_release

NewBuilder

Create an owned document builder.

builder() creates an owned builder.

  • Add nodes in depth-first preorder, seal the document, and close the builder.
  • Native append failure makes the builder unusable.
go35B
func NewBuilder() (*Builder, error)
  • Concurrency: Other calls can overlap this call, except the release of a handle that this call uses.
  • Ownership: The caller owns the returned handle and releases it.

Errors

StatusWhen
StatusOutOfMemorynative memory is exhausted

Examples

builder

go464B
builder, err := stardust.NewBuilder()
if err != nil {
	return err
}
defer builder.Close()

object, err := builder.Add(stardust.NodeInput{
	Parent: stardust.NoNode,
	Kind:   stardust.Object,
})
if err != nil {
	return err
}
if _, err := builder.Add(stardust.NodeInput{
	Parent: object,
	Kind:   stardust.Number,
	Key:    "x",
	Number: stardust.I64(41),
}); err != nil {
	return err
}

result, err := builder.Seal()
if err != nil {
	return err
}
defer result.Close()
Result / 6B
{x 41}

C exports: stardust_document_builder_create

Builder.Add

builder.add(node) appends one node and returns its preorder ID.

  • A node specifies parent, kind, key, text, boolean and a typed i64 or f64 number.
  • The root has no parent.
  • Later parents must be open containers or their ancestors.
go49B
func (b *Builder) Add(node NodeInput) (ID, error)
  • Concurrency: This call requires exclusive use of the receiver handle.

Parameters

ParameterTypeOwnershipDefaultMeaning
nodeNodeInputValueRequiredThe next node's kind, parent and typed value.

Errors

StatusWhen
StatusInvalidArgumentthe node breaks the preorder rules or has an invalid kind or number
StatusClosedthe builder is closed
StatusOutOfMemorynative memory is exhausted

Examples

builder/add

go464B
builder, err := stardust.NewBuilder()
if err != nil {
	return err
}
defer builder.Close()

object, err := builder.Add(stardust.NodeInput{
	Parent: stardust.NoNode,
	Kind:   stardust.Object,
})
if err != nil {
	return err
}
if _, err := builder.Add(stardust.NodeInput{
	Parent: object,
	Kind:   stardust.Number,
	Key:    "x",
	Number: stardust.I64(41),
}); err != nil {
	return err
}

result, err := builder.Seal()
if err != nil {
	return err
}
defer result.Close()
Result / 6B
{x 41}

Add a typed integer node

go262B
builder, err := stardust.NewBuilder()
if err != nil {
	return err
}
defer builder.Close()

result := stardust.NodeInput{
	Parent: stardust.NoNode,
	Kind:   stardust.Number,
	Number: stardust.I64(41),
}
if _, err := builder.Add(result); err != nil {
	return err
}
Result / 81B
{parent  null
 kind    number
 boolean false
 number  41
 key     ""
 text    ""}

C exports: stardust_document_builder_add_many, stardust_document_builder_error

Builder.AddMany

builder.add_many(nodes) appends nodes in order in one native call. Nodes have the same fields and preorder rules as add.

go50B
func (b *Builder) AddMany(nodes []NodeInput) error
  • Concurrency: This call requires exclusive use of the receiver handle.

Parameters

ParameterTypeOwnershipDefaultMeaning
nodes[]NodeInputValueRequiredNodes in depth-first preorder to append together.

Errors

StatusWhen
StatusInvalidArgumenta node breaks the preorder rules or has an invalid kind or number
StatusClosedthe builder is closed
StatusOutOfMemorynative memory is exhausted

Examples

builder/add_many

go373B
builder, err := stardust.NewBuilder()
if err != nil {
	return err
}
defer builder.Close()

err = builder.AddMany([]stardust.NodeInput{
	{Parent: stardust.NoNode, Kind: stardust.Object},
	{Parent: 0, Kind: stardust.Number, Key: "x", Number: stardust.I64(41)},
})
if err != nil {
	return err
}

result, err := builder.Seal()
if err != nil {
	return err
}
defer result.Close()
Result / 6B
{x 41}

C exports: stardust_document_builder_add_many, stardust_document_builder_error

Builder.Seal

builder.seal() transfers the constructed document into an independent owned document. You cannot add more nodes after this call.

go43B
func (b *Builder) Seal() (*Document, error)
  • Concurrency: This call requires exclusive use of the receiver handle.
  • Ownership: The caller owns the returned handle and releases it.

Errors

StatusWhen
StatusInvalidArgumentthe builder has no root or a container is still open
StatusClosedthe builder is closed
StatusOutOfMemorynative memory is exhausted

Examples

builder/seal

go464B
builder, err := stardust.NewBuilder()
if err != nil {
	return err
}
defer builder.Close()

object, err := builder.Add(stardust.NodeInput{
	Parent: stardust.NoNode,
	Kind:   stardust.Object,
})
if err != nil {
	return err
}
if _, err := builder.Add(stardust.NodeInput{
	Parent: object,
	Kind:   stardust.Number,
	Key:    "x",
	Number: stardust.I64(41),
}); err != nil {
	return err
}

result, err := builder.Seal()
if err != nil {
	return err
}
defer result.Close()
Result / 6B
{x 41}

C exports: stardust_document_builder_seal, stardust_document_builder_error

Builder.Close

Release the builder handle.

close(handle) releases the handle.

  • Do not use it after closure.
  • Result documents remain usable after the handle that produces them closes.
go25B
func (b *Builder) Close()
  • Concurrency: This call is the last use of the receiver and ends its ownership.

Examples

builder/close

inputText holds this document:

dust5B
x 41
go191B
builder, err := stardust.NewBuilder()
if err != nil {
	return err
}
builder.Close()

result, err := stardust.Parse(inputText, stardust.DUST)
if err != nil {
	return err
}
defer result.Close()
Result / 6B
{x 41}

C exports: stardust_document_builder_release