OxL Reference

fn register

Registers the format F (a type that implements Format) so that encode(x, F) / decode<T>(b, F) accept it.

Example:

oxl✓ checked in CI
use std.ser { encode, bytesOf, Format, Encoder, Decoder }

// a debugging text format that prints every event it receives
data Log { out: String }

impl Encoder for Log {
  var fn beginMessage(name: str) { out.push("<{name}") }
  var fn endMessage() { out.push(">") }
  var fn field(tag: u32, name: str) { out.push(" {tag}:{name}=") }
  var fn writeI64(v: i64) { out.push("i{v}") }
  var fn writeU64(v: u64) { out.push("u{v}") }
  var fn writeF64(v: f64) { out.push("f{v}") }
  var fn writeBool(v: bool) { out.push(if v { "T" } else { "F" }) }
  var fn writeStr(v: str) { out.push("'{v}'") }
  var fn writeBytes(v: bytes) { out.push("b{v.len()}") }
  var fn writeNull() { out.push("null") }
  var fn beginList(len: usize) { out.push("[{len}:") }
  var fn endList() { out.push("]") }
  var fn beginMap(len: usize) { out.push("{{{len}:") }
  var fn endMap() { out.push("}}") }
  var fn finish() -> bytes {
    let text = out.freeze()
    bytesOf(&text)
  }
}

data NoDecoder {}

impl Decoder for NoDecoder {}

data LogFormat {}

impl Format for LogFormat {
  fn name() -> str => "log"
  fn encoder() -> Encoder => Log{ out: String.new() }
  fn decoder(input: bytes) -> Decoder => NoDecoder{}
}

fn show<T: Serializable>(x: T) -> str {
  comptime { std.ser.register(LogFormat) }
  match encode(x, LogFormat) {
    bytes b => {
      match Utf8.decode(b) {
        str t => t
        DecodeError _ => "?"
      }
    }
    EncodeError _ => "encode error"
  }
}

fn main() io {
  print(show("x"))
}
Output
'x'
@intrinsic("ser.register") pub(api) fn register(f: Format)

Since. 1.0.0-beta

Parameters

NameType
fFormat

Effects

none declared (pure unless the body says otherwise)

Defined in: std/ser/ser.oxl:2160

See also