1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
<?php
namespace OneOfZero\Json\ContractResolvers;
use OneOfZero\Json\Exceptions\NotSupportedException;
use OneOfZero\Json\Mappers\Contract\ContractMemberMapper;
use OneOfZero\Json\Nodes\MemberNode;
use Stringy\Stringy;
use Stringy\Stringy as S;
class PropertyNameContractResolver extends AbstractContractResolver
{
const PASCAL_CASE = 'PASCAL_CASE';
const CAMEL_CASE = 'CAMEL_CASE';
const SNAKE_CASE = 'SNAKE_CASE';
const HYPHEN_CASE = 'HYPHEN_CASE';
private $serializedStyle;
private $deserializedStyle;
public function __construct($deserializedStyle = self::CAMEL_CASE, $serializedStyle = self::PASCAL_CASE)
{
if (!class_exists(S::class))
{
throw new NotSupportedException('PropertyNameContractResolver requires the package "danielstjules/stringy"');
}
$this->deserializedStyle = $deserializedStyle;
$this->serializedStyle = $serializedStyle;
}
public function createSerializingMemberContract(MemberNode $member)
{
$name = $member->getMapper()->getDeserializedName();
return new ContractMemberMapper(
$this->applyStyle(S::create($name), $this->deserializedStyle)->__toString(),
$this->applyStyle(S::create($name), $this->serializedStyle)->__toString()
);
}
public function createDeserializingMemberContract(MemberNode $member)
{
$name = $member->getMapper()->getSerializedName();
return new ContractMemberMapper(
$this->applyStyle(S::create($name), $this->deserializedStyle)->__toString(),
$this->applyStyle(S::create($name), $this->serializedStyle)->__toString()
);
}
private function applyStyle(Stringy $name, $style)
{
switch ($style)
{
case self::PASCAL_CASE: return $name->upperCamelize();
case self::CAMEL_CASE: return $name->camelize();
case self::SNAKE_CASE: return $name->underscored();
case self::HYPHEN_CASE: return $name->dasherize();
}
throw new NotSupportedException("Style \"$style\" is not supported");
}
}