diff options
Diffstat (limited to 'library/Director/PlainObjectRenderer.php')
-rw-r--r-- | library/Director/PlainObjectRenderer.php | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/library/Director/PlainObjectRenderer.php b/library/Director/PlainObjectRenderer.php new file mode 100644 index 0000000..4dadf4f --- /dev/null +++ b/library/Director/PlainObjectRenderer.php @@ -0,0 +1,130 @@ +<?php + +namespace Icinga\Module\Director; + +class PlainObjectRenderer +{ + const INDENTATION = ' '; + + public static function render($object) + { + return self::renderObject($object); + } + + protected static function renderBoolean($value) + { + return $value ? 'true' : 'false'; + } + + protected static function renderInteger($value) + { + return (string) $value; + } + + protected static function renderFloat($value) + { + // Render .0000 floats as integers, mainly because of some JSON + // implementations: + if ((string) (int) $value === (string) $value) { + return static::renderInteger((int) $value); + } else { + return sprintf('%F', $value); + } + } + + protected static function renderNull() + { + return 'null'; + } + + protected static function renderString($value) + { + return '"' . addslashes($value) . '"'; + } + + protected static function renderArray($array, $prefix = '') + { + if (empty($array)) { + return '[]'; + } + + $vals = array(); + + foreach ($array as $val) { + $vals[] = $prefix + . self::INDENTATION + . self::renderObject($val, $prefix . self::INDENTATION); + } + return "[\n" . implode(",\n", $vals) . "\n$prefix]"; + } + + protected static function renderHash($hash, $prefix = '') + { + $vals = array(); + $hash = (array) $hash; + if (empty($hash)) { + return '{}'; + } + + if (count($hash) === 1) { + $current = self::renderObject(current($hash), $prefix . self::INDENTATION); + if (strlen($current) < 62) { + return sprintf( + '{ %s: %s }', + key($hash), + $current + ); + } + } + + ksort($hash); + foreach ($hash as $key => $val) { + $vals[] = $prefix + . self::INDENTATION + . $key + . ': ' + . self::renderObject($val, $prefix . self::INDENTATION); + } + return "{\n" . implode(",\n", $vals) . "\n$prefix}"; + } + + protected static function renderObject($object, $prefix = '') + { + if (is_null($object)) { + return self::renderNull(); + } elseif (is_bool($object)) { + return self::renderBoolean($object); + } elseif (is_integer($object)) { + return self::renderInteger($object); + } elseif (is_float($object)) { + return self::renderFloat($object); + } elseif (is_object($object) || static::isAssocArray($object)) { + return self::renderHash($object, $prefix); + } elseif (is_array($object)) { + return self::renderArray($object, $prefix); + } elseif (is_string($object)) { + return self::renderString($object); + } else { + return '(UNKNOWN TYPE) ' . var_export($object, 1); + } + } + + /** + * Check if an array contains assoc keys + * + * @from https://stackoverflow.com/questions/173400/how-to-check-if-php-array-is-associative-or-sequential + * @param $arr + * @return bool + */ + protected static function isAssocArray($arr) + { + if (! is_array($arr)) { + return false; + } + if (array() === $arr) { + return false; + } + + return array_keys($arr) !== range(0, count($arr) - 1); + } +} |