aboutsummaryrefslogtreecommitdiff
path: root/bpkg/manifest
blob: a02a4a02abb12c54f0de16b842e1a89ffb316a7f (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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// file      : bpkg/manifest -*- C++ -*-
// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd
// license   : MIT; see accompanying LICENSE file

#ifndef BPKG_MANIFEST
#define BPKG_MANIFEST

#include <string>
#include <vector>

#include <butl/optional>

namespace bpkg
{
  class manifest_parser;
  class manifest_serializer;
  class manifest_name_value;

  using strings = std::vector<std::string>;

  // priority
  //
  class priority
  {
  public:
    enum value_type {low, medium, high, security};

    std::string comment;

    priority (value_type v = low): value (v) {}
    operator value_type () const {return value;}

  private:
    value_type value; // Shouldn't be necessary to access directly.
  };

  // description
  // description-file
  //
  struct description: std::string
  {
    bool file;
    std::string comment;
  };

  // license
  //
  struct licenses: strings
  {
    std::string comment;
  };

  // change
  // change-file
  //
  struct change: std::string
  {
    bool file;
    std::string comment;
  };

  // url
  // package-url
  //
  struct url: std::string
  {
    std::string comment;
  };

  // email
  // package-email
  //
  struct email: std::string
  {
    std::string comment;
  };

  // depends
  //
  enum class comparison {eq, lt, gt, le, ge};

  struct version_comparison
  {
    std::string value;
    comparison operation;
  };

  struct dependency
  {
    std::string name;
    butl::optional<version_comparison> version;
  };

  struct dependency_alternatives: std::vector<dependency>
  {
    bool conditional;
    std::string comment;
  };

  // requires
  //
  struct requirement_alternatives: strings
  {
    bool conditional;
    std::string comment;
  };

  class manifest
  {
  public:
    using priority_type = bpkg::priority;
    using url_type = bpkg::url;
    using email_type = bpkg::email;

    std::string name;
    std::string version;
    priority_type priority;
    std::string summary;
    std::vector<licenses> license_alternatives;
    strings tags;
    std::vector<description> descriptions;
    std::vector<change> changes;
    url_type url;
    butl::optional<url_type> package_url;
    email_type email;
    butl::optional<email_type> package_email;
    std::vector<dependency_alternatives> dependencies;
    std::vector<requirement_alternatives> requirements;

  public:
    manifest (manifest_parser&);
    manifest (manifest_parser&, const manifest_name_value& start);

    void
    serialize (manifest_serializer&) const;
  };

  class manifests: public std::vector<manifest>
  {
  public:
    manifests (manifest_parser&);

    void
    serialize (manifest_serializer&) const;
  };
}

#endif // BPKG_MANIFEST