/* * Copyright (c) 2023, Gurkirat Singh * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include constexpr auto normal_version_separators = ".-"sv; class Port { public: [[nodiscard]] String name() const { return m_name; } [[nodiscard]] String version_string() const { return m_version.has() ? m_version.get() : m_version.get().to_string(); } [[nodiscard]] ErrorOr version_semver() const { if (m_version.has()) return Error::from_string_view("This does not have semver"sv); return m_version.get(); } Port(String const& name, String const& version) : m_name(name) , m_version(version) { set_version(version); } Port(String const& name, String const& version, char normal_version_separator) : m_name(name) , m_version(version) { set_version(version, normal_version_separator); } void set_name(String const& name) { if (!name.is_empty()) m_name = name; } void set_version(StringView const& version) { for (auto const& normal_version_separator : normal_version_separators) { auto semver_parsed = SemVer::from_string_view(version, normal_version_separator); if (!semver_parsed.is_error()) { m_version = semver_parsed.value(); return; } } m_version = MUST(String::from_utf8(version)); } void set_version(StringView const& version, char normal_version_separator) { // If the user has provided the separator, it is safe to assume that they are certain about it. // Therefore, it is ideal to crash, indicating that their assumption is incorrect. m_version = MUST(SemVer::from_string_view(version, normal_version_separator)); } private: String m_name; Variant m_version; };