summaryrefslogtreecommitdiff
path: root/src/package.cpp
blob: 0734a5e40ef194f8d5d798fc8d726a47dfd28317 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "package.h"
#include <filesystem>

namespace katja
{
    package::package(const std::string& name, const std::string& version,
        const std::string& architecture, const std::string& tag)
        : m_name(name), m_version(version), m_architecture(architecture), m_tag(tag)
    {
    }

    const std::string& package::name() const noexcept
    {
        return m_name;
    }

    const std::string& package::version() const noexcept
    {
        return m_version;
    }

    const std::string& package::architecture() const noexcept
    {
        return m_architecture;
    }

    const std::string& package::tag() const noexcept
    {
        return m_tag;
    }

    std::optional<package> package::parse(const std::string& full_name) noexcept
    {
        std::size_t tag_separator = full_name.find_last_of('-');

        if (tag_separator == std::string::npos || tag_separator == 0)
        {
            return std::nullopt;
        }
        std::size_t architecture_separator = full_name.find_last_of('-', tag_separator - 1);

        if (architecture_separator == std::string::npos || architecture_separator == 0)
        {
            return std::nullopt;
        }
        std::size_t version_separator = full_name.find_last_of('-', architecture_separator - 1);

        if (version_separator == std::string::npos || version_separator == 0)
        {
            return std::nullopt;
        }
        package parsed_package{
            full_name.substr(0, version_separator),
            full_name.substr(version_separator + 1, architecture_separator - version_separator - 1),
            full_name.substr(architecture_separator + 1, tag_separator - architecture_separator - 1),
            full_name.substr(tag_separator + 1)
        };
        return std::make_optional(parsed_package);
    }

    std::unordered_map<std::string, package> read_package_database()
    {
        std::unordered_map<std::string, package> packages;

        for (const auto& entry : std::filesystem::directory_iterator("/var/lib/pkgtools/packages"))
        {
            std::optional<package> maybe_package = package::parse(entry.path().filename());

            if (maybe_package.has_value())
            {
                packages.insert_or_assign(maybe_package.value().name(), maybe_package.value());
            }
        }
        return packages;
    }
}