1c3437056SNickeau<?php 2c3437056SNickeau 3c3437056SNickeau 4c3437056SNickeaunamespace ComboStrap; 5c3437056SNickeau 6c3437056SNickeau 7c3437056SNickeauclass DataType 8c3437056SNickeau{ 9c3437056SNickeau 10c3437056SNickeau /** 11c3437056SNickeau * The property name when the type value is persisted 12c3437056SNickeau */ 13c3437056SNickeau public const PROPERTY_NAME = "type"; 14c3437056SNickeau 15c3437056SNickeau 16c3437056SNickeau /** 17c3437056SNickeau * An object with several children metadata 18c3437056SNickeau * An entity 19c3437056SNickeau * A group of metadata 20c3437056SNickeau */ 21c3437056SNickeau public const TABULAR_TYPE_VALUE = "tabular"; 22c3437056SNickeau /** 23c3437056SNickeau * Text with carriage return 24c3437056SNickeau */ 25c3437056SNickeau public const PARAGRAPH_TYPE_VALUE = "paragraph"; 26c3437056SNickeau /** 27c3437056SNickeau * True/False 28c3437056SNickeau */ 29c3437056SNickeau public const BOOLEAN_TYPE_VALUE = "boolean"; 30c3437056SNickeau 31c3437056SNickeau /** 32c3437056SNickeau * A couple of words without any carriage return 33c3437056SNickeau */ 34c3437056SNickeau public const TEXT_TYPE_VALUE = "text"; 3504fd306cSNickeau 36c3437056SNickeau /** 37c3437056SNickeau * Date Time 38c3437056SNickeau */ 39c3437056SNickeau public const DATETIME_TYPE_VALUE = "datetime"; 40c3437056SNickeau /** 41c3437056SNickeau * A string but in Json 42c3437056SNickeau */ 43c3437056SNickeau public const JSON_TYPE_VALUE = "json"; 44c3437056SNickeau 45c3437056SNickeau /** 46c3437056SNickeau * Integer 47c3437056SNickeau */ 48c3437056SNickeau public const INTEGER_TYPE_VALUE = "integer"; 49c3437056SNickeau 5004fd306cSNickeau /** 5104fd306cSNickeau * Array of array of array 5204fd306cSNickeau */ 5304fd306cSNickeau const ARRAY_VALUE = "array"; 54c3437056SNickeau 55c3437056SNickeau /** 56c3437056SNickeau * The constant value 57c3437056SNickeau */ 58c3437056SNickeau public const TYPES = [ 59c3437056SNickeau DataType::TEXT_TYPE_VALUE, 60c3437056SNickeau DataType::TABULAR_TYPE_VALUE, 61c3437056SNickeau DataType::DATETIME_TYPE_VALUE, 62c3437056SNickeau DataType::PARAGRAPH_TYPE_VALUE, 63c3437056SNickeau DataType::JSON_TYPE_VALUE, 64c3437056SNickeau DataType::BOOLEAN_TYPE_VALUE, 6504fd306cSNickeau DataType::INTEGER_TYPE_VALUE, 66c3437056SNickeau ]; 6704fd306cSNickeau const FLOOR = "floor"; 6804fd306cSNickeau const CEIL = "ceil"; 6904fd306cSNickeau 70c3437056SNickeau 7182a60d03SNickeau /** 7204fd306cSNickeau * @throws ExceptionBadArgument 7382a60d03SNickeau */ 7404fd306cSNickeau public static function toIntegerOrDefaultIfNull($targetValue, $default): int 7582a60d03SNickeau { 7604fd306cSNickeau if ($targetValue === null) { 7704fd306cSNickeau return $default; 7804fd306cSNickeau } 7904fd306cSNickeau return self::toInteger($targetValue); 8004fd306cSNickeau } 8104fd306cSNickeau 8204fd306cSNickeau /** 8304fd306cSNickeau * 8404fd306cSNickeau * @throws ExceptionBadArgument 85*cc610584Sgerardnico * @var string $roundDirection - ceil or floor (by default floor) 8604fd306cSNickeau */ 8704fd306cSNickeau public static function toInteger($targetValue, string $roundDirection = self::FLOOR): int 8804fd306cSNickeau { 8904fd306cSNickeau 9004fd306cSNickeau 9182a60d03SNickeau if (is_int($targetValue)) { 9282a60d03SNickeau return $targetValue; 9382a60d03SNickeau } 944cadd4f8SNickeau if (!is_string($targetValue) && !is_float($targetValue)) { 9582a60d03SNickeau $varExport = var_export($targetValue, true); 9604fd306cSNickeau throw new ExceptionBadArgument("The value passed is not a numeric/nor a string. We can not translate it to an integer. Value: $varExport"); 9782a60d03SNickeau } 9882a60d03SNickeau /** 9982a60d03SNickeau * Float 12.845 will return 12 10082a60d03SNickeau */ 10104fd306cSNickeau $float = self::toFloat($targetValue); 10204fd306cSNickeau if ($roundDirection === self::FLOOR) { 10304fd306cSNickeau $int = floor($float); 10404fd306cSNickeau } else { 10504fd306cSNickeau $int = ceil($float); 10604fd306cSNickeau } 10782a60d03SNickeau if ( 10882a60d03SNickeau $int === 0 && 10982a60d03SNickeau "$targetValue" !== "0" 11082a60d03SNickeau ) { 11104fd306cSNickeau throw new ExceptionBadArgument("The value ($targetValue) can not be cast to an integer."); 11282a60d03SNickeau } 11382a60d03SNickeau return $int; 11482a60d03SNickeau } 11582a60d03SNickeau 11604fd306cSNickeau /** 11704fd306cSNickeau * @throws ExceptionBadArgument 11804fd306cSNickeau */ 11904fd306cSNickeau public static function toIntegerCeil($targetValue): int 1204cadd4f8SNickeau { 12104fd306cSNickeau 12204fd306cSNickeau return self::toInteger($targetValue, self::CEIL); 12304fd306cSNickeau 12404fd306cSNickeau } 12504fd306cSNickeau 12604fd306cSNickeau public static function toBoolean($value, $ifNull = null) 12704fd306cSNickeau { 12804fd306cSNickeau if ($value === null) return $ifNull; 1294cadd4f8SNickeau return filter_var($value, FILTER_VALIDATE_BOOLEAN); 1304cadd4f8SNickeau } 1314cadd4f8SNickeau 13204fd306cSNickeau /** 13304fd306cSNickeau * @throws ExceptionBadArgument - if the value is not a numeric 13404fd306cSNickeau */ 1354cadd4f8SNickeau public static function toFloat($value): float 1364cadd4f8SNickeau { 13704fd306cSNickeau if (is_float($value)) { 13804fd306cSNickeau return $value; 13904fd306cSNickeau } 14004fd306cSNickeau 14104fd306cSNickeau if (!is_numeric($value)) { 14204fd306cSNickeau throw new ExceptionBadArgument("The value ($value) is not a numeric"); 14304fd306cSNickeau } 14404fd306cSNickeau 1454cadd4f8SNickeau return floatval($value); 1464cadd4f8SNickeau } 1474cadd4f8SNickeau 14804fd306cSNickeau public static function toBooleanString(?bool $value): ?string 14904fd306cSNickeau { 15004fd306cSNickeau if ($value === null) { 15104fd306cSNickeau return null; 15204fd306cSNickeau } 15304fd306cSNickeau if ($value) { 15404fd306cSNickeau return "true"; 15504fd306cSNickeau } else { 15604fd306cSNickeau return "false"; 15704fd306cSNickeau } 15804fd306cSNickeau } 15904fd306cSNickeau 16004fd306cSNickeau /** 16104fd306cSNickeau * @param mixed|null $value 16204fd306cSNickeau * @return bool - true if the value is built-in boolean or null 16304fd306cSNickeau */ 16404fd306cSNickeau public static function isBoolean($value): bool 16504fd306cSNickeau { 16604fd306cSNickeau return is_bool($value); 16704fd306cSNickeau } 16804fd306cSNickeau 169*cc610584Sgerardnico /** 170*cc610584Sgerardnico * Normalize the string output 171*cc610584Sgerardnico * ie (the true boolean value is not printed as `1` but `true`) 172*cc610584Sgerardnico * @param $value 173*cc610584Sgerardnico * @return mixed|string|null 174*cc610584Sgerardnico */ 17504fd306cSNickeau public static function toString($value) 17604fd306cSNickeau { 177*cc610584Sgerardnico if ($value === null) { 178*cc610584Sgerardnico return 'null'; 179*cc610584Sgerardnico } 18004fd306cSNickeau if (is_string($value)) { 18104fd306cSNickeau return $value; 18204fd306cSNickeau } 18304fd306cSNickeau if (is_array($value)) { 18404fd306cSNickeau return ArrayUtility::formatAsString($value); 18504fd306cSNickeau } 18604fd306cSNickeau if (is_object($value)) { 18704fd306cSNickeau return $value->__toString(); 18804fd306cSNickeau } 18904fd306cSNickeau if (is_bool($value)) { 19004fd306cSNickeau return var_export($value, true); 19104fd306cSNickeau } 19204fd306cSNickeau return strval($value); 19304fd306cSNickeau } 19404fd306cSNickeau 19504fd306cSNickeau public static function getType($value): string 19604fd306cSNickeau { 19704fd306cSNickeau if (is_string($value)) { 19804fd306cSNickeau return "string"; 19904fd306cSNickeau } 20004fd306cSNickeau if (is_array($value)) { 20104fd306cSNickeau return "array"; 20204fd306cSNickeau } 20304fd306cSNickeau if (is_object($value)) { 20404fd306cSNickeau return "object (" . get_class($value) . ")"; 20504fd306cSNickeau } 20604fd306cSNickeau return gettype($value); 20704fd306cSNickeau } 20804fd306cSNickeau 20904fd306cSNickeau public static function toMilliSeconds(\DateTime $dateTime) 21004fd306cSNickeau { 21104fd306cSNickeau 21204fd306cSNickeau $secs = $dateTime->getTimestamp(); // Gets the seconds 21304fd306cSNickeau $millisecs = $secs * 1000; // Converted to milliseconds 21404fd306cSNickeau $millisecs += $dateTime->format("u") / 1000; // Microseconds converted to seconds 21504fd306cSNickeau return $millisecs; 21604fd306cSNickeau 21704fd306cSNickeau } 21804fd306cSNickeau 21904fd306cSNickeau public static function isObject($value): bool 22004fd306cSNickeau { 22104fd306cSNickeau return is_object($value); 22204fd306cSNickeau } 22304fd306cSNickeau 224c3437056SNickeau 225c3437056SNickeau} 226