protected function getPropertyValidationRulesSchema($propertyRules, $errorContext, $logCommandError = false)
	{
		$schema = new Schema();

		// Parse property rules to get format/schema
		foreach ($propertyRules as $rule) {
			$explodedRule = explode(':', $rule);
			$ruleName = $explodedRule[0];
			if (count($explodedRule) > 1) {
				$ruleParams = explode(',', $explodedRule[1]);
			}

			switch ($ruleName) {
				/* Primitive types */

				case 'integer':
					$schema->type = 'integer';
					break;
				case 'boolean':
					$schema->type = 'boolean';
					break;
				case 'string':
					$schema->type = 'string';
					break;

				/* Advanced types */

				case 'uuid':
					$schema->type = 'string';
					// @fixme Use of custom "format" or must we defined a "pattern" ? Better case should be defining the custom "type" in "components"...
					$schema->format = 'uuid';
					//$schema->pattern = '^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$';
					//$schema->description = 'UUID';
					break;
				case 'min':
					if (count($explodedRule) == 0) {
						throw new ErrorException('Laravel framework "min" rule parameter is missing.' . "\n" . $errorContext);
					}
					if ($schema->type == 'string') {
						$schema->minLength = (int)$ruleParams[0];
					} elseif ($schema->type == 'integer') {
						$schema->minimum = (int)$ruleParams[0];
					}
					break;
				case 'max':
					if (count($explodedRule) == 0) {
						throw new ErrorException('Laravel framework "min" rule parameter is missing.' . "\n" . $errorContext);
					}
					if ($schema->type == 'string') {
						$schema->maxLength = (int)$ruleParams[0];
					} elseif ($schema->type == 'integer') {
						$schema->maximum = (int)$ruleParams[0];
					}
					break;
				case 'in':
					if (is_null($schema->type)) {
						// Assuming it's a string
						$schema->type = 'string';
					}
					$schema->enum = $ruleParams;
					break;
				case 'date':
					$schema->type = 'string';
					// Not really "date" or "date-time" format
					$schema->description = 'Must be a valid date according to the strtotime PHP function.';
					break;
				case 'email':
					$schema->type = 'string';
					// @fixme Use of custom "format" or must we defined a "pattern" ? Better case should be defining the custom "type" in "components"...
					$schema->format = 'email';
					//$schema->pattern = '/^[a-zA-Z0-9.!#$%&\'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/';
					break;
				case 'password':
				case 'strength':
					$schema->type = 'string';
					// @fixme Use of custom "format" or must we defined a "pattern" ? Better case should be defining the custom "type" in "components"...
					$schema->format = 'password';
					//$schema->pattern = '/(?=.*\d)(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/';
					break;
				case 'url':
					$schema->type = 'string';
					// @fixme Use of custom "format" or must we defined a "pattern" ? Better case should be defining the custom "type" in "components"...
					$schema->format = 'url';
					/*
					// From Laravel "validateUrl" pattern :
					$schema->pattern = '~^
			            ((aaa|aaas|about|acap|acct|acr|adiumxtra|afp|afs|aim|apt|attachment|aw|barion|beshare|bitcoin|blob|bolo|callto|cap|chrome|chrome-extension|cid|coap|coaps|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-playcontainer|dlna-playsingle|dns|dntp|dtn|dvb|ed2k|example|facetime|fax|feed|feedready|file|filesystem|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|ham|hcp|http|https|iax|icap|icon|im|imap|info|iotdisco|ipn|ipp|ipps|irc|irc6|ircs|iris|iris.beep|iris.lwz|iris.xpc|iris.xpcs|itms|jabber|jar|jms|keyparc|lastfm|ldap|ldaps|magnet|mailserver|mailto|maps|market|message|mid|mms|modem|ms-help|ms-settings|ms-settings-airplanemode|ms-settings-bluetooth|ms-settings-camera|ms-settings-cellular|ms-settings-cloudstorage|ms-settings-emailandaccounts|ms-settings-language|ms-settings-location|ms-settings-lock|ms-settings-nfctransactions|ms-settings-notifications|ms-settings-power|ms-settings-privacy|ms-settings-proximity|ms-settings-screenrotation|ms-settings-wifi|ms-settings-workplace|msnim|msrp|msrps|mtqp|mumble|mupdate|mvn|news|nfs|ni|nih|nntp|notes|oid|opaquelocktoken|pack|palm|paparazzi|pkcs11|platform|pop|pres|prospero|proxy|psyc|query|redis|rediss|reload|res|resource|rmi|rsync|rtmfp|rtmp|rtsp|rtsps|rtspu|secondlife|service|session|sftp|sgn|shttp|sieve|sip|sips|skype|smb|sms|smtp|snews|snmp|soap.beep|soap.beeps|soldat|spotify|ssh|steam|stun|stuns|submit|svn|tag|teamspeak|tel|teliaeid|telnet|tftp|things|thismessage|tip|tn3270|turn|turns|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|videotex|view-source|wais|webcal|ws|wss|wtai|wyciwyg|xcon|xcon-userid|xfire|xmlrpc\.beep|xmlrpc.beeps|xmpp|xri|ymsgr|z39\.50|z39\.50r|z39\.50s))://                                 # protocol
			            (([\pL\pN-]+:)?([\pL\pN-]+)@)?          # basic auth
			            (
			                ([\pL\pN\pS-\.])+(\.?([\pL]|xn\-\-[\pL\pN-]+)+\.?) # a domain name
			                    |                                              # or
			                \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}                 # an IP address
			                    |                                              # or
			                \[
			                    (?:(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:::(?:(?:(?:[0-9a-f]{1,4})):){5})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,1}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,2}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,3}(?:(?:[0-9a-f]{1,4})))?::(?:(?:[0-9a-f]{1,4})):)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,4}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,5}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,6}(?:(?:[0-9a-f]{1,4})))?::))))
			                \]  # an IPv6 address
			            )
			            (:[0-9]+)?                              # a port (optional)
			            (/?|/\S+|\?\S*|\#\S*)                   # a /, nothing, a / with something, a query or a fragment
			        $~ixu';
					*/
					break;
				case 'image':
				case 'file':
					$schema->type = 'string';
					$schema->format = 'binary';
					break;
			}
		}
		
		if ($logCommandError && is_null($schema->type)) {
			$this->getParentCommand()->error($errorContext . "\n" . '  Unknown parameter type, rules : "' . implode(',', $propertyRules) . '"');
		}

		return $schema;
	}