libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
variantspec.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
13#include <promeki/namespace.h>
14#include <promeki/variant.h>
15#include <promeki/enum.h>
16#include <promeki/list.h>
17#include <promeki/string.h>
18#include <promeki/uniqueptr.h>
19#include <promeki/error.h>
20#include <promeki/textstream.h>
21
22PROMEKI_NAMESPACE_BEGIN
23
73class VariantSpec {
74 public:
76 using Type = DataTypeID;
77
79 using TypeList = ::promeki::List<Type>;
80
82 VariantSpec() = default;
83
89 VariantSpec &setType(Type type) {
90 _types.clear();
91 _types.pushToBack(type);
92 return *this;
93 }
94
100 VariantSpec &setTypes(std::initializer_list<Type> types) {
101 _types.clear();
102 for (auto t : types) _types.pushToBack(t);
103 return *this;
104 }
105
111 VariantSpec &setDefault(const Variant &val) {
112 _default = val;
113 return *this;
114 }
115
122 VariantSpec &setRange(const Variant &min, const Variant &max) {
123 _min = min;
124 _max = max;
125 return *this;
126 }
127
133 VariantSpec &setMin(const Variant &min) {
134 _min = min;
135 return *this;
136 }
137
143 VariantSpec &setMax(const Variant &max) {
144 _max = max;
145 return *this;
146 }
147
158 VariantSpec &setEnumType(Enum::Type enumType) {
159 _enumType = enumType;
160 return *this;
161 }
162
168 VariantSpec &setDescription(const String &desc) {
169 _description = desc;
170 return *this;
171 }
172
186 VariantSpec &setElementSpec(const VariantSpec &spec);
187
200 VariantSpec &setValueSpec(const VariantSpec &spec);
201
206 const TypeList &types() const { return _types; }
207
212 bool isPolymorphic() const { return _types.size() > 1; }
213
222 bool acceptsType(Type type) const;
223
228 const Variant &defaultValue() const { return _default; }
229
234 bool hasMin() const { return _min.isValid(); }
235
240 bool hasMax() const { return _max.isValid(); }
241
246 bool hasRange() const { return _min.isValid() || _max.isValid(); }
247
252 const Variant &rangeMin() const { return _min; }
253
258 const Variant &rangeMax() const { return _max; }
259
264 bool hasEnumType() const { return _enumType.isValid(); }
265
270 Enum::Type enumType() const { return _enumType; }
271
276 const String &description() const { return _description; }
277
281 bool hasElementSpec() const { return _elementSpec.isValid(); }
282
287 const VariantSpec *elementSpec() const;
288
292 bool hasValueSpec() const { return _valueSpec.isValid(); }
293
298 const VariantSpec *valueSpec() const;
299
304 bool isValid() const { return !_types.isEmpty() || _default.isValid(); }
305
323 bool validate(const Variant &value, Error *err = nullptr) const;
324
325 // ============================================================
326 // Formatting
327 // ============================================================
328
339 String typeName() const;
340
347 String rangeString() const;
348
357 String defaultString() const;
358
359 // ============================================================
360 // String parsing
361 // ============================================================
362
388 Variant coerce(const Variant &val, Error *err = nullptr) const;
389
409 Variant parseString(const String &str, Error *err = nullptr) const;
410
411 // ============================================================
412 // Help output
413 // ============================================================
414
428 String detailsString() const;
429
430 // ============================================================
431 // Conversion
432 // ============================================================
433
442 operator Variant() const { return _default; }
443
448 VariantSpec(const VariantSpec &other);
449 VariantSpec(VariantSpec &&other) noexcept = default;
450 VariantSpec &operator=(const VariantSpec &other);
451 VariantSpec &operator=(VariantSpec &&other) noexcept = default;
452 ~VariantSpec() = default;
453
454 private:
455 TypeList _types;
456 Variant _default;
457 Variant _min;
458 Variant _max;
459 Enum::Type _enumType;
460 String _description;
461 UniquePtr<VariantSpec> _elementSpec; // for TypeVariantList
462 UniquePtr<VariantSpec> _valueSpec; // for TypeVariantMap
463};
464
465PROMEKI_NAMESPACE_END
466
467#endif // PROMEKI_ENABLE_CORE