OxL Справочник OxL
РусскийEnglish

method Encoder.field

Starts the field tag (binary) / name (text formats) of the current message.

Example:

oxl✓ проверяется в 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"
  }
}

data Person { id: i64; name: str }

fn main() io {
  print(show(Person{ id: 7, name: "ann" }))
}
Вывод
<Person 1:id=i7 2:name='ann'>
var fn field(tag: u32, name: str)

С версии. 1.0.0-beta

Параметры

ИмяТип
tagu32
namestr

Эффекты

не объявлены (чистая, пока тело не говорит иное)

Определено в: std/ser/ser.oxl:645

См. также