userver: userver/yaml_config/schema.hpp Source File
Loading...
Searching...
No Matches
schema.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/yaml_config/schema.hpp
4/// @brief @copybrief yaml_config::Schema
5
6#include <memory>
7#include <optional>
8#include <string>
9#include <string_view>
10#include <unordered_map>
11#include <unordered_set>
12#include <variant>
13#include <vector>
14
15#include <userver/formats/yaml_fwd.hpp>
16
17USERVER_NAMESPACE_BEGIN
18
19namespace yaml_config {
20
21struct Schema;
22
23enum class FieldType {
24 kBool,
25 kInteger,
26 kNumber,
27 kString,
28 kArray,
29 kObject,
30};
31
32std::string ToString(FieldType type);
33
34class SchemaPtr final {
35public:
36 explicit SchemaPtr(Schema&& schema);
37
38 SchemaPtr(SchemaPtr&&) noexcept = default;
39 SchemaPtr& operator=(SchemaPtr&&) noexcept = default;
40 SchemaPtr(const SchemaPtr&);
41 SchemaPtr& operator=(const SchemaPtr&);
42
43 const Schema& operator*() const;
44 Schema& operator*();
45 const Schema* operator->() const { return &**this; }
46 Schema* operator->() { return &**this; }
47
48 bool operator==(const SchemaPtr&) const;
49
50private:
51 std::unique_ptr<Schema> schema_;
52};
53
54formats::yaml::Value Serialize(const SchemaPtr& schema, formats::serialize::To<formats::yaml::Value>);
55
56/// @ingroup userver_universal
57///
58/// @brief JSON Schema-like type definition
59///
60/// @see https://json-schema.org/specification
61/// @see @ref static-configs-validation "Static configs validation"
62struct Schema final {
63 void UpdateDescription(std::string new_description);
64
65 static Schema EmptyObject();
66
67 bool operator==(const Schema&) const;
68
69 std::string path;
70
71 FieldType type{};
72 std::string description;
73 std::optional<std::string> default_description;
74 std::optional<std::variant<bool, SchemaPtr>> additional_properties;
75 std::optional<std::unordered_map<std::string, SchemaPtr>> properties;
76 std::optional<SchemaPtr> items;
77 std::optional<std::unordered_set<std::string>> enum_values;
78 std::optional<double> minimum;
79 std::optional<double> maximum;
80 std::optional<std::size_t> min_items;
81 std::optional<std::size_t> max_items;
82 std::optional<std::unordered_set<std::string>> required;
83};
84
85Schema Parse(const formats::yaml::Value& schema, formats::parse::To<Schema>);
86
87formats::yaml::Value Serialize(const Schema& schema, formats::serialize::To<formats::yaml::Value>);
88
89namespace impl {
90
91Schema SchemaFromString(const std::string& yaml_string);
92Schema SchemaFromResource(std::string_view resource_name);
93
94} // namespace impl
95
96} // namespace yaml_config
97
98USERVER_NAMESPACE_END