mirror of
https://github.com/Pumpkin-MC/Pumpkin.git
synced 2026-08-31 20:32:34 +00:00
* initial commit # Conflicts: # Cargo.toml * implemented more `DataResult` methods * finished data result struct * fixed clippy errors * implemented `map_like` and more `dynamic_ops` methods * finished most other `DynamicOps` methods * Fixed doc in get_bytes * added encoder and decoder files * fixed some stuff and added primitive codecs * added some primitive codecs (has errors for now) * changed the "stream" ops methods * reworked types of the coders and codecs, added list codecs * added JSON ops * fixed list codecs, added some doc test examples in `JsonOps` * added lazy codecs * added map encoders, decoders and struct builders * actually added mapdecoder * added encoder and decoder transformations * fixed encoder and decoder transformations and added transformation functions and range codecs * added field encoders and decoders and separated range codecs * added field encoders and decoders and separated range codecs * added BaseMapCodec and SimpleMapCodec * added struct codecs and moved tests * added `NbtOps`, unsigned number codec types, range codec tests, a struct test, detailed `Codec` documentation * added optional field map codecs, the validator function and reworked struct builder functions * added unbounded map and struct codec tests and reworked validated codecs * did some visibility refactoring * fixed some stuff and renamed unsigned number codecs * fixed formatting * fixed docs to reflect changes on renaming unsigned number codecs * fixed validated test * fixed doctest * moved base_map_codec and fixed docs about codecs * fixed some mistakes in the code * fixed some more mistakes in the code and converted some `DataResult::error` calls to `DataResult::partial_error` * fixed formatting * fixed some incorrect docs * removed `OnceLock`s in `MapCodec`s so they can be used more easily * fixed transformer codec descriptions, added more `NbtOps` tests and fixed some `NbtOps` list methods * fixed doctest * added a fourth specific `NbtOps` test for byte buffers (`ByteArray`s in NBT) * fixed grammar mistake * log messages for discarded keys in `create_map` * use the `tracing` crate for logging * added a method to allow creating a field using a `MapCodec` reference * bifurcated `MapCodecCodec`s as well * removed imports only for documentation and replaced them with intra-doc links * added additional docs to `optional_field_with_default` and `lenient_optional_field_with_default` Codec methods for additional details on encoding * renamed crate to `pumpkin-codecs` so that data fixing can be placed somewhere else not frequently used * fixed some more errors and reworked `nbt_ops`'s `ListCollector` to be like 1.21.11, also allows &str in `DataResult`'s creation methods * fixed invalid nbt tag for test * reverted wrapping the tags for heterogeneous elements * renamed function parameter in `DataResult::apply_2` * removed unnecessary comment * fixed a few more issues * fixed formatting * fixed another mistake for `DataResult::add_message` * renamed `DataResult` factory methods to be more idiomatic and removed unnecessary `dyn` method * removed unnecessary `clone()` * updated Cargo.lock
54 lines
1.4 KiB
Rust
54 lines
1.4 KiB
Rust
use crate::HasValue;
|
|
use crate::coders::{Decoder, Encoder};
|
|
use crate::data_result::DataResult;
|
|
use crate::dynamic_ops::DynamicOps;
|
|
use crate::map_codec::MapCodec;
|
|
use crate::struct_builder::StructBuilder;
|
|
use std::fmt::Display;
|
|
|
|
/// A [`Codec`] implementation for a [`MapCodec`].
|
|
///
|
|
/// The `MapCodec` held by this `Codec` can either be *owned* or a static reference (*borrowed*).
|
|
pub enum MapCodecCodec<C: MapCodec + 'static> {
|
|
Owned(C),
|
|
Borrowed(&'static C),
|
|
}
|
|
|
|
impl<C: MapCodec> MapCodecCodec<C> {
|
|
const fn codec(&self) -> &C {
|
|
match self {
|
|
Self::Owned(c) => c,
|
|
Self::Borrowed(c) => c,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<C: MapCodec> HasValue for MapCodecCodec<C> {
|
|
type Value = C::Value;
|
|
}
|
|
|
|
impl<C: MapCodec> Encoder for MapCodecCodec<C> {
|
|
fn encode<T: Display + PartialEq + Clone>(
|
|
&self,
|
|
input: &Self::Value,
|
|
ops: &'static impl DynamicOps<Value = T>,
|
|
prefix: T,
|
|
) -> DataResult<T> {
|
|
self.codec()
|
|
.encode(input, ops, self.codec().builder(ops))
|
|
.build(prefix)
|
|
}
|
|
}
|
|
|
|
impl<C: MapCodec> Decoder for MapCodecCodec<C> {
|
|
fn decode<T: Display + PartialEq + Clone>(
|
|
&self,
|
|
input: T,
|
|
ops: &'static impl DynamicOps<Value = T>,
|
|
) -> DataResult<(Self::Value, T)> {
|
|
self.codec()
|
|
.compressed_decode(input.clone(), ops)
|
|
.map(|a| (a, input))
|
|
}
|
|
}
|