prototk 0.11.0

prototk provides a toolkit for prototcol buffers.
Documentation
prototk
=======

prototk provides a toolkit for prototcol buffers.

Status
------

Maintenance track.  The library is considered stable and will be put into maintenance mode if unchanged for one year.
The clock was last reset 2023-09-19.

Scope
-----

This library is about serialization and deserialization of messages.  It strives to distil protocol buffers to this:

```ignore
#[derive(Debug, Default, Message)]
pub enum Error {
    #[prototk(278528, message)]
    #[default]
    Success {
        #[prototk(1, message)]
        core: ErrorCore,
    },
    #[prototk(278529, message)]
    SerializationError {
        #[prototk(1, message)]
        core: ErrorCore,
        #[prototk(2, message)]
        err: prototk::Error,
        #[prototk(3, string)]
        context: String,
    },
    #[prototk(278530, message)]
    UnknownServerName {
        #[prototk(1, message)]
        core: ErrorCore,
        #[prototk(2, string)]
        name: String,
    },
    #[prototk(278531, message)]
    UnknownMethodName {
        #[prototk(1, message)]
        core: ErrorCore,
        #[prototk(2, string)]
        name: String,
    },
    #[prototk(278532, message)]
    RequestTooLarge {
        #[prototk(1, message)]
        core: ErrorCore,
        #[prototk(2, uint64)]
        size: u64,
    },
}

// serialize
let err = Error::UnknownServerName {
    core: ErrorCore::new("robert@rescrv.net", "unknown server name", &UNKOWN_SERVER_NAME_COUNTER),
    name: "FooRpcServer",
};
let buf = stack_pack(err).to_vec()

// deserialize
let up = Unpacker::new(&buf);
let err: Error = up.unpack()?;
```

Warts
-----

- The derive macro's errors are not the most easy to understand.

Reserved Field Ranges
---------------------

The error types in my libraries all have diffrent field numbers.  Here is where I track them.

- 262144..262400 prototk::Error
- 278528..278784 rpc_pb::Error
- 294912..295168 macarunes::Error
- 311296..311552 tuple_key::Error
- 376832..377088 mani::Error
- 442368..442624 sst::Error
- 507904..508160 protoql::Error
- 573440..573696 paxos_pb::Error

Maps
----

Maps are not supported by prototk natively because the typing is too complicated.  Make a MapEntry type that has field
number 1 for the key and 2 for the value.  Put it in a `Vec` tagged as a `message`.

Documentation
-------------

The latest documentation is always available at [docs.rs](https://docs.rs/prototk/latest/prototk/).