11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
22PROMEKI_NAMESPACE_BEGIN
76 using Type = DataTypeID;
79 using TypeList = ::promeki::List<Type>;
82 VariantSpec() =
default;
89 VariantSpec &setType(Type type) {
91 _types.pushToBack(type);
100 VariantSpec &setTypes(std::initializer_list<Type> types) {
102 for (
auto t : types) _types.pushToBack(t);
111 VariantSpec &setDefault(
const Variant &val) {
122 VariantSpec &setRange(
const Variant &min,
const Variant &max) {
133 VariantSpec &setMin(
const Variant &min) {
143 VariantSpec &setMax(
const Variant &max) {
158 VariantSpec &setEnumType(Enum::Type enumType) {
159 _enumType = enumType;
168 VariantSpec &setDescription(
const String &desc) {
186 VariantSpec &setElementSpec(
const VariantSpec &spec);
200 VariantSpec &setValueSpec(
const VariantSpec &spec);
206 const TypeList &types()
const {
return _types; }
212 bool isPolymorphic()
const {
return _types.size() > 1; }
222 bool acceptsType(Type type)
const;
228 const Variant &defaultValue()
const {
return _default; }
234 bool hasMin()
const {
return _min.isValid(); }
240 bool hasMax()
const {
return _max.isValid(); }
246 bool hasRange()
const {
return _min.isValid() || _max.isValid(); }
252 const Variant &rangeMin()
const {
return _min; }
258 const Variant &rangeMax()
const {
return _max; }
264 bool hasEnumType()
const {
return _enumType.isValid(); }
270 Enum::Type enumType()
const {
return _enumType; }
276 const String &description()
const {
return _description; }
281 bool hasElementSpec()
const {
return _elementSpec.isValid(); }
287 const VariantSpec *elementSpec()
const;
292 bool hasValueSpec()
const {
return _valueSpec.isValid(); }
298 const VariantSpec *valueSpec()
const;
304 bool isValid()
const {
return !_types.isEmpty() || _default.isValid(); }
323 bool validate(
const Variant &value, Error *err =
nullptr)
const;
339 String typeName()
const;
347 String rangeString()
const;
357 String defaultString()
const;
388 Variant coerce(
const Variant &val, Error *err =
nullptr)
const;
409 Variant parseString(
const String &str, Error *err =
nullptr)
const;
428 String detailsString()
const;
442 operator Variant()
const {
return _default; }
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;
459 Enum::Type _enumType;
461 UniquePtr<VariantSpec> _elementSpec;
462 UniquePtr<VariantSpec> _valueSpec;