xref: /plugin/combo/ComboStrap/DataType.php (revision cc61058412fea34c761a0cc9a2fd45c3b979220b)
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