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/// Helper class for Schema that hides `path` from operator== in Schema.
57/// `path` is ignored, because it serves a purely diagnostic purpose.
59 bool operator==(const PathSupplementary&) const noexcept;
60
61 std::string path;
62};
63
64/// @ingroup userver_universal
65///
66/// @brief JSON Schema-like type definition
67///
68/// @see https://json-schema.org/specification
69/// @see @ref static-configs-validation "Static configs validation"
70struct Schema final : public PathSupplementary {
71 void UpdateDescription(std::string new_description);
72
73 static Schema EmptyObject();
74
75 bool operator==(const Schema&) const noexcept;
76
77 FieldType type{};
78 std::string description;
79 std::optional<std::string> default_description;
80 std::optional<std::variant<bool, SchemaPtr>> additional_properties;
81 std::optional<std::unordered_map<std::string, SchemaPtr>> properties;
82 std::optional<SchemaPtr> items;
83 std::optional<std::unordered_set<std::string>> enum_values;
84 std::optional<double> minimum;
85 std::optional<double> maximum;
86 std::optional<std::size_t> min_items;
87 std::optional<std::size_t> max_items;
88 std::optional<std::unordered_set<std::string>> required;
89};
90
91Schema Parse(const formats::yaml::Value& schema, formats::parse::To<Schema>);
92
93formats::yaml::Value Serialize(const Schema& schema, formats::serialize::To<formats::yaml::Value>);
94
95namespace impl {
96
97Schema SchemaFromString(const std::string& yaml_string);
98Schema SchemaFromResource(std::string_view resource_name);
99
100} // namespace impl
101
102} // namespace yaml_config
103
104USERVER_NAMESPACE_END