-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathparse.hh
77 lines (58 loc) · 2.12 KB
/
parse.hh
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
77
/* ========================================================================== *
*
* Parse package specs, identifiers, descriptors, etc.
*
* -------------------------------------------------------------------------- */
#include <nix/fetchers.hh>
#include <nix/url-parts.hh>
#include <optional>
#include <iostream>
/* -------------------------------------------------------------------------- */
namespace floco::parse {
/* -------------------------------------------------------------------------- */
typedef enum { semver, version, url } SpecKind;
struct ParsedSpec {
std::optional<std::string> scope;
std::string bname;
std::string locator;
SpecKind kind;
ParsedSpec( const std::string & raw );
ParsedSpec( const std::string & ident, const std::string & locator );
ParsedSpec( const std::optional<std::string> & scope,
const std::string & bname,
const std::string & locator
);
bool isScoped() const { return this->scope.has_value(); }
std::string
ident() const
{
if ( this->isScoped() )
{
return "@" + this->scope.value() + "/" + this->bname;
}
else
{
return this->bname;
}
}
std::string toString() const { return this->ident() + "@" + this->locator; }
void
show() const
{
const std::string k(
this->kind == SpecKind::version ? "Version" :
this->kind == SpecKind::semver ? "SemVer" : "URL"
);
std::cerr << "{\n scope: " + this->scope.value_or( "NULL" ) +
",\n bname: " + this->bname +
",\n locator: " + this->locator +
",\n kind: " + k + "\n}\n";
}
}; /* End `struct ParsedSpec' */
/* -------------------------------------------------------------------------- */
}; /* End Namespace `floco::parse' */
/* -------------------------------------------------------------------------- *
*
*
*
* ========================================================================== */