Program Listing for File IRIView.hpp

Return to documentation for file (src/rdf4cpp/IRIView.hpp)

#ifndef RDF4CPP_IRIVIEW_HPP
#define RDF4CPP_IRIVIEW_HPP

#include <format>
#include <optional>
#include <string>
#include <string_view>

namespace rdf4cpp {
enum struct IRIFactoryError {
    Ok,
    UnknownPrefix,
    Relative,
    InvalidScheme,
    InvalidUserinfo,
    InvalidHost,
    InvalidPort,
    InvalidPath,
    InvalidQuery,
    InvalidFragment,
    InvalidPrefix,
};

struct IRIView {
private:
    std::string_view data;

public:
    explicit IRIView(std::string_view iri) noexcept;

private:
    struct IRIPart {
        size_t start, len;
        bool defined;
    };

    [[nodiscard]] IRIPart get_scheme_part() const noexcept;
    [[nodiscard]] IRIPart get_authority_part(const IRIPart &scheme) const noexcept;
    [[nodiscard]] IRIPart get_path_part(const IRIPart &auth) const noexcept;
    [[nodiscard]] IRIPart get_query_part(const IRIPart &path) const noexcept;
    [[nodiscard]] IRIPart get_fragment_part(const IRIPart &query) const noexcept;

    [[nodiscard]] IRIPart get_userinfo_part(const IRIPart& auth) const noexcept;
    [[nodiscard]] IRIPart get_host_part(const IRIPart& auth, const IRIPart& uinfo) const noexcept;
    [[nodiscard]] IRIPart get_port_part(const IRIPart& auth, const IRIPart& host) const noexcept;

    [[nodiscard]] std::string_view apply(const IRIPart &r) const noexcept;
    [[nodiscard]] std::optional<std::string_view> apply_opt(const IRIPart &r) const noexcept;

public:
    [[nodiscard]] bool is_relative() const noexcept;
    [[nodiscard]] std::optional<std::string_view> scheme() const noexcept;
    [[nodiscard]] std::optional<std::string_view> authority() const noexcept;
    [[nodiscard]] std::string_view path() const noexcept;
    [[nodiscard]] std::optional<std::string_view> query() const noexcept;
    [[nodiscard]] std::optional<std::string_view> fragment() const noexcept;

    struct AllParts {
        std::optional<std::string_view> scheme;
        std::optional<std::string_view> authority;
        std::string_view path;
        std::optional<std::string_view> query;
        std::optional<std::string_view> fragment;
    };
    [[nodiscard]] AllParts all_parts() const noexcept;

    [[nodiscard]] std::string_view to_absolute() const noexcept;

    [[nodiscard]] std::optional<std::string_view> userinfo() const noexcept;
    [[nodiscard]] std::optional<std::string_view> host() const noexcept;
    [[nodiscard]] std::optional<std::string_view> port() const noexcept;

    struct AuthorityParts {
        std::optional<std::string_view> userinfo, host, port;
    };
    [[nodiscard]] AuthorityParts all_authority_parts() const noexcept;

    [[nodiscard]] IRIFactoryError quick_validate(bool allow_relative = false) const noexcept;
};
}

template<>
struct std::formatter<rdf4cpp::IRIFactoryError> : std::formatter<string_view> {
    auto format(rdf4cpp::IRIFactoryError p, format_context& ctx) const {
        std::string_view s{};
        switch (p) {
            case rdf4cpp::IRIFactoryError::Ok:
                s = "Ok";
                break;
            case rdf4cpp::IRIFactoryError::UnknownPrefix:
                s = "UnknownPrefix";
                break;
            case rdf4cpp::IRIFactoryError::Relative:
                s = "Relative";
                break;
            case rdf4cpp::IRIFactoryError::InvalidScheme:
                s = "InvalidScheme";
                break;
            case rdf4cpp::IRIFactoryError::InvalidUserinfo:
                s = "InvalidUserinfo";
                break;
            case rdf4cpp::IRIFactoryError::InvalidHost:
                s = "InvalidHost";
                break;
            case rdf4cpp::IRIFactoryError::InvalidPort:
                s = "InvalidPort";
                break;
            case rdf4cpp::IRIFactoryError::InvalidPath:
                s = "InvalidPath";
                break;
            case rdf4cpp::IRIFactoryError::InvalidQuery:
                s = "InvalidQuery";
                break;
            case rdf4cpp::IRIFactoryError::InvalidFragment:
                s = "InvalidFragment";
                break;
            default:
                s = "Unknown";
                break;
        }
        return std::formatter<std::string_view>::format(s, ctx);
    }
};

#endif  //RDF4CPP_IRIVIEW_HPP