+++ title = "parser.hpp" type = "docs" +++ # parser.hpp Defines functions for parsing files or strings and the exceptions they use. While `parse` throws an exception on failure, `try_parse` returns error information. # `parse` Parses the content of a given file and returns a `toml::basic_value`. In case of failure, `toml::syntax_error` is thrown. The type information of `basic_value` is provided by a `template`, and the TOML language version is specified by `toml::spec`. ### `parse(std::istream&, std::string filename, toml::spec)` ```cpp namespace toml { template basic_value parse(std::istream& is, std::string fname = "unknown file", spec s = spec::default_version()); } ``` Parses the content of the given `std::istream&`. The filename information is taken as the third argument. If the filename is not provided, it defaults to `"unknown file"`. ### `parse(std::string filename, toml::spec)` ```cpp namespace toml { template basic_value parse(std::string fname, spec s = spec::default_version()); } ``` Parses the content of the given filename. If reading the file fails, `toml::file_io_error` is thrown. If parsing fails, `toml::syntax_error` is thrown. ### `parse(const char (&)[N] filename, toml::spec)` ```cpp namespace toml { template basic_value parse(const char (&fname)[N], spec s = spec::default_version()); } ``` Parses the content of the given filename from a string literal. If reading the file fails, `toml::file_io_error` is thrown. If parsing fails, `toml::syntax_error` is thrown. ### `parse(std::filesystem::path, toml::spec)` ```cpp namespace toml { template basic_value parse(const std::filesystem::path& fpath, spec s = spec::default_version()); } ``` This is defined only if `` is available. Parses the content of the file at the given file path. If reading the file fails, `toml::file_io_error` is thrown. If parsing fails, `toml::syntax_error` is thrown. ### `parse(FILE*, std::string filename, toml::spec)` ```cpp namespace toml { template result, std::vector> parse(FILE* fp, std::string filename, spec s = spec::default_version()); } ``` Parses the content of the file pointed to by `FILE*`. If reading the file fails, `file_io_error` containing `errno` is thrown. If parsing fails, `syntax_error` is thrown. ### `parse(std::vector, std::string filename, toml::spec)` ```cpp namespace toml { template basic_value parse(std::vector content, std::string filename, spec s = spec::default_version()); } ``` Parses the byte sequence as a TOML file. If parsing fails, `toml::syntax_error` is thrown. # `parse_str` ### `parse_str(std::string, toml::spec)` ```cpp namespace toml { template basic_value parse_str(std::string content, spec s = spec::default_version(), cxx::source_location loc = cxx::source_location::current()); } ``` Parses a string as a TOML file. In case of failure, `toml::syntax_error` is thrown. The type information of `basic_value` is provided by a `template`, and the TOML language version is specified by `toml::spec`. You generally don't need to manually set the third argument, `cxx::source_location`. If `std::source_location`, `std::experimental::source_location`, or `__builtin_FILE` is available, the location information where `parse_str` was called will be stored. # `try_parse` Parses the contents of the given file and returns a `toml::basic_value` if successful, or a `std::vector` if it fails. The type information of `basic_value` is specified by `template`, and the version of the TOML language is specified by `toml::spec`. {{< hint warning >}} Unlike `parse`, `try_parse` does not throw exceptions defined in toml11 such as `syntax_error`. However, please note that exceptions thrown by the standard library will still propagate. For instance, errors occurring internally within `std::ifstream` or memory exhaustion in `std::vector` will throw exceptions. {{< /hint >}} ### `try_parse(std::istream&, std::string filename, toml::spec)` ```cpp namespace toml { template result, std::vector> try_parse(std::istream& is, std::string fname = "unknown file", spec s = spec::default_version()); } ``` Takes a `std::istream&` and parses its content. The file name information is taken as the second argument. If a file name is not provided, it defaults to `"unknown file"`. If parsing fails, a `result` holding the error type `std::vector` is returned. If successful, a `result` holding a `basic_value` is returned. ### `try_parse(std::string filename, toml::spec)` ```cpp namespace toml { template result, std::vector> try_parse(std::string fname, spec s = spec::default_version()); } ``` Takes a file name and parses its content. If parsing fails, a `result` holding the error type `std::vector` is returned. If successful, a `result` holding a `basic_value` is returned. ### `try_parse(const char (&)[N] filename, toml::spec)` ```cpp namespace toml { template result, std::vector> try_parse(const char (&fname)[N], spec s = spec::default_version()); } ``` Takes a string literal as a file name and parses its content. If parsing fails, a `result` holding the error type `std::vector` is returned. If successful, a `result` holding a `basic_value` is returned. ### `try_parse(std::filesystem::path, toml::spec)` ```cpp namespace toml { template result, std::vector> try_parse(const std::filesystem::path& fpath, spec s = spec::default_version()); } ``` Takes a file path and parses its content. If parsing fails, a `result` holding the error type `std::vector` is returned. If successful, a `result` holding a `basic_value` is returned. ### `try_parse(FILE*, std::string filename, toml::spec)` ```cpp namespace toml { template result, std::vector> try_parse(FILE* fp, std::string filename, spec s = spec::default_version()); } ``` Takes a `FILE*` and parses its content. If parsing fails, a `result` holding the error type `std::vector` is returned. If successful, a `result` holding a `basic_value` is returned. ### `try_parse(std::vector, std::string filename, toml::spec)` ```cpp namespace toml { template result, std::vector> try_parse(std::vector content, std::string filename, spec s = spec::default_version()); } ``` Takes a byte array and parses its content as a TOML file. If parsing fails, a `result` holding the error type `std::vector` is returned. If successful, a `result` holding a `basic_value` is returned. # `try_parse_str` ### `try_parse_str(std::string, toml::spec)` ```cpp namespace toml { template result, std::vector> try_parse_str(std::string content, spec s = spec::default_version(), cxx::source_location loc = cxx::source_location::current()); } ``` Parses a string as a TOML file, returning a `toml::basic_value` if successful, or a `std::vector` if it fails. Unlike `parse_str`, it does not throw `syntax_error`, but instead returns error information as the failure type of the `result`. If `std::source_location`, `std::experimental::source_location`, or `__builtin_FILE` is available, it will record the location information. Typically, you do not need to manually set the third argument `cxx::source_location`. If any of `std::source_location`, `std::experimental::source_location`, or `__builtin_FILE` are available, the information of the location where `parse_str` was called will be saved as the location information. {{< hint warning >}} Unlike `parse`, `try_parse` does not throw exceptions defined in toml11 such as `syntax_error`. However, please note that exceptions thrown by the standard library will still propagate. For instance, errors occurring internally within `std::ifstream` or memory exhaustion in `std::vector` will throw exceptions. {{< /hint >}} # `syntax_error` ```cpp namespace toml { struct syntax_error final : public ::toml::exception { public: syntax_error(std::string what_arg, std::vector err); ~syntax_error() noexcept override = default; const char* what() const noexcept override; std::vector const& errors() const noexcept }; } ``` An exception thrown when a syntax error is detected in TOML. It is thrown by `parse` but not by `try_parse`. # `file_io_error` ```cpp namespace toml { struct file_io_error final : public ::toml::exception { public: file_io_error(const std::string& msg, const std::string& fname); file_io_error(int errnum, const std::string& msg, const std::string& fname); ~file_io_error() noexcept override = default; const char* what() const noexcept override; bool has_errno() const noexcept; int get_errno() const noexcept; }; } ``` An exception thrown when reading the contents of a file fails. When using `FILE*` to read a file, `errno` is set. ### `has_errno` If `std::ifstream` fails, `errno` is not set. In this case, `has_errno` returns `false`. ### `get_errno` Particularly when passing a `FILE*`, retrieves the value of `errno`. If `has_errno` is `false`, it returns `0`. # Related - [error_info.hpp]({{}}) - [result.hpp]({{}}) - [spec.hpp]({{}}) - [value.hpp]({{}})