Parser.php 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. <?php
  2. declare(strict_types=1);
  3. namespace Dotenv\Parser;
  4. use Dotenv\Exception\InvalidFileException;
  5. use Dotenv\Util\Regex;
  6. use GrahamCampbell\ResultType\Result;
  7. use GrahamCampbell\ResultType\Success;
  8. final class Parser implements ParserInterface
  9. {
  10. /**
  11. * Parse content into an entry array.
  12. *
  13. * @param string $content
  14. *
  15. * @throws \Dotenv\Exception\InvalidFileException
  16. *
  17. * @return \Dotenv\Parser\Entry[]
  18. */
  19. public function parse(string $content)
  20. {
  21. return Regex::split("/(\r\n|\n|\r)/", $content)->mapError(static function () {
  22. return 'Could not split into separate lines.';
  23. })->flatMap(static function (array $lines) {
  24. return self::process(Lines::process($lines));
  25. })->mapError(static function (string $error) {
  26. throw new InvalidFileException(\sprintf('Failed to parse dotenv file. %s', $error));
  27. })->success()->get();
  28. }
  29. /**
  30. * Convert the raw entries into proper entries.
  31. *
  32. * @param string[] $entries
  33. *
  34. * @return \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Entry[], string>
  35. */
  36. private static function process(array $entries)
  37. {
  38. /** @var \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Entry[], string> */
  39. return \array_reduce($entries, static function (Result $result, string $raw) {
  40. return $result->flatMap(static function (array $entries) use ($raw) {
  41. return EntryParser::parse($raw)->map(static function (Entry $entry) use ($entries) {
  42. /** @var \Dotenv\Parser\Entry[] */
  43. return \array_merge($entries, [$entry]);
  44. });
  45. });
  46. }, Success::create([]));
  47. }
  48. }