murex Shell Docs

API Reference: WriteArray() (type)

Write a data type, one array element at a time

Description

This is a function you would write when programming a murex data-type.

It's called by builtins to allow them to write data structures one array element at a time.

The purpose of this function is to allow builtins to support sequential writes (where possible) and also create a standard interface for builtins, thus allowing them to be data-type agnostic.

A Collection of Functions

WriteArray() should return a struct that satisfies the following interface{}:

package stdio

// ArrayWriter is a simple interface types can adopt for buffered writes of formatted arrays in structured types (eg JSON)
type ArrayWriter interface {
    Write([]byte) error
    WriteString(string) error
    Close() error
}

Usage

Registering your WriteArray()

// To avoid confusion, this should only happen inside func init()
stdio.RegisterWriteArray(/* your type name */, /* your writeArray func */)

Examples

Example WriteArray() function:

package string

import (
    "github.com/lmorg/murex/lang/stdio"
)

type arrayWriter struct {
    writer stdio.Io
}

func newArrayWriter(writer stdio.Io) (stdio.ArrayWriter, error) {
    w := &arrayWriter{writer: writer}
    return w, nil
}

func (w *arrayWriter) Write(b []byte) error {
    _, err := w.writer.Writeln(b)
    return err
}

func (w *arrayWriter) WriteString(s string) error {
    _, err := w.writer.Writeln([]byte(s))
    return err
}

func (w *arrayWriter) Close() error { return nil }

Detail

Since not all data types will be stream-able (for example json), some types may need to cache the array and then to write it once the array writer has been closed.

package json

import (
    "github.com/lmorg/murex/lang/stdio"
    "github.com/lmorg/murex/utils/json"
)

type arrayWriter struct {
    array  []string
    writer stdio.Io
}

func newArrayWriter(writer stdio.Io) (stdio.ArrayWriter, error) {
    w := &arrayWriter{writer: writer}
    return w, nil
}

func (w *arrayWriter) Write(b []byte) error {
    w.array = append(w.array, string(b))
    return nil
}

func (w *arrayWriter) WriteString(s string) error {
    w.array = append(w.array, s)
    return nil
}

func (w *arrayWriter) Close() error {
    b, err := json.Marshal(w.array, w.writer.IsTTY())
    if err != nil {
        return err
    }

    _, err = w.writer.Write(b)
    return err
}

See Also

This site's content is rebuilt automatically from murex's source code after each merge to the master branch. Downloadable murex binaries are also built with the website.

Last built on Tue Jun 22 08:18:17 UTC 2021 against commit 2235c7b2235c7b18f86f1cf214e246b88b0ea193d87fe80.

Current version is 2.2.1100 BETA which has been verified against tests.