Pular para o conteúdo

Stdlib · extensões

encoding

formatos de serialização extras

extensions.md · 56 linhas · 1 min de leitura

Adições ao encoding, reusando a mesma maquinaria de reflexão (§10) que já dá binário-nativo + JSON. Como o Serializable é auto-derivado por reflect(T), um formato novo é só um par de molds (to_<fmt>/from_<fmt>) varrendo os mesmos kinds, o que sai barato. Tier 1.

Reusam o reflect direto (são, como o binário-nativo, “structs viram bytes”; só muda o wire-format):

fn msgpack.encode[T](v: T) -> []byte
fn msgpack.decode[T](data: []byte) -> Result[T, error{Malformed, Truncated}]
fn cbor.encode[T](v: T) -> []byte
fn cbor.decode[T](data: []byte) -> Result[T, error{Malformed, Truncated}]

Também expõem a árvore dinâmica (como o json.Value) para dados sem tipo estático: msgpack.Value/ cbor.Value, com os mesmos acessores (get/as_int/…) do json.Value.

Casa com o mk.project já ser um manifesto. Tipado (deriva em struct) e dinâmico:

fn toml.decode[T](text: string) -> Result[T, error{Malformed}]
fn toml.encode[T](v: T) -> string
fn toml.parse(text: string) -> Result[Value, error{Malformed}] // árvore dinâmica

Streaming (linha a linha sobre Readable/Writeable, estilo io.scanner), com header opcional:

fn csv.reader(r: Readable) -> CsvReader
fn (c: *CsvReader) rows() -> Iterator[List[string]] // cada linha já dividida
fn (c: *CsvReader) records[T]() -> Iterator[Result[T, error{Malformed}]] // mapeia p/ struct (header→campo)
fn (c: CsvReader) err() -> Optional[error] // erro fora do loop (como Scanner)
fn csv.writer(w: Writeable) -> CsvWriter
fn (c: *CsvWriter) write_row(fields: []string) -> error{Io}
fn (c: *CsvWriter) write_record[T](v: T) -> error{Io} // struct → linha
decl CsvOptions { pub delimiter: byte; pub has_header: bool; pub quote: byte }
  • Reusam o reflect, não um sistema novo: msgpack/cbor são o mesmo “kind para bytes” do binário-nativo com outro wire; toml/csv mapeiam struct para texto pelos mesmos descritores. Custo marginal.
  • Fora: YAML (gramática ambígua e traiçoeira, alto custo e baixo retorno no nosso uso); Protobuf (exige schema/IDL, não cabe aqui: ver nota na fila; o plugin protoc é tooling, e o RPC binário nativo é a lib rpc futura sobre o Channel[T] tipado).
  • Cada formato é opt-in (use encoding.msgpack etc.): quem não usa não paga.