First look at flattened ID specialisation for block serializers

in the future we should be able to unify these, similarly to simple mappings.
unifying blocks with states will, however, be considerably more work.

only color benefits from this so far
This commit is contained in:
Dylan K. Taylor 2025-08-15 22:02:12 +01:00
parent 1e8612cfc8
commit e89523ce66
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D
4 changed files with 377 additions and 448 deletions

View File

@ -290,86 +290,72 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
return $result instanceof Writer ? $result->getBlockStateData() : $result; return $result instanceof Writer ? $result->getBlockStateData() : $result;
} }
/**
* @phpstan-template TBlock of Block
* @phpstan-template TEnum of \UnitEnum
*
* @phpstan-param TBlock $block
* @phpstan-param StringEnumMap<TEnum> $mapProperty
* @phpstan-param \Closure(TBlock) : TEnum $getProperty
* @phpstan-param ?\Closure(TBlock, Writer) : Writer $extra
*/
public function mapFlattenedEnum(
Block $block,
StringEnumMap $mapProperty,
string $prefix,
string $suffix,
\Closure $getProperty,
?\Closure $extra = null
) : void{
$this->map($block, function(Block $block) use ($getProperty, $mapProperty, $prefix, $suffix, $extra) : Writer{
$property = $getProperty($block);
$infix = $mapProperty->enumToValue($property);
$id = $prefix . $infix . $suffix;
$writer = new Writer($id);
if($extra !== null){
$extra($block, $writer);
}
return $writer;
});
}
private function registerCandleSerializers() : void{ private function registerCandleSerializers() : void{
$this->map(Blocks::CANDLE(), fn(Candle $block) => Helper::encodeCandle($block, new Writer(Ids::CANDLE))); $this->map(Blocks::CANDLE(), fn(Candle $block) => Helper::encodeCandle($block, new Writer(Ids::CANDLE)));
$this->map(Blocks::DYED_CANDLE(), fn(DyedCandle $block) => Helper::encodeCandle($block, new Writer(match($block->getColor()){ $this->mapFlattenedEnum(
DyeColor::BLACK => Ids::BLACK_CANDLE, Blocks::DYED_CANDLE(),
DyeColor::BLUE => Ids::BLUE_CANDLE, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
DyeColor::BROWN => Ids::BROWN_CANDLE, "minecraft:",
DyeColor::CYAN => Ids::CYAN_CANDLE, "_candle",
DyeColor::GRAY => Ids::GRAY_CANDLE, fn(DyedCandle $block) => $block->getColor(),
DyeColor::GREEN => Ids::GREEN_CANDLE, Helper::encodeCandle(...)
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_CANDLE, );
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_CANDLE,
DyeColor::LIME => Ids::LIME_CANDLE,
DyeColor::MAGENTA => Ids::MAGENTA_CANDLE,
DyeColor::ORANGE => Ids::ORANGE_CANDLE,
DyeColor::PINK => Ids::PINK_CANDLE,
DyeColor::PURPLE => Ids::PURPLE_CANDLE,
DyeColor::RED => Ids::RED_CANDLE,
DyeColor::WHITE => Ids::WHITE_CANDLE,
DyeColor::YELLOW => Ids::YELLOW_CANDLE,
})));
$this->map(Blocks::CAKE_WITH_CANDLE(), fn(CakeWithCandle $block) => Writer::create(Ids::CANDLE_CAKE) $this->map(Blocks::CAKE_WITH_CANDLE(), fn(CakeWithCandle $block) => Writer::create(Ids::CANDLE_CAKE)
->writeBool(StateNames::LIT, $block->isLit())); ->writeBool(StateNames::LIT, $block->isLit()));
$this->map(Blocks::CAKE_WITH_DYED_CANDLE(), fn(CakeWithDyedCandle $block) => Writer::create(match($block->getColor()){ $this->mapFlattenedEnum(
DyeColor::BLACK => Ids::BLACK_CANDLE_CAKE, Blocks::CAKE_WITH_DYED_CANDLE(),
DyeColor::BLUE => Ids::BLUE_CANDLE_CAKE, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
DyeColor::BROWN => Ids::BROWN_CANDLE_CAKE, "minecraft:",
DyeColor::CYAN => Ids::CYAN_CANDLE_CAKE, "_candle_cake",
DyeColor::GRAY => Ids::GRAY_CANDLE_CAKE, fn(CakeWithDyedCandle $block) => $block->getColor(),
DyeColor::GREEN => Ids::GREEN_CANDLE_CAKE, fn(CakeWithDyedCandle $block, Writer $writer) => $writer->writeBool(StateNames::LIT, $block->isLit())
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_CANDLE_CAKE, );
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_CANDLE_CAKE,
DyeColor::LIME => Ids::LIME_CANDLE_CAKE,
DyeColor::MAGENTA => Ids::MAGENTA_CANDLE_CAKE,
DyeColor::ORANGE => Ids::ORANGE_CANDLE_CAKE,
DyeColor::PINK => Ids::PINK_CANDLE_CAKE,
DyeColor::PURPLE => Ids::PURPLE_CANDLE_CAKE,
DyeColor::RED => Ids::RED_CANDLE_CAKE,
DyeColor::WHITE => Ids::WHITE_CANDLE_CAKE,
DyeColor::YELLOW => Ids::YELLOW_CANDLE_CAKE,
})->writeBool(StateNames::LIT, $block->isLit()));
} }
public function registerFlatColorBlockSerializers() : void{ public function registerFlatColorBlockSerializers() : void{
$this->map(Blocks::STAINED_HARDENED_GLASS(), fn(StainedHardenedGlass $block) => BlockStateData::current(match($block->getColor()){ $this->mapFlattenedEnum(
DyeColor::BLACK => Ids::HARD_BLACK_STAINED_GLASS, Blocks::STAINED_HARDENED_GLASS(),
DyeColor::BLUE => Ids::HARD_BLUE_STAINED_GLASS, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
DyeColor::BROWN => Ids::HARD_BROWN_STAINED_GLASS, "minecraft:hard_",
DyeColor::CYAN => Ids::HARD_CYAN_STAINED_GLASS, "_stained_glass",
DyeColor::GRAY => Ids::HARD_GRAY_STAINED_GLASS, fn(StainedHardenedGlass $block) => $block->getColor()
DyeColor::GREEN => Ids::HARD_GREEN_STAINED_GLASS, );
DyeColor::LIGHT_BLUE => Ids::HARD_LIGHT_BLUE_STAINED_GLASS, $this->mapFlattenedEnum(
DyeColor::LIGHT_GRAY => Ids::HARD_LIGHT_GRAY_STAINED_GLASS, Blocks::STAINED_HARDENED_GLASS_PANE(),
DyeColor::LIME => Ids::HARD_LIME_STAINED_GLASS, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
DyeColor::MAGENTA => Ids::HARD_MAGENTA_STAINED_GLASS, "minecraft:hard_",
DyeColor::ORANGE => Ids::HARD_ORANGE_STAINED_GLASS, "_stained_glass_pane",
DyeColor::PINK => Ids::HARD_PINK_STAINED_GLASS, fn(StainedHardenedGlassPane $block) => $block->getColor(),
DyeColor::PURPLE => Ids::HARD_PURPLE_STAINED_GLASS, );
DyeColor::RED => Ids::HARD_RED_STAINED_GLASS,
DyeColor::WHITE => Ids::HARD_WHITE_STAINED_GLASS,
DyeColor::YELLOW => Ids::HARD_YELLOW_STAINED_GLASS,
}, []));
$this->map(Blocks::STAINED_HARDENED_GLASS_PANE(), fn(StainedHardenedGlassPane $block) => BlockStateData::current(match($block->getColor()){
DyeColor::BLACK => Ids::HARD_BLACK_STAINED_GLASS_PANE,
DyeColor::BLUE => Ids::HARD_BLUE_STAINED_GLASS_PANE,
DyeColor::BROWN => Ids::HARD_BROWN_STAINED_GLASS_PANE,
DyeColor::CYAN => Ids::HARD_CYAN_STAINED_GLASS_PANE,
DyeColor::GRAY => Ids::HARD_GRAY_STAINED_GLASS_PANE,
DyeColor::GREEN => Ids::HARD_GREEN_STAINED_GLASS_PANE,
DyeColor::LIGHT_BLUE => Ids::HARD_LIGHT_BLUE_STAINED_GLASS_PANE,
DyeColor::LIGHT_GRAY => Ids::HARD_LIGHT_GRAY_STAINED_GLASS_PANE,
DyeColor::LIME => Ids::HARD_LIME_STAINED_GLASS_PANE,
DyeColor::MAGENTA => Ids::HARD_MAGENTA_STAINED_GLASS_PANE,
DyeColor::ORANGE => Ids::HARD_ORANGE_STAINED_GLASS_PANE,
DyeColor::PINK => Ids::HARD_PINK_STAINED_GLASS_PANE,
DyeColor::PURPLE => Ids::HARD_PURPLE_STAINED_GLASS_PANE,
DyeColor::RED => Ids::HARD_RED_STAINED_GLASS_PANE,
DyeColor::WHITE => Ids::HARD_WHITE_STAINED_GLASS_PANE,
DyeColor::YELLOW => Ids::HARD_YELLOW_STAINED_GLASS_PANE,
}, []));
$this->map(Blocks::GLAZED_TERRACOTTA(), function(GlazedTerracotta $block) : Writer{ $this->map(Blocks::GLAZED_TERRACOTTA(), function(GlazedTerracotta $block) : Writer{
return Writer::create(match($block->getColor()){ return Writer::create(match($block->getColor()){
@ -393,157 +379,67 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
->writeHorizontalFacing($block->getFacing()); ->writeHorizontalFacing($block->getFacing());
}); });
$this->map(Blocks::WOOL(), fn(Wool $block) => BlockStateData::current(match($block->getColor()){ $this->mapFlattenedEnum(
DyeColor::BLACK => Ids::BLACK_WOOL, Blocks::WOOL(),
DyeColor::BLUE => Ids::BLUE_WOOL, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
DyeColor::BROWN => Ids::BROWN_WOOL, "minecraft:",
DyeColor::CYAN => Ids::CYAN_WOOL, "_wool",
DyeColor::GRAY => Ids::GRAY_WOOL, fn(Wool $block) => $block->getColor()
DyeColor::GREEN => Ids::GREEN_WOOL, );
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_WOOL,
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_WOOL,
DyeColor::LIME => Ids::LIME_WOOL,
DyeColor::MAGENTA => Ids::MAGENTA_WOOL,
DyeColor::ORANGE => Ids::ORANGE_WOOL,
DyeColor::PINK => Ids::PINK_WOOL,
DyeColor::PURPLE => Ids::PURPLE_WOOL,
DyeColor::RED => Ids::RED_WOOL,
DyeColor::WHITE => Ids::WHITE_WOOL,
DyeColor::YELLOW => Ids::YELLOW_WOOL,
}, []));
$this->map(Blocks::CARPET(), fn(Carpet $block) => BlockStateData::current(match($block->getColor()){ $this->mapFlattenedEnum(
DyeColor::BLACK => Ids::BLACK_CARPET, Blocks::CARPET(),
DyeColor::BLUE => Ids::BLUE_CARPET, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
DyeColor::BROWN => Ids::BROWN_CARPET, "minecraft:",
DyeColor::CYAN => Ids::CYAN_CARPET, "_carpet",
DyeColor::GRAY => Ids::GRAY_CARPET, fn(Carpet $block) => $block->getColor()
DyeColor::GREEN => Ids::GREEN_CARPET, );
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_CARPET,
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_CARPET,
DyeColor::LIME => Ids::LIME_CARPET,
DyeColor::MAGENTA => Ids::MAGENTA_CARPET,
DyeColor::ORANGE => Ids::ORANGE_CARPET,
DyeColor::PINK => Ids::PINK_CARPET,
DyeColor::PURPLE => Ids::PURPLE_CARPET,
DyeColor::RED => Ids::RED_CARPET,
DyeColor::WHITE => Ids::WHITE_CARPET,
DyeColor::YELLOW => Ids::YELLOW_CARPET,
}, []));
$this->map(Blocks::DYED_SHULKER_BOX(), fn(DyedShulkerBox $block) => BlockStateData::current(match($block->getColor()){ $this->mapFlattenedEnum(
DyeColor::BLACK => Ids::BLACK_SHULKER_BOX, Blocks::DYED_SHULKER_BOX(),
DyeColor::BLUE => Ids::BLUE_SHULKER_BOX, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
DyeColor::BROWN => Ids::BROWN_SHULKER_BOX, "minecraft:",
DyeColor::CYAN => Ids::CYAN_SHULKER_BOX, "_shulker_box",
DyeColor::GRAY => Ids::GRAY_SHULKER_BOX, fn(DyedShulkerBox $block) => $block->getColor()
DyeColor::GREEN => Ids::GREEN_SHULKER_BOX, );
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_SHULKER_BOX,
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_SHULKER_BOX,
DyeColor::LIME => Ids::LIME_SHULKER_BOX,
DyeColor::MAGENTA => Ids::MAGENTA_SHULKER_BOX,
DyeColor::ORANGE => Ids::ORANGE_SHULKER_BOX,
DyeColor::PINK => Ids::PINK_SHULKER_BOX,
DyeColor::PURPLE => Ids::PURPLE_SHULKER_BOX,
DyeColor::RED => Ids::RED_SHULKER_BOX,
DyeColor::WHITE => Ids::WHITE_SHULKER_BOX,
DyeColor::YELLOW => Ids::YELLOW_SHULKER_BOX,
}, []));
$this->map(Blocks::CONCRETE(), fn(Concrete $block) => BlockStateData::current(match($block->getColor()){ $this->mapFlattenedEnum(
DyeColor::BLACK => Ids::BLACK_CONCRETE, Blocks::CONCRETE(),
DyeColor::BLUE => Ids::BLUE_CONCRETE, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
DyeColor::BROWN => Ids::BROWN_CONCRETE, "minecraft:",
DyeColor::CYAN => Ids::CYAN_CONCRETE, "_concrete",
DyeColor::GRAY => Ids::GRAY_CONCRETE, fn(Concrete $block) => $block->getColor()
DyeColor::GREEN => Ids::GREEN_CONCRETE, );
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_CONCRETE, $this->mapFlattenedEnum(
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_CONCRETE, Blocks::CONCRETE_POWDER(),
DyeColor::LIME => Ids::LIME_CONCRETE, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
DyeColor::MAGENTA => Ids::MAGENTA_CONCRETE, "minecraft:",
DyeColor::ORANGE => Ids::ORANGE_CONCRETE, "_concrete_powder",
DyeColor::PINK => Ids::PINK_CONCRETE, fn(ConcretePowder $block) => $block->getColor()
DyeColor::PURPLE => Ids::PURPLE_CONCRETE, );
DyeColor::RED => Ids::RED_CONCRETE,
DyeColor::WHITE => Ids::WHITE_CONCRETE,
DyeColor::YELLOW => Ids::YELLOW_CONCRETE,
}, []));
$this->map(Blocks::CONCRETE_POWDER(), fn(ConcretePowder $block) => BlockStateData::current(match($block->getColor()){ $this->mapFlattenedEnum(
DyeColor::BLACK => Ids::BLACK_CONCRETE_POWDER, Blocks::STAINED_CLAY(),
DyeColor::BLUE => Ids::BLUE_CONCRETE_POWDER, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
DyeColor::BROWN => Ids::BROWN_CONCRETE_POWDER, "minecraft:",
DyeColor::CYAN => Ids::CYAN_CONCRETE_POWDER, "_terracotta",
DyeColor::GRAY => Ids::GRAY_CONCRETE_POWDER, fn(StainedHardenedClay $block) => $block->getColor()
DyeColor::GREEN => Ids::GREEN_CONCRETE_POWDER, );
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_CONCRETE_POWDER,
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_CONCRETE_POWDER,
DyeColor::LIME => Ids::LIME_CONCRETE_POWDER,
DyeColor::MAGENTA => Ids::MAGENTA_CONCRETE_POWDER,
DyeColor::ORANGE => Ids::ORANGE_CONCRETE_POWDER,
DyeColor::PINK => Ids::PINK_CONCRETE_POWDER,
DyeColor::PURPLE => Ids::PURPLE_CONCRETE_POWDER,
DyeColor::RED => Ids::RED_CONCRETE_POWDER,
DyeColor::WHITE => Ids::WHITE_CONCRETE_POWDER,
DyeColor::YELLOW => Ids::YELLOW_CONCRETE_POWDER,
}, []));
$this->map(Blocks::STAINED_CLAY(), fn(StainedHardenedClay $block) => BlockStateData::current(match($block->getColor()){ $this->mapFlattenedEnum(
DyeColor::BLACK => Ids::BLACK_TERRACOTTA, Blocks::STAINED_GLASS(),
DyeColor::BLUE => Ids::BLUE_TERRACOTTA, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
DyeColor::BROWN => Ids::BROWN_TERRACOTTA, "minecraft:",
DyeColor::CYAN => Ids::CYAN_TERRACOTTA, "_stained_glass",
DyeColor::GRAY => Ids::GRAY_TERRACOTTA, fn(StainedGlass $block) => $block->getColor()
DyeColor::GREEN => Ids::GREEN_TERRACOTTA, );
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_TERRACOTTA, $this->mapFlattenedEnum(
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_TERRACOTTA, Blocks::STAINED_GLASS_PANE(),
DyeColor::LIME => Ids::LIME_TERRACOTTA, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
DyeColor::MAGENTA => Ids::MAGENTA_TERRACOTTA, "minecraft:",
DyeColor::ORANGE => Ids::ORANGE_TERRACOTTA, "_stained_glass_pane",
DyeColor::PINK => Ids::PINK_TERRACOTTA, fn(StainedGlassPane $block) => $block->getColor()
DyeColor::PURPLE => Ids::PURPLE_TERRACOTTA, );
DyeColor::RED => Ids::RED_TERRACOTTA,
DyeColor::WHITE => Ids::WHITE_TERRACOTTA,
DyeColor::YELLOW => Ids::YELLOW_TERRACOTTA,
}, []));
$this->map(Blocks::STAINED_GLASS(), fn(StainedGlass $block) => BlockStateData::current(match($block->getColor()){
DyeColor::BLACK => Ids::BLACK_STAINED_GLASS,
DyeColor::BLUE => Ids::BLUE_STAINED_GLASS,
DyeColor::BROWN => Ids::BROWN_STAINED_GLASS,
DyeColor::CYAN => Ids::CYAN_STAINED_GLASS,
DyeColor::GRAY => Ids::GRAY_STAINED_GLASS,
DyeColor::GREEN => Ids::GREEN_STAINED_GLASS,
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_STAINED_GLASS,
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_STAINED_GLASS,
DyeColor::LIME => Ids::LIME_STAINED_GLASS,
DyeColor::MAGENTA => Ids::MAGENTA_STAINED_GLASS,
DyeColor::ORANGE => Ids::ORANGE_STAINED_GLASS,
DyeColor::PINK => Ids::PINK_STAINED_GLASS,
DyeColor::PURPLE => Ids::PURPLE_STAINED_GLASS,
DyeColor::RED => Ids::RED_STAINED_GLASS,
DyeColor::WHITE => Ids::WHITE_STAINED_GLASS,
DyeColor::YELLOW => Ids::YELLOW_STAINED_GLASS,
}, []));
$this->map(Blocks::STAINED_GLASS_PANE(), fn(StainedGlassPane $block) => BlockStateData::current(match($block->getColor()){
DyeColor::BLACK => Ids::BLACK_STAINED_GLASS_PANE,
DyeColor::BLUE => Ids::BLUE_STAINED_GLASS_PANE,
DyeColor::BROWN => Ids::BROWN_STAINED_GLASS_PANE,
DyeColor::CYAN => Ids::CYAN_STAINED_GLASS_PANE,
DyeColor::GRAY => Ids::GRAY_STAINED_GLASS_PANE,
DyeColor::GREEN => Ids::GREEN_STAINED_GLASS_PANE,
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_STAINED_GLASS_PANE,
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_STAINED_GLASS_PANE,
DyeColor::LIME => Ids::LIME_STAINED_GLASS_PANE,
DyeColor::MAGENTA => Ids::MAGENTA_STAINED_GLASS_PANE,
DyeColor::ORANGE => Ids::ORANGE_STAINED_GLASS_PANE,
DyeColor::PINK => Ids::PINK_STAINED_GLASS_PANE,
DyeColor::PURPLE => Ids::PURPLE_STAINED_GLASS_PANE,
DyeColor::RED => Ids::RED_STAINED_GLASS_PANE,
DyeColor::WHITE => Ids::WHITE_STAINED_GLASS_PANE,
DyeColor::YELLOW => Ids::YELLOW_STAINED_GLASS_PANE,
}, []));
} }
private function registerFlatCoralSerializers() : void{ private function registerFlatCoralSerializers() : void{

View File

@ -27,6 +27,7 @@ use pocketmine\block\AmethystCluster;
use pocketmine\block\Anvil; use pocketmine\block\Anvil;
use pocketmine\block\Bamboo; use pocketmine\block\Bamboo;
use pocketmine\block\Block; use pocketmine\block\Block;
use pocketmine\block\CakeWithDyedCandle;
use pocketmine\block\CaveVines; use pocketmine\block\CaveVines;
use pocketmine\block\ChorusFlower; use pocketmine\block\ChorusFlower;
use pocketmine\block\DoublePitcherCrop; use pocketmine\block\DoublePitcherCrop;
@ -157,97 +158,68 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{
$this->map($strippedId, fn(Reader $in) => Helper::decodeLog($getBlock(), true, $in)); $this->map($strippedId, fn(Reader $in) => Helper::decodeLog($getBlock(), true, $in));
} }
private function registerCandleDeserializers() : void{ /**
$this->map(Ids::CANDLE, fn(Reader $in) => Helper::decodeCandle(Blocks::CANDLE(), $in)); * @phpstan-template TBlock of Block
foreach([ * @phpstan-template TEnum of \UnitEnum
Ids::BLACK_CANDLE => DyeColor::BLACK, *
Ids::BLUE_CANDLE => DyeColor::BLUE, * @phpstan-param StringEnumMap<TEnum> $mapProperty
Ids::BROWN_CANDLE => DyeColor::BROWN, * @phpstan-param \Closure(TEnum) : TBlock $getBlock
Ids::CYAN_CANDLE => DyeColor::CYAN, * @phpstan-param ?\Closure(TBlock, Reader) : TBlock $extra
Ids::GRAY_CANDLE => DyeColor::GRAY, */
Ids::GREEN_CANDLE => DyeColor::GREEN, public function mapFlattenedEnum(
Ids::LIGHT_BLUE_CANDLE => DyeColor::LIGHT_BLUE, StringEnumMap $mapProperty,
Ids::LIGHT_GRAY_CANDLE => DyeColor::LIGHT_GRAY, string $prefix,
Ids::LIME_CANDLE => DyeColor::LIME, string $suffix,
Ids::MAGENTA_CANDLE => DyeColor::MAGENTA, \Closure $getBlock,
Ids::ORANGE_CANDLE => DyeColor::ORANGE, ?\Closure $extra = null
Ids::PINK_CANDLE => DyeColor::PINK, ) : void{
Ids::PURPLE_CANDLE => DyeColor::PURPLE, foreach(Utils::stringifyKeys($mapProperty->getValueToEnum()) as $infix => $enumCase){
Ids::RED_CANDLE => DyeColor::RED, $id = $prefix . $infix . $suffix;
Ids::WHITE_CANDLE => DyeColor::WHITE, if($extra === null){
Ids::YELLOW_CANDLE => DyeColor::YELLOW, $this->map($id, fn() => $getBlock($enumCase));
] as $id => $color){ }else{
$this->map($id, fn(Reader $in) => Helper::decodeCandle(Blocks::DYED_CANDLE()->setColor($color), $in)); $this->map($id, function(Reader $in) use ($enumCase, $getBlock, $extra) : Block{
$block = $getBlock($enumCase);
$extra($block, $in);
return $block;
});
}
}
} }
$this->map(Ids::CANDLE_CAKE, fn(Reader $in) => Blocks::CAKE_WITH_CANDLE()->setLit($in->readBool(StateNames::LIT))); private function registerCandleDeserializers() : void{
foreach([ $this->map(Ids::CANDLE, fn(Reader $in) => Helper::decodeCandle(Blocks::CANDLE(), $in));
Ids::BLACK_CANDLE_CAKE => DyeColor::BLACK, $this->mapFlattenedEnum(
Ids::BLUE_CANDLE_CAKE => DyeColor::BLUE, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
Ids::BROWN_CANDLE_CAKE => DyeColor::BROWN, "minecraft:",
Ids::CYAN_CANDLE_CAKE => DyeColor::CYAN, "_candle",
Ids::GRAY_CANDLE_CAKE => DyeColor::GRAY, fn(DyeColor $color) => Blocks::DYED_CANDLE()->setColor($color),
Ids::GREEN_CANDLE_CAKE => DyeColor::GREEN, Helper::decodeCandle(...)
Ids::LIGHT_BLUE_CANDLE_CAKE => DyeColor::LIGHT_BLUE, );
Ids::LIGHT_GRAY_CANDLE_CAKE => DyeColor::LIGHT_GRAY,
Ids::LIME_CANDLE_CAKE => DyeColor::LIME, $this->map(Ids::CANDLE_CAKE, fn(Reader $in) => Blocks::CAKE_WITH_CANDLE()->setLit($in->readBool(StateNames::LIT)));
Ids::MAGENTA_CANDLE_CAKE => DyeColor::MAGENTA, $this->mapFlattenedEnum(
Ids::ORANGE_CANDLE_CAKE => DyeColor::ORANGE, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
Ids::PINK_CANDLE_CAKE => DyeColor::PINK, "minecraft:",
Ids::PURPLE_CANDLE_CAKE => DyeColor::PURPLE, "_candle_cake",
Ids::RED_CANDLE_CAKE => DyeColor::RED, fn(DyeColor $color) => Blocks::CAKE_WITH_DYED_CANDLE()->setColor($color),
Ids::WHITE_CANDLE_CAKE => DyeColor::WHITE, fn(CakeWithDyedCandle $block, Reader $in) => $block->setLit($in->readBool(StateNames::LIT))
Ids::YELLOW_CANDLE_CAKE => DyeColor::YELLOW,
] as $id => $color){
$this->map($id, fn(Reader $in) => Blocks::CAKE_WITH_DYED_CANDLE()
->setColor($color)
->setLit($in->readBool(StateNames::LIT))
); );
}
} }
private function registerFlatColorBlockDeserializers() : void{ private function registerFlatColorBlockDeserializers() : void{
foreach([ $this->mapFlattenedEnum(
Ids::HARD_BLACK_STAINED_GLASS => DyeColor::BLACK, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
Ids::HARD_BLUE_STAINED_GLASS => DyeColor::BLUE, "minecraft:hard_",
Ids::HARD_BROWN_STAINED_GLASS => DyeColor::BROWN, "_stained_glass",
Ids::HARD_CYAN_STAINED_GLASS => DyeColor::CYAN, fn(DyeColor $color) => Blocks::STAINED_HARDENED_GLASS()->setColor($color)
Ids::HARD_GRAY_STAINED_GLASS => DyeColor::GRAY, );
Ids::HARD_GREEN_STAINED_GLASS => DyeColor::GREEN, $this->mapFlattenedEnum(
Ids::HARD_LIGHT_BLUE_STAINED_GLASS => DyeColor::LIGHT_BLUE, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
Ids::HARD_LIGHT_GRAY_STAINED_GLASS => DyeColor::LIGHT_GRAY, "minecraft:hard_",
Ids::HARD_LIME_STAINED_GLASS => DyeColor::LIME, "_stained_glass_pane",
Ids::HARD_MAGENTA_STAINED_GLASS => DyeColor::MAGENTA, fn(DyeColor $color) => Blocks::STAINED_HARDENED_GLASS_PANE()->setColor($color)
Ids::HARD_ORANGE_STAINED_GLASS => DyeColor::ORANGE, );
Ids::HARD_PINK_STAINED_GLASS => DyeColor::PINK,
Ids::HARD_PURPLE_STAINED_GLASS => DyeColor::PURPLE,
Ids::HARD_RED_STAINED_GLASS => DyeColor::RED,
Ids::HARD_WHITE_STAINED_GLASS => DyeColor::WHITE,
Ids::HARD_YELLOW_STAINED_GLASS => DyeColor::YELLOW,
] as $id => $color){
$this->map($id, fn(Reader $in) => Blocks::STAINED_HARDENED_GLASS()->setColor($color));
}
foreach([
Ids::HARD_BLACK_STAINED_GLASS_PANE => DyeColor::BLACK,
Ids::HARD_BLUE_STAINED_GLASS_PANE => DyeColor::BLUE,
Ids::HARD_BROWN_STAINED_GLASS_PANE => DyeColor::BROWN,
Ids::HARD_CYAN_STAINED_GLASS_PANE => DyeColor::CYAN,
Ids::HARD_GRAY_STAINED_GLASS_PANE => DyeColor::GRAY,
Ids::HARD_GREEN_STAINED_GLASS_PANE => DyeColor::GREEN,
Ids::HARD_LIGHT_BLUE_STAINED_GLASS_PANE => DyeColor::LIGHT_BLUE,
Ids::HARD_LIGHT_GRAY_STAINED_GLASS_PANE => DyeColor::LIGHT_GRAY,
Ids::HARD_LIME_STAINED_GLASS_PANE => DyeColor::LIME,
Ids::HARD_MAGENTA_STAINED_GLASS_PANE => DyeColor::MAGENTA,
Ids::HARD_ORANGE_STAINED_GLASS_PANE => DyeColor::ORANGE,
Ids::HARD_PINK_STAINED_GLASS_PANE => DyeColor::PINK,
Ids::HARD_PURPLE_STAINED_GLASS_PANE => DyeColor::PURPLE,
Ids::HARD_RED_STAINED_GLASS_PANE => DyeColor::RED,
Ids::HARD_WHITE_STAINED_GLASS_PANE => DyeColor::WHITE,
Ids::HARD_YELLOW_STAINED_GLASS_PANE => DyeColor::YELLOW,
] as $id => $color){
$this->map($id, fn(Reader $in) => Blocks::STAINED_HARDENED_GLASS_PANE()->setColor($color));
}
foreach([ foreach([
Ids::BLACK_GLAZED_TERRACOTTA => DyeColor::BLACK, Ids::BLACK_GLAZED_TERRACOTTA => DyeColor::BLACK,
@ -273,110 +245,38 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{
); );
} }
foreach([ $this->mapFlattenedEnum(
Ids::BLACK_WOOL => DyeColor::BLACK, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
Ids::BLUE_WOOL => DyeColor::BLUE, "minecraft:",
Ids::BROWN_WOOL => DyeColor::BROWN, "_wool",
Ids::CYAN_WOOL => DyeColor::CYAN, fn(DyeColor $color) => Blocks::WOOL()->setColor($color)
Ids::GRAY_WOOL => DyeColor::GRAY, );
Ids::GREEN_WOOL => DyeColor::GREEN, $this->mapFlattenedEnum(
Ids::LIGHT_BLUE_WOOL => DyeColor::LIGHT_BLUE, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
Ids::LIGHT_GRAY_WOOL => DyeColor::LIGHT_GRAY, "minecraft:",
Ids::LIME_WOOL => DyeColor::LIME, "_carpet",
Ids::MAGENTA_WOOL => DyeColor::MAGENTA, fn(DyeColor $color) => Blocks::CARPET()->setColor($color)
Ids::ORANGE_WOOL => DyeColor::ORANGE, );
Ids::PINK_WOOL => DyeColor::PINK,
Ids::PURPLE_WOOL => DyeColor::PURPLE,
Ids::RED_WOOL => DyeColor::RED,
Ids::WHITE_WOOL => DyeColor::WHITE,
Ids::YELLOW_WOOL => DyeColor::YELLOW,
] as $id => $color){
$this->mapSimple($id, fn() => Blocks::WOOL()->setColor($color));
}
foreach([ $this->mapFlattenedEnum(
Ids::BLACK_CARPET => DyeColor::BLACK, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
Ids::BLUE_CARPET => DyeColor::BLUE, "minecraft:",
Ids::BROWN_CARPET => DyeColor::BROWN, "_shulker_box",
Ids::CYAN_CARPET => DyeColor::CYAN, fn(DyeColor $color) => Blocks::DYED_SHULKER_BOX()->setColor($color)
Ids::GRAY_CARPET => DyeColor::GRAY, );
Ids::GREEN_CARPET => DyeColor::GREEN,
Ids::LIGHT_BLUE_CARPET => DyeColor::LIGHT_BLUE,
Ids::LIGHT_GRAY_CARPET => DyeColor::LIGHT_GRAY,
Ids::LIME_CARPET => DyeColor::LIME,
Ids::MAGENTA_CARPET => DyeColor::MAGENTA,
Ids::ORANGE_CARPET => DyeColor::ORANGE,
Ids::PINK_CARPET => DyeColor::PINK,
Ids::PURPLE_CARPET => DyeColor::PURPLE,
Ids::RED_CARPET => DyeColor::RED,
Ids::WHITE_CARPET => DyeColor::WHITE,
Ids::YELLOW_CARPET => DyeColor::YELLOW,
] as $id => $color){
$this->mapSimple($id, fn() => Blocks::CARPET()->setColor($color));
}
foreach([ $this->mapFlattenedEnum(
Ids::BLACK_SHULKER_BOX => DyeColor::BLACK, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
Ids::BLUE_SHULKER_BOX => DyeColor::BLUE, "minecraft:",
Ids::BROWN_SHULKER_BOX => DyeColor::BROWN, "_concrete",
Ids::CYAN_SHULKER_BOX => DyeColor::CYAN, fn(DyeColor $color) => Blocks::CONCRETE()->setColor($color)
Ids::GRAY_SHULKER_BOX => DyeColor::GRAY, );
Ids::GREEN_SHULKER_BOX => DyeColor::GREEN, $this->mapFlattenedEnum(
Ids::LIGHT_BLUE_SHULKER_BOX => DyeColor::LIGHT_BLUE, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
Ids::LIGHT_GRAY_SHULKER_BOX => DyeColor::LIGHT_GRAY, "minecraft:",
Ids::LIME_SHULKER_BOX => DyeColor::LIME, "_concrete_powder",
Ids::MAGENTA_SHULKER_BOX => DyeColor::MAGENTA, fn(DyeColor $color) => Blocks::CONCRETE_POWDER()->setColor($color)
Ids::ORANGE_SHULKER_BOX => DyeColor::ORANGE, );
Ids::PINK_SHULKER_BOX => DyeColor::PINK,
Ids::PURPLE_SHULKER_BOX => DyeColor::PURPLE,
Ids::RED_SHULKER_BOX => DyeColor::RED,
Ids::WHITE_SHULKER_BOX => DyeColor::WHITE,
Ids::YELLOW_SHULKER_BOX => DyeColor::YELLOW,
] as $id => $color){
$this->mapSimple($id, fn() => Blocks::DYED_SHULKER_BOX()->setColor($color));
}
foreach([
Ids::BLACK_CONCRETE => DyeColor::BLACK,
Ids::BLUE_CONCRETE => DyeColor::BLUE,
Ids::BROWN_CONCRETE => DyeColor::BROWN,
Ids::CYAN_CONCRETE => DyeColor::CYAN,
Ids::GRAY_CONCRETE => DyeColor::GRAY,
Ids::GREEN_CONCRETE => DyeColor::GREEN,
Ids::LIGHT_BLUE_CONCRETE => DyeColor::LIGHT_BLUE,
Ids::LIGHT_GRAY_CONCRETE => DyeColor::LIGHT_GRAY,
Ids::LIME_CONCRETE => DyeColor::LIME,
Ids::MAGENTA_CONCRETE => DyeColor::MAGENTA,
Ids::ORANGE_CONCRETE => DyeColor::ORANGE,
Ids::PINK_CONCRETE => DyeColor::PINK,
Ids::PURPLE_CONCRETE => DyeColor::PURPLE,
Ids::RED_CONCRETE => DyeColor::RED,
Ids::WHITE_CONCRETE => DyeColor::WHITE,
Ids::YELLOW_CONCRETE => DyeColor::YELLOW,
] as $id => $color){
$this->mapSimple($id, fn() => Blocks::CONCRETE()->setColor($color));
}
foreach([
Ids::BLACK_CONCRETE_POWDER => DyeColor::BLACK,
Ids::BLUE_CONCRETE_POWDER => DyeColor::BLUE,
Ids::BROWN_CONCRETE_POWDER => DyeColor::BROWN,
Ids::CYAN_CONCRETE_POWDER => DyeColor::CYAN,
Ids::GRAY_CONCRETE_POWDER => DyeColor::GRAY,
Ids::GREEN_CONCRETE_POWDER => DyeColor::GREEN,
Ids::LIGHT_BLUE_CONCRETE_POWDER => DyeColor::LIGHT_BLUE,
Ids::LIGHT_GRAY_CONCRETE_POWDER => DyeColor::LIGHT_GRAY,
Ids::LIME_CONCRETE_POWDER => DyeColor::LIME,
Ids::MAGENTA_CONCRETE_POWDER => DyeColor::MAGENTA,
Ids::ORANGE_CONCRETE_POWDER => DyeColor::ORANGE,
Ids::PINK_CONCRETE_POWDER => DyeColor::PINK,
Ids::PURPLE_CONCRETE_POWDER => DyeColor::PURPLE,
Ids::RED_CONCRETE_POWDER => DyeColor::RED,
Ids::WHITE_CONCRETE_POWDER => DyeColor::WHITE,
Ids::YELLOW_CONCRETE_POWDER => DyeColor::YELLOW,
] as $id => $color){
$this->mapSimple($id, fn() => Blocks::CONCRETE_POWDER()->setColor($color));
}
foreach([ foreach([
Ids::BLACK_TERRACOTTA => DyeColor::BLACK, Ids::BLACK_TERRACOTTA => DyeColor::BLACK,
@ -399,47 +299,19 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{
$this->mapSimple($id, fn() => Blocks::STAINED_CLAY()->setColor($color)); $this->mapSimple($id, fn() => Blocks::STAINED_CLAY()->setColor($color));
} }
foreach([ $this->mapFlattenedEnum(
Ids::BLACK_STAINED_GLASS => DyeColor::BLACK, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
Ids::BLUE_STAINED_GLASS => DyeColor::BLUE, "minecraft:",
Ids::BROWN_STAINED_GLASS => DyeColor::BROWN, "_stained_glass",
Ids::CYAN_STAINED_GLASS => DyeColor::CYAN, fn(DyeColor $color) => Blocks::STAINED_GLASS()->setColor($color)
Ids::GRAY_STAINED_GLASS => DyeColor::GRAY, );
Ids::GREEN_STAINED_GLASS => DyeColor::GREEN,
Ids::LIGHT_BLUE_STAINED_GLASS => DyeColor::LIGHT_BLUE,
Ids::LIGHT_GRAY_STAINED_GLASS => DyeColor::LIGHT_GRAY,
Ids::LIME_STAINED_GLASS => DyeColor::LIME,
Ids::MAGENTA_STAINED_GLASS => DyeColor::MAGENTA,
Ids::ORANGE_STAINED_GLASS => DyeColor::ORANGE,
Ids::PINK_STAINED_GLASS => DyeColor::PINK,
Ids::PURPLE_STAINED_GLASS => DyeColor::PURPLE,
Ids::RED_STAINED_GLASS => DyeColor::RED,
Ids::WHITE_STAINED_GLASS => DyeColor::WHITE,
Ids::YELLOW_STAINED_GLASS => DyeColor::YELLOW,
] as $id => $color){
$this->mapSimple($id, fn() => Blocks::STAINED_GLASS()->setColor($color));
}
foreach([ $this->mapFlattenedEnum(
Ids::BLACK_STAINED_GLASS_PANE => DyeColor::BLACK, ValueMappings::getInstance()->getEnumMap(DyeColor::class),
Ids::BLUE_STAINED_GLASS_PANE => DyeColor::BLUE, "minecraft:",
Ids::BROWN_STAINED_GLASS_PANE => DyeColor::BROWN, "_stained_glass_pane",
Ids::CYAN_STAINED_GLASS_PANE => DyeColor::CYAN, fn(DyeColor $color) => Blocks::STAINED_GLASS_PANE()->setColor($color)
Ids::GRAY_STAINED_GLASS_PANE => DyeColor::GRAY, );
Ids::GREEN_STAINED_GLASS_PANE => DyeColor::GREEN,
Ids::LIGHT_BLUE_STAINED_GLASS_PANE => DyeColor::LIGHT_BLUE,
Ids::LIGHT_GRAY_STAINED_GLASS_PANE => DyeColor::LIGHT_GRAY,
Ids::LIME_STAINED_GLASS_PANE => DyeColor::LIME,
Ids::MAGENTA_STAINED_GLASS_PANE => DyeColor::MAGENTA,
Ids::ORANGE_STAINED_GLASS_PANE => DyeColor::ORANGE,
Ids::PINK_STAINED_GLASS_PANE => DyeColor::PINK,
Ids::PURPLE_STAINED_GLASS_PANE => DyeColor::PURPLE,
Ids::RED_STAINED_GLASS_PANE => DyeColor::RED,
Ids::WHITE_STAINED_GLASS_PANE => DyeColor::WHITE,
Ids::YELLOW_STAINED_GLASS_PANE => DyeColor::YELLOW,
] as $id => $color){
$this->mapSimple($id, fn() => Blocks::STAINED_GLASS_PANE()->setColor($color));
}
} }
private function registerFlatCoralDeserializers() : void{ private function registerFlatCoralDeserializers() : void{

View File

@ -0,0 +1,78 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\data\bedrock\block\convert;
use pocketmine\data\bedrock\block\BlockStateDeserializeException;
use function spl_object_id;
/**
* @phpstan-template TEnum of \UnitEnum
*/
class StringEnumMap{
/**
* @var string[]
* @phpstan-var array<int, string>
*/
private array $enumToValue = [];
/**
* @var \UnitEnum[]
* @phpstan-var array<string, TEnum>
*/
private array $valueToEnum = [];
/**
* @phpstan-param class-string<TEnum> $class
* @phpstan-param \Closure(TEnum) : string $mapper
*/
public function __construct(
private string $class,
\Closure $mapper
){
foreach($class::cases() as $case){
$string = $mapper($case);
$this->valueToEnum[$string] = $case;
$this->enumToValue[spl_object_id($case)] = $string;
}
}
/**
* @phpstan-param TEnum $enum
*/
public function enumToValue(\UnitEnum $enum) : string{
return $this->enumToValue[spl_object_id($enum)];
}
public function valueToEnum(string $string) : ?\UnitEnum{
return $this->valueToEnum[$string] ?? throw new BlockStateDeserializeException("No $this->class enum mapping for \"$string\"");
}
/**
* @return \UnitEnum[]
* @phpstan-return array<string, TEnum>
*/
public function getValueToEnum() : array{
return $this->valueToEnum;
}
}

View File

@ -0,0 +1,83 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\data\bedrock\block\convert;
use pocketmine\block\utils\DyeColor;
use pocketmine\utils\SingletonTrait;
final class ValueMappings{
use SingletonTrait; //???
/**
* @var StringEnumMap[]
* @phpstan-var array<class-string<covariant \UnitEnum>, StringEnumMap<covariant \UnitEnum>>
*/
private array $enumMappings = [];
public function __construct(){
$this->addEnum(DyeColor::class, fn(DyeColor $case) => match ($case) {
DyeColor::BLACK => "black",
DyeColor::BLUE => "blue",
DyeColor::BROWN => "brown",
DyeColor::CYAN => "cyan",
DyeColor::GRAY => "gray",
DyeColor::GREEN => "green",
DyeColor::LIGHT_BLUE => "light_blue",
DyeColor::LIGHT_GRAY => "light_gray",
DyeColor::LIME => "lime",
DyeColor::MAGENTA => "magenta",
DyeColor::ORANGE => "orange",
DyeColor::PINK => "pink",
DyeColor::PURPLE => "purple",
DyeColor::RED => "red",
DyeColor::WHITE => "white",
DyeColor::YELLOW => "yellow"
});
}
/**
* @phpstan-template TEnum of \UnitEnum
* @phpstan-param class-string<TEnum> $class
* @phpstan-param \Closure(TEnum): string $mapper
*/
private function addEnum(string $class, \Closure $mapper) : void{
$this->enumMappings[$class] = new StringEnumMap($class, $mapper);
}
/**
* @phpstan-template TEnum of \UnitEnum
* @phpstan-param class-string<TEnum> $class
* @phpstan-return StringEnumMap<TEnum>
*/
public function getEnumMap(string $class) : StringEnumMap{
if(!isset($this->enumMappings[$class])){
throw new \InvalidArgumentException("No enum mapping found for class: $class");
}
/**
* @phpstan-var StringEnumMap<TEnum> $map
*/
$map = $this->enumMappings[$class];
return $map;
}
}