use std::collections::BTreeSet;
use crate::encode::{encode, SchemaMode};
use crate::message::{Message, StructReader};
use crate::resolve::Resolver;
use crate::schema::{Schema, SchemaBuilder, StructMode};
use crate::value::Value;
use crate::Result;
pub trait VeritType: Sized {
const VERIT_NAME: &'static str;
const VERIT_MODE: StructMode;
fn verit_register(builder: SchemaBuilder, seen: &mut BTreeSet<&'static str>) -> SchemaBuilder;
fn verit_pack(&self) -> Value;
fn verit_unpack(reader: &StructReader) -> Result<Self>;
fn verit_schema() -> &'static Schema;
fn verit_schema_id() -> u128 {
Self::verit_schema().id()
}
fn to_verit(&self, mode: SchemaMode) -> Result<Vec<u8>> {
encode(Self::verit_schema(), &self.verit_pack(), mode)
}
fn from_verit(bytes: &[u8]) -> Result<Self> {
let schema = Self::verit_schema();
let resolver = Resolver::identity(schema)?;
let msg = Message::parse(bytes)?;
let root = msg.root(&resolver)?;
Self::verit_unpack(&root)
}
}