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 @ref static-configs-validation "Static configs validation"
61struct Schema final {
62 void UpdateDescription(std::string new_description);
63
64 static Schema EmptyObject();
65
66 bool operator==(const Schema&) const;
67
68 std::string path;
69
70 FieldType type{};
71 std::string description;
72 std::optional<std::string> default_description;
73 std::optional<std::variant<bool, SchemaPtr>> additional_properties;
74 std::optional<std::unordered_map<std::string, SchemaPtr>> properties;
75 std::optional<SchemaPtr> items;
76 std::optional<std::unordered_set<std::string>> enum_values;
77 std::optional<double> minimum;
78 std::optional<double> maximum;
79 std::optional<std::size_t> min_items;
80 std::optional<std::size_t> max_items;
81};
82
83Schema Parse(const formats::yaml::Value& schema, formats::parse::To<Schema>);
84
85formats::yaml::Value Serialize(const Schema& schema, formats::serialize::To<formats::yaml::Value>);
86
87namespace impl {
88
89Schema SchemaFromString(const std::string& yaml_string);
90Schema SchemaFromResource(std::string_view resource_name);
91
92} // namespace impl
93
94} // namespace yaml_config
95
96USERVER_NAMESPACE_END