Ctrl K
ComunidadGuías…

examples/cbor.v

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
module main

import encoding.cbor
import encoding.hex
import time

struct Address {
	street string
	city   string
	zip    string @[cbor: 'postal_code']
}

struct User {
	name      string
	age       u32
	email     ?string
	tags      []string
	address   Address
	signed_up time.Time
	internal  string @[skip]
}

fn main() {
	user := User{
		name:      'Alice'
		age:       30
		email:     'alice@example.com'
		tags:      ['admin', 'beta']
		address:   Address{
			street: '1 Test Lane'
			city:   'Paris'
			zip:    '75000'
		}
		signed_up: time.parse_iso8601('2025-01-15T10:00:00Z') or { time.now() }
		internal:  'will not be encoded'
	}

	// 1. Generic typed encode/decode
	bytes := cbor.encode[User](user, cbor.EncodeOpts{})!
	println('encoded ${bytes.len} bytes: ${hex.encode(bytes)}')

	back := cbor.decode[User](bytes, cbor.DecodeOpts{})!
	println('round-trip name=${back.name} age=${back.age} city=${back.address.city}')

	// 2. Canonical encoding for stable hashing/signing
	mut m := map[string]int{}
	m['z'] = 26
	m['a'] = 1
	m['m'] = 13
	canonical := cbor.encode[map[string]int](m, cbor.EncodeOpts{
		canonical: true
	})!
	println('canonical map: ${hex.encode(canonical)}')

	// 3. Decode an unknown payload into a Value tree
	v := cbor.decode[cbor.Value](bytes, cbor.DecodeOpts{})!
	if name_val := v.get('name') {
		if s := name_val.as_string() {
			println('peeked name from Value tree: ${s}')
		}
	}

	// 4. Manual streaming: build a CBOR array of mixed types
	mut p := cbor.new_packer(cbor.EncodeOpts{})
	p.pack_array_header(3)
	p.pack_uint(42)
	p.pack_text('hello')
	p.pack_bool(true)
	stream_bytes := p.bytes()
	println('manual stream: ${hex.encode(stream_bytes)}')

	mut up := cbor.new_unpacker(stream_bytes, cbor.DecodeOpts{})
	n := up.unpack_array_header()!
	first := up.unpack_uint()!
	second := up.unpack_text()!
	third := up.unpack_bool()!
	println('unpacked array of ${n}: ${first}, "${second}", ${third}')
}