1: <?php declare(strict_types=1);
2:
3: namespace Salient\Cli;
4:
5: use Salient\Cli\Exception\CliInvalidArgumentsException;
6: use Salient\Utility\AbstractUtility;
7: use Salient\Utility\File;
8: use Salient\Utility\Json;
9: use JsonException;
10:
11: /**
12: * @api
13: */
14: final class CliUtil extends AbstractUtility
15: {
16: /**
17: * Get data from a user-supplied JSON file
18: *
19: * If `$filename` is `"-"`, JSON is read from `STDIN`.
20: *
21: * @return mixed[]|object
22: */
23: public static function getJson(string $filename, bool $associative = true)
24: {
25: $json = File::getContents($filename === '-' ? 'php://stdin' : $filename);
26:
27: try {
28: $json = $associative
29: ? Json::objectAsArray($json)
30: : Json::parse($json);
31: } catch (JsonException $ex) {
32: $message = $ex->getMessage();
33: throw new CliInvalidArgumentsException(
34: $filename === '-'
35: ? sprintf('invalid JSON: %s', $message)
36: : sprintf("invalid JSON in '%s': %s", $filename, $message)
37: );
38: }
39:
40: if (!is_array($json) && ($associative || !is_object($json))) {
41: throw new CliInvalidArgumentsException(
42: $filename === '-'
43: ? 'invalid payload'
44: : sprintf('invalid payload: %s', $filename)
45: );
46: }
47:
48: return $json;
49: }
50: }
51: