aboutsummaryrefslogtreecommitdiff
path: root/bpkg/manifest
blob: bf17a643923a2e60e50f6982e927e367a2fb6d2f (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
// 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
{
  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;
  };

  struct manifest
  {
    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;
  };

  using manifests = std::vector<manifest>;
}

#endif // BPKG_MANIFEST