userver: /data/code/userver/libraries/grpc-protovalidate/src/grpc-protovalidate/client/middleware.cpp Source File
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
middleware.cpp
1#include <grpc-protovalidate/client/middleware.hpp>
2
3#include <utility>
4
5#include <google/protobuf/arena.h>
6
7#include <userver/grpc-protovalidate/client/exceptions.hpp>
8#include <userver/grpc-protovalidate/validate.hpp>
9#include <userver/logging/log.hpp>
10#include <userver/utils/assert.hpp>
11
12USERVER_NAMESPACE_BEGIN
13
14namespace grpc_protovalidate::client {
15
16const ValidationSettings& Settings::Get(std::string_view method_name) const {
17 auto it = per_method.find(method_name);
18 return it != per_method.end() ? it->second : global;
19}
20
21Middleware::Middleware(const Settings& settings) : settings_(settings) {}
22
23Middleware::~Middleware() = default;
24
25void Middleware::PostRecvMessage(
26 ugrpc::client::MiddlewareCallContext& context,
27 const google::protobuf::Message& message
28) const {
29 const ValidationSettings& settings = settings_.Get(context.GetCallName());
30 const ValidationResult result = ValidateMessage(message, {.fail_fast = settings.fail_fast});
31 if (result.IsSuccess()) {
32 return;
33 }
34 const ValidationError& error = result.GetError();
35 switch (error.GetType()) {
36 case ValidationError::Type::kInternal:
37 throw ValidatorError(context.GetCallName());
38 case ValidationError::Type::kRule:
39 LOG_WARNING() << error;
40 throw ResponseError(context.GetCallName(), error.GetViolations());
41 }
42 UINVARIANT(false, "Unexpected error type");
43}
44
45} // namespace grpc_protovalidate::client
46
47USERVER_NAMESPACE_END