/** * Transform a string representing a QTI valueType value in a * the correct datatype. * * @param string $string The QTI valueType value as a string. * @param integer $baseType The QTI baseType that defines the datatype of $string. * @return mixed A converted object/primitive type. * @throws \InvalidArgumentException If $baseType is not a value from the BaseType enumeration. * @throws \UnexpectedValueException If $string cannot be transformed in a Value expression with the given $baseType. */ public static function stringToDatatype($string, $baseType) { if (in_array($baseType, BaseType::asArray())) { $value = null; switch ($baseType) { case BaseType::BOOLEAN: if (Format::isBoolean($string)) { $value = Format::toLowerTrim($string) == 'true' ? true : false; return $value; } else { $msg = "'{$string}' cannot be transformed into boolean."; throw new UnexpectedValueException($msg); } break; case BaseType::INTEGER: if (Format::isInteger($string)) { $value = intval($string); return $value; } else { $msg = "'{$string}' cannot be transformed into integer."; throw new UnexpectedValueException($msg); } break; case BaseType::FLOAT: if (Format::isFloat($string)) { $value = floatval($string); return $value; } else { $msg = "'{$string}' cannot be transformed into float."; throw new UnexpectedValueException($msg); } break; case BaseType::URI: if (Format::isUri($string)) { return $string; } else { $msg = "'{$string}' is not a valid URI."; throw new UnexpectedValueException($msg); } break; case BaseType::IDENTIFIER: if (Format::isIdentifier($string)) { return $string; } else { $msg = "'{$string}' is not a valid QTI Identifier."; throw new UnexpectedValueException($msg); } break; case BaseType::INT_OR_IDENTIFIER: if (Format::isIdentifier($string)) { return $string; } elseif (Format::isInteger($string)) { return intval($string); } else { $msg = "'{$string}' is not a valid QTI Identifier nor a valid integer."; throw new UnexpectedValueException($msg); } break; case BaseType::PAIR: if (Format::isPair($string)) { $pair = explode(" ", $string); return new Pair($pair[0], $pair[1]); } else { $msg = "'{$string}' is not a valid pair."; throw new UnexpectedValueException($msg); } break; case BaseType::DIRECTED_PAIR: if (Format::isDirectedPair($string)) { $pair = explode(" ", $string); return new DirectedPair($pair[0], $pair[1]); } else { $msg = "'{$string}' is not a valid directed pair."; throw new UnexpectedValueException($msg); } break; case BaseType::DURATION: if (Format::isDuration($string)) { return new Duration($string); } else { $msg = "'{$string}' is not a valid duration."; throw new UnexpectedValueException($msg); } break; case BaseType::FILE: throw new \RuntimeException("Unsupported baseType: file."); break; case BaseType::STRING: return '' . $string; break; case BaseType::POINT: if (Format::isPoint($string)) { $parts = explode(" ", $string); return new Point(intval($parts[0]), intval($parts[1])); } else { $msg = "'{$string}' is not valid point."; throw new UnexpectedValueException($msg); } break; default: throw new \RuntimeException("Unknown baseType."); break; } } else { $msg = "BaseType must be a value from the BaseType enumeration."; throw new InvalidArgumentException($msg); } }