success()->getOrElse(0) === 1; } /** * Strips quotes and comments from the environment variable value. * * @param string|null $value * * @throws \Dotenv\Exception\InvalidFileException * * @return string|null */ private static function parseValue($value) { if ($value === null || \trim($value) === '') { return $value; } $result = \array_reduce(\str_split($value), function ($data, $char) use($value) { switch ($data[1]) { case self::INITIAL_STATE: if ($char === '"' || $char === '\'') { return [$data[0], self::QUOTED_STATE]; } elseif ($char === '#') { return [$data[0], self::COMMENT_STATE]; } else { return [$data[0] . $char, self::UNQUOTED_STATE]; } case self::UNQUOTED_STATE: if ($char === '#') { return [$data[0], self::COMMENT_STATE]; } elseif (\ctype_space($char)) { return [$data[0], self::WHITESPACE_STATE]; } else { return [$data[0] . $char, self::UNQUOTED_STATE]; } case self::QUOTED_STATE: if ($char === $value[0]) { return [$data[0], self::WHITESPACE_STATE]; } elseif ($char === '\\') { return [$data[0], self::ESCAPE_STATE]; } else { return [$data[0] . $char, self::QUOTED_STATE]; } case self::ESCAPE_STATE: if ($char === $value[0] || $char === '\\') { return [$data[0] . $char, self::QUOTED_STATE]; } elseif (\in_array($char, ['f', 'n', 'r', 't', 'v'], \true)) { return [$data[0] . \stripcslashes('\\' . $char), self::QUOTED_STATE]; } else { throw new InvalidFileException(self::getErrorMessage('an unexpected escape sequence', $value)); } case self::WHITESPACE_STATE: if ($char === '#') { return [$data[0], self::COMMENT_STATE]; } elseif (!\ctype_space($char)) { throw new InvalidFileException(self::getErrorMessage('unexpected whitespace', $value)); } else { return [$data[0], self::WHITESPACE_STATE]; } case self::COMMENT_STATE: return [$data[0], self::COMMENT_STATE]; } }, ['', self::INITIAL_STATE]); if ($result[1] === self::QUOTED_STATE || $result[1] === self::ESCAPE_STATE) { throw new InvalidFileException(self::getErrorMessage('a missing closing quote', $value)); } return $result[0]; } /** * Generate a friendly error message. * * @param string $cause * @param string $subject * * @return string */ private static function getErrorMessage($cause, $subject) { return \sprintf('Failed to parse dotenv file due to %s. Failed at [%s].', $cause, \strtok($subject, "\n")); } }