blob: 69419868a5970585598ae0310cb5a3a34c2124a0 [file] [log] [blame]
<?php
/**
* PHP Action runner
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// open fd/3 as that's where we send the result
$fd3 = fopen('php://fd/3', 'w');
// Register a shutdown function so that we can fail gracefully when a fatal error occurs
register_shutdown_function(function () use ($fd3) {
$error = error_get_last();
if ($error && in_array($error['type'], [E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR])) {
file_put_contents('php://stderr', "An error occurred running the action.\n");
fwrite($fd3, "An error occurred running the action.\n");
}
fclose($fd3);
});
require 'vendor/autoload.php';
require 'index.php';
// retrieve main function
$__functionName = $argv[1] ?? 'main';
// read stdin
while ($f = fgets(STDIN)) {
// call the function
$data = json_decode($f ?? '', true);
if (!is_array($data)) {
$data = [];
}
// convert all parameters other than value to environment variables
foreach ($data as $key => $value) {
if ($key == 'value') {
$_ENV['WHISK_INPUT'] = $data['value'] ?? [];
} else {
$_ENV['__OW_' . strtoupper($key)] = $value;
}
}
$values = $data['value'] ?? [];
try {
$result = $__functionName($values);
// convert result to an array if we can
if (is_object($result)) {
if (method_exists($result, 'getArrayCopy')) {
$result = $result->getArrayCopy();
} elseif ($result instanceof stdClass) {
$result = (array)$result;
}
} elseif ($result === null) {
$result = [];
}
// process the result
if (!is_array($result)) {
file_put_contents('php://stderr', 'Result must be an array but has type "'
. gettype($result) . '": ' . (string)$result);
file_put_contents('php://stdout', 'The action did not return a dictionary.');
$result = (string)$result;
} else {
$result = json_encode((object)$result);
}
} catch (Throwable $e) {
file_put_contents('php://stderr', (string)$e);
$result = 'An error occurred running the action.';
}
// ensure that the sentinels will be on their own lines
file_put_contents('php://stderr', "\n");
file_put_contents('php://stdout', "\n");
// cast result to an object for json_encode to ensure that an empty array becomes "{}" & send to fd/3
fwrite($fd3, $result . "\n");
}