<?php

namespace Safe;

use Safe\Exceptions\YamlException;

/**
 * Convert all or part of a YAML document stream read from a file to a PHP variable.
 *
 * @param string $filename Path to the file.
 * @param int $pos Document to extract from stream (-1 for all
 * documents, 0 for first document, ...).
 * @param int|null $ndocs If ndocs is provided, then it is filled with the
 * number of documents found in stream.
 * @param array|null $callbacks Content handlers for YAML nodes. Associative array of YAML
 * tag =&gt; callable mappings. See
 * parse callbacks for more
 * details.
 * @return mixed Returns the value encoded in input in appropriate
 * PHP type. If pos is -1 an
 * array will be returned with one entry for each document found
 * in the stream.
 * @throws YamlException
 *
 */
function yaml_parse_file(string $filename, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
    error_clear_last();
    if ($callbacks !== null) {
        $safeResult = \yaml_parse_file($filename, $pos, $ndocs, $callbacks);
    } else {
        $safeResult = \yaml_parse_file($filename, $pos, $ndocs);
    }
    if ($safeResult === false) {
        throw YamlException::createFromPhpError();
    }
    return $safeResult;
}


/**
 * Convert all or part of a YAML document stream read from a URL to a PHP variable.
 *
 * @param string $url url should be of the form "scheme://...". PHP
 * will search for a protocol handler (also known as a wrapper) for that
 * scheme. If no wrappers for that protocol are registered, PHP will emit
 * a notice to help you track potential problems in your script and then
 * continue as though filename specifies a regular file.
 * @param int $pos Document to extract from stream (-1 for all
 * documents, 0 for first document, ...).
 * @param int|null $ndocs If ndocs is provided, then it is filled with the
 * number of documents found in stream.
 * @param array|null $callbacks Content handlers for YAML nodes. Associative array of YAML
 * tag =&gt; callable mappings. See
 * parse callbacks for more
 * @return mixed Returns the value encoded in input in appropriate
 * PHP type. If pos is
 * -1 an array will be returned with one entry
 * for each document found in the stream.
 * @throws YamlException
 *
 */
function yaml_parse_url(string $url, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
    error_clear_last();
    if ($callbacks !== null) {
        $safeResult = \yaml_parse_url($url, $pos, $ndocs, $callbacks);
    } else {
        $safeResult = \yaml_parse_url($url, $pos, $ndocs);
    }
    if ($safeResult === false) {
        throw YamlException::createFromPhpError();
    }
    return $safeResult;
}


/**
 * Convert all or part of a YAML document stream to a PHP variable.
 *
 * @param string $input The string to parse as a YAML document stream.
 * @param int $pos Document to extract from stream (-1 for all
 * documents, 0 for first document, ...).
 * @param int|null $ndocs If ndocs is provided, then it is filled with the
 * number of documents found in stream.
 * @param array|null $callbacks Content handlers for YAML nodes. Associative array of YAML
 * tag =&gt; callable mappings. See
 * parse callbacks for more
 * details.
 * @return mixed Returns the value encoded in input in appropriate
 * PHP type. If pos is -1 an
 * array will be returned with one entry for each document found
 * in the stream.
 * @throws YamlException
 *
 */
function yaml_parse(string $input, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
    error_clear_last();
    if ($callbacks !== null) {
        $safeResult = \yaml_parse($input, $pos, $ndocs, $callbacks);
    } else {
        $safeResult = \yaml_parse($input, $pos, $ndocs);
    }
    if ($safeResult === false) {
        throw YamlException::createFromPhpError();
    }
    return $safeResult;
}
