Toast Engine
Loading...
Searching...
No Matches
schema.hpp
Go to the documentation of this file.
1
8
9#pragma once
10
11#include "core_types.hpp"
12#include "data_value.hpp"
13
14#include <map>
15#include <optional>
16#include <string>
17#include <vector>
18
19namespace assets {
20
21struct TOAST_API TypeSwitchCase {
22 std::string case_value;
23 DataType type {DataType::null};
24 std::optional<DataValue> default_value;
25};
26
27struct TOAST_API TypeSwitch {
28 std::string field;
29 std::vector<TypeSwitchCase> cases;
30};
31
35struct TOAST_API SchemaField {
36 std::string name;
37 DataType type {DataType::null};
38
39 bool is_array {false};
40 std::string struct_type;
41
42 std::optional<DataValue> default_value;
43 std::string description;
44
45 std::optional<double> min;
46 std::optional<double> max;
47
48 std::string asset_type;
49 std::string node_type;
50 std::vector<std::string> variants;
51 std::vector<std::string> enum_options;
52 std::optional<TypeSwitch> type_switch;
53
54 std::vector<SchemaField> children;
55};
56
60class TOAST_API Schema : public Asset {
61public:
62 explicit Schema(std::string_view json_content);
63
64 [[nodiscard]]
65 auto type() const -> std::string_view override {
66 return "schema";
67 }
68
69 [[nodiscard]]
70 auto title() const -> std::string_view {
71 return m_title;
72 }
73
74 [[nodiscard]]
75 auto isValid() const noexcept -> bool {
76 return m_valid;
77 }
78
79 [[nodiscard]]
80 auto fields() const -> const std::vector<SchemaField>& {
81 return m_fields;
82 }
83
84 [[nodiscard]]
85 auto hasDefinition(std::string_view name) const noexcept -> bool;
86
87 [[nodiscard]]
88 auto getDefinition(std::string_view name) const -> const std::vector<SchemaField>*;
89
90 [[nodiscard]]
91 auto definitions() const -> const std::map<std::string, std::vector<SchemaField>>& {
92 return m_definitions;
93 }
94
96 [[nodiscard]]
97 auto discriminatorOf(std::string_view definition) const -> std::string_view;
98
99private:
100 std::string m_title;
101 bool m_valid {true};
102 std::vector<SchemaField> m_fields;
103 std::map<std::string, std::vector<SchemaField>> m_definitions;
104 std::map<std::string, std::string> m_discriminators;
105
107 static auto parseOneField(const std::string& name, const json_t& properties) -> SchemaField;
108
110 static void parseFields(const json_t& properties, std::vector<SchemaField>& out);
111
113 static auto parseDefault(DataType t, bool is_array, const json_t& j_value) -> DataValue;
114
116 static auto toastTypeOf(const std::string& x_type) -> DataType;
117
123 void resolveStructRefs(std::vector<SchemaField>& fields);
124};
125
126}
Typed value for TOML files.
Definition data_value.hpp:50
auto discriminatorOf(std::string_view definition) const -> std::string_view
Definition schema.cpp:60
Base types for the asset system.
Recursive typed value for schema-driven TOML data assets.
Descriptor for one field in a schema.
Definition schema.hpp:35
std::string asset_type
x-toast-asset-type: asset subtype constraint for asset_t fields
Definition schema.hpp:48
std::vector< std::string > enum_options
"enum": allowed string values, for x-toast-type "enum" fields
Definition schema.hpp:51
std::string node_type
x-toast-node-type: node subtype constraint for node_t fields
Definition schema.hpp:49
std::vector< std::string > variants
x-toast-variants: discriminator values this field applies to
Definition schema.hpp:50
std::optional< TypeSwitch > type_switch
x-toast-type-switch: type depends on a root controller field
Definition schema.hpp:52
Definition schema.hpp:21
Definition schema.hpp:27
std::string field
Name of the root-level controller field.
Definition schema.hpp:28