Changed indentation and added type hints

This commit is contained in:
2026-06-02 13:14:16 +00:00
parent da0ddd572e
commit 6f3c7338c7

View File

@@ -13,140 +13,140 @@ use ML\IRI\IRI;
*/ */
class COIDParser { class COIDParser {
const COID_INVALID = 0; const COID_INVALID = 0;
const COID_ROOT = 1; const COID_ROOT = 1;
const COID_UNVERSIONED = 2; const COID_UNVERSIONED = 2;
const COID_VERSIONED = 3; const COID_VERSIONED = 3;
const COID_VERSION_WILDCARD = 4; const COID_VERSION_WILDCARD = 4;
const REGEX_HOSTNAME = "/^([a-z0-9-]+\.)?[a-z0-9-]+\.[a-z]+$/"; const REGEX_HOSTNAME = "/^([a-z0-9-]+\.)?[a-z0-9-]+\.[a-z]+$/";
const REGEX_SEGMENT = "/^[A-Za-z-_0-9\.]+$/"; const REGEX_SEGMENT = "/^[A-Za-z-_0-9\.]+$/";
const REGEX_VERSION_WILDCARD = "/^((\^|~)(\d+\.)?\d|(\d+\.){1,2}\*)$/"; const REGEX_VERSION_WILDCARD = "/^((\^|~)(\d+\.)?\d|(\d+\.){1,2}\*)$/";
/** /**
* Creates a new IRI object representing a COID from a string. * Creates a new IRI object representing a COID from a string.
* Adds the "coid://" prefix if necessary and normalizes case. * Adds the "coid://" prefix if necessary and normalizes case.
* *
* @param string $coidString A COID string. * @param string $coidString A COID string.
* @return IRI * @return IRI
*/ */
public static function fromString($coidString) { public static function fromString($coidString) : IRI {
$coidPre = new IRI( $coidPre = new IRI(
(strtolower(substr($coidString, 0, 7))=='coid://') ? $coidString : 'coid://'.$coidString (strtolower(substr($coidString, 0, 7)) == 'coid://') ? $coidString : 'coid://'.$coidString
); );
// Normalize scheme and host segments to lower case // Normalize scheme and host segments to lower case
return new IRI('coid://'.strtolower($coidPre->getHost()).$coidPre->getPath()); return new IRI('coid://'.strtolower($coidPre->getHost()).$coidPre->getPath());
}
/**
* Get the type of a COID.
*
* @param IRI $coid
* @return int|null
*/
public static function getType(IRI $coid) {
if ($coid->getScheme()!='coid' || $coid->getHost()==''
|| preg_match(self::REGEX_HOSTNAME, $coid->getHost()) != 1)
return self::COID_INVALID;
if ($coid->getPath()=='' || $coid->getPath()=='/')
return self::COID_ROOT;
$segments = explode('/', $coid->getPath());
switch (count($segments)) {
case 2:
return (preg_match(self::REGEX_SEGMENT, $segments[1]) == 1)
? self::COID_UNVERSIONED
: self::COID_INVALID;
case 3:
if (preg_match(self::REGEX_SEGMENT, $segments[1]) != 1)
return self::COID_INVALID;
if (preg_match(self::REGEX_SEGMENT, $segments[2]) == 1)
return self::COID_VERSIONED;
else
if (preg_match(self::REGEX_VERSION_WILDCARD, $segments[2]) == 1)
return self::COID_VERSION_WILDCARD;
else
return self::COID_INVALID;
default:
return self::COID_INVALID;
} }
}
/** /**
* Checks whether the given IRI object is a valid COID. * Get the type of a COID.
* *
* @param IRI $coid * @param IRI $coid
* @return boolean * @return int|null
*/ */
public static function isValidCOID(IRI $coid) { public static function getType(IRI $coid) : ?int {
return (self::getType($coid)!=self::COID_INVALID); if ($coid->getScheme()!='coid' || $coid->getHost()==''
} || preg_match(self::REGEX_HOSTNAME, $coid->getHost()) != 1)
return self::COID_INVALID;
/** if ($coid->getPath()=='' || $coid->getPath()=='/')
* Get the name segment of a valid COID or null if not available. return self::COID_ROOT;
*
* @param IRI $coid
* @return string|null
*/
public static function getName(IRI $coid) {
if (self::getType($coid)!=self::COID_INVALID
&& self::getType($coid)!=self::COID_ROOT) {
$segments = explode('/', $coid->getPath());
return $segments[1];
} else
return null;
}
/** $segments = explode('/', $coid->getPath());
* Get the version segment of a valid, versioned COID or null if not available. switch (count($segments)) {
* case 2:
* @param IRI $coid return (preg_match(self::REGEX_SEGMENT, $segments[1]) == 1)
* @return string|null ? self::COID_UNVERSIONED
*/ : self::COID_INVALID;
public static function getVersion(IRI $coid) { case 3:
if (self::getType($coid)==self::COID_VERSIONED) { if (preg_match(self::REGEX_SEGMENT, $segments[1]) != 1)
$segments = explode('/', $coid->getPath()); return self::COID_INVALID;
return $segments[2];
} else
return null;
}
/** if (preg_match(self::REGEX_SEGMENT, $segments[2]) == 1)
* Get the version segment of a versioned or version wildcard COID or return self::COID_VERSIONED;
* null if not available. else
* if (preg_match(self::REGEX_VERSION_WILDCARD, $segments[2]) == 1)
* @param IRI $coid return self::COID_VERSION_WILDCARD;
* @return string|null else
*/ return self::COID_INVALID;
public static function getVersionWildcard(IRI $coid) { default:
if (self::getType($coid)==self::COID_VERSION_WILDCARD) { return self::COID_INVALID;
$segments = explode('/', $coid->getPath()); }
return $segments[2]; }
} else
return null; /**
} * Checks whether the given IRI object is a valid COID.
*
/** * @param IRI $coid
* Returns the COID itself if it is a root COID or a new IRI object * @return bool
* representing the namespace underlying the given COID. */
* public static function isValidCOID(IRI $coid) : bool {
* @param IRI $coid return (self::getType($coid)!=self::COID_INVALID);
* @return IRI|null }
*/
public static function getNamespaceCOID(IRI $coid) { /**
switch (self::getType($coid)) { * Get the name segment of a valid COID or null if not available.
case self::COID_ROOT: *
return $coid; * @param IRI $coid
case self::COID_UNVERSIONED: * @return string|null
case self::COID_VERSIONED: */
case self::COID_VERSION_WILDCARD: public static function getName(IRI $coid) : ?string {
return new IRI('coid://'.$coid->getHost()); if (self::getType($coid)!=self::COID_INVALID
default: && self::getType($coid)!=self::COID_ROOT) {
return null; $segments = explode('/', $coid->getPath());
return $segments[1];
} else
return null;
}
/**
* Get the version segment of a valid, versioned COID or null if not available.
*
* @param IRI $coid
* @return string|null
*/
public static function getVersion(IRI $coid) : ?string {
if (self::getType($coid)==self::COID_VERSIONED) {
$segments = explode('/', $coid->getPath());
return $segments[2];
} else
return null;
}
/**
* Get the version segment of a versioned or version wildcard COID or
* null if not available.
*
* @param IRI $coid
* @return string|null
*/
public static function getVersionWildcard(IRI $coid) : ?string {
if (self::getType($coid)==self::COID_VERSION_WILDCARD) {
$segments = explode('/', $coid->getPath());
return $segments[2];
} else
return null;
}
/**
* Returns the COID itself if it is a root COID or a new IRI object
* representing the namespace underlying the given COID.
*
* @param IRI $coid
* @return IRI|null
*/
public static function getNamespaceCOID(IRI $coid) : ?IRI {
switch (self::getType($coid)) {
case self::COID_ROOT:
return $coid;
case self::COID_UNVERSIONED:
case self::COID_VERSIONED:
case self::COID_VERSION_WILDCARD:
return new IRI('coid://'.$coid->getHost());
default:
return null;
}
} }
}
} }