Skip to content

Commit

Permalink
further work on xml location persistence
Browse files Browse the repository at this point in the history
  • Loading branch information
dcarbone committed May 3, 2024
1 parent d6a14d7 commit c932ae4
Show file tree
Hide file tree
Showing 18 changed files with 254 additions and 499 deletions.
2 changes: 1 addition & 1 deletion files/constants.php
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@
const PHPFHIR_ENUM_CONFIG_KEY = 'PHPFHIRConfigKeyEnum';
const PHPFHIR_ENUM_TYPE = 'PHPFHIRTypeEnum';
const PHPFHIR_ENUM_API_FORMAT = 'PHPFHIRApiFormatEnum';
const PHPFHIR_ENUM_XML_SERIALIZE_LOCATION_ENUM = 'PHPFHIRXmlSerializeLocationEnum';
const PHPFHIR_ENUM_XML_LOCATION_ENUM = 'PHPFHIRXmlLocationEnum';

// validation constants
const PHPFHIR_VALIDATION_ENUM = 'enum';
Expand Down
2 changes: 1 addition & 1 deletion src/Definition/TypeImports.php
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ private function buildImports(): void
$this->addImport(PHPFHIR_CLASSNAME_CONFIG, $configNS);
$this->addImport(PHPFHIR_CLASSNAME_XML_WRITER, $configNS);
$this->addImport(PHPFHIR_ENUM_CONFIG_KEY, $configNS);
$this->addImport(PHPFHIR_ENUM_XML_SERIALIZE_LOCATION_ENUM, $configNS);
$this->addImport(PHPFHIR_ENUM_XML_LOCATION_ENUM, $configNS);
}

// if this type is in a nested namespace, there are a few base interfaces, classes, and traits
Expand Down
4 changes: 2 additions & 2 deletions template/core/classes/class_autoloader.php
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,8 @@
if (!enum_exists('<?php echo $config->getFullyQualifiedName(true, PHPFHIR_ENUM_API_FORMAT); ?>', false)) {
require __DIR__ . DIRECTORY_SEPARATOR . '<?php echo PHPFHIR_ENUM_API_FORMAT; ?>.php';
}
if (!enum_exists('<?php echo $config->getFullyQualifiedName(true, PHPFHIR_ENUM_XML_SERIALIZE_LOCATION_ENUM); ?>', false)) {
require __DIR__ . DIRECTORY_SEPARATOR . '<?php echo PHPFHIR_ENUM_XML_SERIALIZE_LOCATION_ENUM; ?>.php';
if (!enum_exists('<?php echo $config->getFullyQualifiedName(true, PHPFHIR_ENUM_XML_LOCATION_ENUM); ?>', false)) {
require __DIR__ . DIRECTORY_SEPARATOR . '<?php echo PHPFHIR_ENUM_XML_LOCATION_ENUM; ?>.php';
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,13 @@

echo "\n\n"; ?>
/**
* Enum <?php echo PHPFHIR_ENUM_XML_SERIALIZE_LOCATION_ENUM; if ('' !== $namespace) : ?>
* Enum <?php echo PHPFHIR_ENUM_XML_LOCATION_ENUM; if ('' !== $namespace) : ?>

* @package \<?php echo $namespace; ?>
<?php endif; ?>

*/
enum <?php echo PHPFHIR_ENUM_XML_SERIALIZE_LOCATION_ENUM; ?> : string
enum <?php echo PHPFHIR_ENUM_XML_LOCATION_ENUM; ?> : string
{
case ATTRIBUTE = 'attribute';
case ELEMENT = 'element';
Expand Down
8 changes: 2 additions & 6 deletions template/types/class_default.php
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,6 @@
);
}

echo "\n";

echo require_with(
PHPFHIR_TEMPLATE_TYPES_METHODS_DIR . DIRECTORY_SEPARATOR . 'common.php',
[
Expand All @@ -153,8 +151,6 @@
}

if (0 < count($localProperties)) {
echo "\n";

echo require_with(
PHPFHIR_TEMPLATE_TYPES_PROPERTIES_DIR . DIRECTORY_SEPARATOR . 'methods.php',
[
Expand All @@ -163,9 +159,9 @@
'properties' => $localProperties,
]
);

echo "\n";

echo require_with(
PHPFHIR_TEMPLATE_TYPES_VALIDATION_DIR . DIRECTORY_SEPARATOR . 'methods.php',
[
Expand Down
1 change: 0 additions & 1 deletion template/types/methods/contained_type.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,5 @@ public function _getResourceType(): string
{
return static::FHIR_TYPE_NAME;
}

<?php
return ob_get_clean();
232 changes: 166 additions & 66 deletions template/types/properties/methods/default.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
*/

use DCarbone\PHPFHIR\Enum\TypeKind;
use DCarbone\PHPFHIR\Utilities\DocumentationUtils;
use DCarbone\PHPFHIR\Utilities\TypeHintUtils;

/** @var \DCarbone\PHPFHIR\Definition\Type $type */
/** @var \DCarbone\PHPFHIR\Config\VersionConfig $config */
Expand All @@ -25,80 +27,178 @@
$isPrimitiveType = $type->getKind()->isOneOf(TypeKind::PRIMITIVE, TypeKind::LIST);

ob_start();
foreach ($properties as $property) {
foreach ($properties as $property) :
if ($property->isOverloaded()) {
continue;
}
if ($isPrimitiveType && $property->isValueProperty()) {
echo require_with(
__DIR__ . DIRECTORY_SEPARATOR . 'default' . DIRECTORY_SEPARATOR . 'getter_primitive_value.php',
[
'config' => $config,
'type' => $type,
'property' => $property,
]
);
echo require_with(
__DIR__ . DIRECTORY_SEPARATOR . 'default' . DIRECTORY_SEPARATOR . 'getter_primitive_value.php',
[
'config' => $config,
'type' => $type,
'property' => $property,
]
);
continue;
}

$documentation = DocumentationUtils::compilePropertyDocumentation($property, 5, true);

$propertyName = $property->getName();
$isCollection = $property->isCollection();
$propertyType = $property->getValueFHIRType();
$propertyTypeClassName = $propertyType->getClassName();
$propertyTypeKind = $propertyType->getKind();
$requireArgs = [
'config' => $config,
'type' => $type,
'property' => $property,
];

echo require_with(
__DIR__ . DIRECTORY_SEPARATOR . 'default' . DIRECTORY_SEPARATOR . 'getter_default.php',
[
'config' => $config,
'property' => $property,
]
);

echo "\n";

if ($propertyTypeKind->isOneOf(TypeKind::PRIMITIVE, TypeKind::LIST, TypeKind::PRIMITIVE_CONTAINER)) {
echo require_with(
__DIR__ . DIRECTORY_SEPARATOR . 'default' . DIRECTORY_SEPARATOR . 'setter_primitive.php',
$requireArgs
);
} else if ($propertyTypeKind->isOneOf(TypeKind::RESOURCE_CONTAINER, TypeKind::RESOURCE_INLINE)) {
echo require_with(
__DIR__ . DIRECTORY_SEPARATOR . 'default' . DIRECTORY_SEPARATOR . 'setter_contained_resource.php',
$requireArgs
);
} else {
echo require_with(
__DIR__ . DIRECTORY_SEPARATOR . 'default' . DIRECTORY_SEPARATOR . 'setter_default.php',
$requireArgs
);
?>

/**<?php if ('' !== $documentation) : ?>

<?php echo $documentation; ?>
*<?php endif; ?>

* @return <?php echo TypeHintUtils::propertyGetterTypeDoc($config, $property, true); ?>

*/
public function get<?php echo ucfirst($propertyName); ?>(): <?php echo TypeHintUtils::propertyTypeHint($config, $property, true); ?>

{
return $this-><?php echo $propertyName; ?>;
}
if ($property->isCollection()) {
echo "\n";
if ($propertyTypeKind->isOneOf(TypeKind::RESOURCE_CONTAINER, TypeKind::RESOURCE_INLINE)) {
echo require_with(
__DIR__ . DIRECTORY_SEPARATOR . 'default' . DIRECTORY_SEPARATOR . 'setter_contained_resource_collection.php',
$requireArgs
);
} else {
echo require_with(
__DIR__ . DIRECTORY_SEPARATOR . 'default' . DIRECTORY_SEPARATOR . 'setter_collection.php',
$requireArgs
);
<?php if ($propertyType->hasPrimitiveParent() || $propertyTypeKind->isOneOf(TypeKind::PRIMITIVE_CONTAINER, TypeKind::PRIMITIVE, TypeKind::LIST)) : ?>

/**<?php if ('' !== $documentation) : ?>

<?php echo $documentation; ?>
*<?php endif; ?>

* @param <?php echo TypeHintUtils::propertySetterTypeDoc($config, $property, false); ?> $<?php echo $propertyName; ?>

* @param <?php echo $config->getFullyQualifiedName(true, PHPFHIR_ENUM_XML_LOCATION_ENUM); ?> $xmlLocation
* @return static
*/
public function <?php echo $property->getSetterName(); ?>(<?php echo TypeHintUtils::propertySetterTypeHint($config, $property, true); ?> $<?php echo $property; ?> = null, <?php echo PHPFHIR_ENUM_XML_LOCATION_ENUM; ?> $xmlLocation = <?php echo PHPFHIR_ENUM_XML_LOCATION_ENUM; ?>::ATTRIBUTE): self
{
if (null !== $<?php echo $propertyName; ?> && !($<?php echo $propertyName; ?> instanceof <?php echo $propertyTypeClassName; ?>)) {
$<?php echo $propertyName; ?> = new <?php echo $propertyTypeClassName; ?>($<?php echo $propertyName; ?>);
}
$this->_trackValue<?php if ($isCollection) : ?>Added(<?php else : ?>Set($this-><?php echo $propertyName; ?>, $<?php echo $propertyName; endif; ?>);
if (!isset($this->_primitiveXmlLocations[self::<?php echo $property->getFieldConstantName(); ?>])) {
$this->_primitiveXmlLocations[self::<?php echo $property->getFieldConstantName(); ?>] = [];
}
$this->_primitiveXmlLocations[self::<?php echo $property->getFieldConstantName(); ?>]<?php if ($isCollection) : ?>[]<?php else : ?>[0]<?php endif; ?> = $xmlLocation;
$this-><?php echo $propertyName; ?><?php echo $isCollection ? '[]' : ''; ?> = $<?php echo $propertyName; ?>;
return $this;
}
<?php if ($isCollection) : ?>

/**<?php if ('' !== $documentation) : ?>

<?php echo $documentation; ?>
*<?php endif; ?>

echo "\n";
* @param <?php echo $propertyType->getFullyQualifiedClassName(true);?>[] $<?php echo $propertyName; ?>

* @param <?php echo $config->getFullyQualifiedName(true, PHPFHIR_ENUM_XML_LOCATION_ENUM); ?> $xmlLocation
* @return static
*/
public function set<?php echo ucfirst($propertyName); ?>(array $<?php echo $propertyName; ?> = [], <?php echo PHPFHIR_ENUM_XML_LOCATION_ENUM; ?> $xmlLocation = <?php echo PHPFHIR_ENUM_XML_LOCATION_ENUM; ?>::ATTRIBUTE): self
{
unset($this->_primitiveXmlLocations[self::<?php echo $property->getFieldConstantName(); ?>]);
if ([] !== $this-><?php echo $propertyName; ?>) {
$this->_trackValuesRemoved(count($this-><?php echo $propertyName; ?>));
$this-><?php echo $propertyName; ?> = [];
}
if ([] === $<?php echo $propertyName; ?>) {
return $this;
}
foreach($<?php echo $propertyName; ?> as $v) {
if ($v instanceof <?php echo $propertyTypeClassName; ?>) {
$this->add<?php echo ucfirst($propertyName); ?>($v, $xmlLocation);
} else {
$this->add<?php echo ucfirst($propertyName); ?>(new <?php echo $propertyTypeClassName; ?>($v), $xmlLocation);
}
}
return $this;
}
<?php endif;
elseif ($propertyTypeKind->isContainer($config->getVersion()->getName())) : ?>

/**<?php if ('' !== $documentation) : ?>

<?php echo $documentation; ?>
*<?php endif; ?>

* @param null|<?php echo $config->getFullyQualifiedName(true) . '\\' . PHPFHIR_INTERFACE_CONTAINED_TYPE; ?> $<?php echo $propertyName; ?>

* @return static
*/
public function <?php echo $property->getSetterName() ?>(null|<?php echo PHPFHIR_INTERFACE_CONTAINED_TYPE; ?> $<?php echo $propertyName; ?> = null): self
{
<?php if ($isCollection) : ?>$this->_trackValueAdded(<?php else : ?>$this->_trackValueSet($this-><?php echo $propertyName; ?>, $<?php echo $propertyName; endif; ?>);
$this-><?php echo $propertyName; ?><?php echo $isCollection ? '[]' : ''; ?> = $<?php echo $propertyName; ?>;
return $this;
}
<?php if ($isCollection) : ?>

/**<?php if ('' !== $documentation) : ?>

<?php echo $documentation; ?>
*<?php endif; ?>

* @param <?php echo $config->getFullyQualifiedName(true) . '\\' . PHPFHIR_INTERFACE_CONTAINED_TYPE; ?>[] $<?php echo $propertyName; ?>

* @return static
*/
public function set<?php echo ucfirst($propertyName); ?>(array $<?php echo $propertyName; ?> = []): self
{
if ([] !== $this-><?php echo $propertyName; ?>) {
$this->_trackValuesRemoved(count($this-><?php echo $propertyName; ?>));
$this-><?php echo $propertyName; ?> = [];
}
if ([] === $<?php echo $propertyName; ?>) {
return $this;
}
foreach($<?php echo $propertyName; ?> as $v) {
if (is_object($v)) {
if ($v instanceof <?php echo PHPFHIR_INTERFACE_CONTAINED_TYPE; ?>) {
$this-><?php echo $property->getSetterName(); ?>($v);
} else {
throw new \InvalidArgumentException(sprintf(
'<?php echo $type->getClassName(); ?> - Field "<?php echo $propertyName; ?>" must be an array of objects implementing <?php echo PHPFHIR_INTERFACE_CONTAINED_TYPE; ?>, object of type %s seen',
get_class($v)
));
}
} elseif (is_array($v)) {
$typeClass = PHPFHIRTypeMap::getContainedTypeFromArray($v);
if (null === $typeClass) {
throw new \InvalidArgumentException(sprintf(
'<?php echo $type->getClassName(); ?> - Unable to determine class for field "<?php echo $propertyName; ?>" from value: %s',
json_encode($v)
));
}
$this-><?php echo $property->getSetterName(); ?>(new $typeClass($v));
} else {
throw new \InvalidArgumentException(sprintf(
'<?php echo $type->getClassName(); ?> - Unable to determine class for field "<?php echo $propertyName; ?>" from value: %s',
json_encode($v)
));
}
}
return $this;
}
<?php endif;
else : ?>

/**<?php if ('' !== $documentation) : ?>

<?php echo $documentation; ?>
*<?php endif; ?>

* @param <?php echo TypeHintUtils::propertySetterTypeDoc($config, $property, false); ?> $<?php echo $propertyName; ?>

* @return static
*/
public function <?php echo $property->getSetterName(); ?>(<?php echo TypeHintUtils::typeSetterTypeHint($config, $propertyType, true); ?> $<?php echo $propertyName; ?> = null): self
{
if (null === $<?php echo $propertyName; ?>) {
$<?php echo $propertyName; ?> = new <?php echo $propertyTypeClassName; ?>();
}
$this->_trackValue<?php if ($isCollection) : ?>Added(<?php else : ?>Set($this-><?php echo $propertyName; ?>, $<?php echo $propertyName; endif; ?>);
$this-><?php echo $propertyName; ?><?php echo $isCollection ? '[]' : ''; ?> = $<?php echo $propertyName; ?>;
return $this;
}
<?php
endif;
endforeach;

}
return substr(ob_get_clean(), 0, -1); // trim off final \n
return ob_get_clean();
43 changes: 0 additions & 43 deletions template/types/properties/methods/default/getter_default.php

This file was deleted.

Loading

0 comments on commit c932ae4

Please sign in to comment.