70 lines
2.3 KiB
C++
70 lines
2.3 KiB
C++
//-----------------------------------------------------------------------------
|
|
// ___ __ _ _
|
|
// / _ \__ _ _ __ ___ ___ / /(_)_ __ | | __
|
|
// / /_)/ _` | '__/ __|/ _ \/ / | | '_ \| |/ /
|
|
// / ___/ (_| | | \__ \ __/ /__| | | | | <
|
|
// \/ \__,_|_| |___/\___\____/_|_| |_|_|\_\ .
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
// Author: Kurt Sassenrath
|
|
// Module: Server
|
|
//
|
|
// Session manager concept.
|
|
//
|
|
// Copyright (c) 2023 Kurt Sassenrath.
|
|
//
|
|
// License TBD.
|
|
//-----------------------------------------------------------------------------
|
|
#ifndef session_manager_779b9fc5781fb66f
|
|
#define session_manager_779b9fc5781fb66f
|
|
|
|
#include <boost/asio/awaitable.hpp>
|
|
#include <parselink/proto/session.h>
|
|
#include <parselink/proto/session_id.h>
|
|
|
|
namespace parselink {
|
|
|
|
using boost::asio::awaitable;
|
|
|
|
template <typename T>
|
|
concept sync_session_manager =
|
|
requires(T& mgr, std::string_view sv, proto::session* s) {
|
|
{
|
|
mgr.create_session(sv)
|
|
} -> std::same_as<tl::expected<proto::session*, proto::error>>;
|
|
} && requires(T& mgr, proto::session* s) {
|
|
{
|
|
mgr.destroy_session(s)
|
|
} -> std::same_as<tl::expected<tl::monostate, proto::error>>;
|
|
} && requires(T& mgr, std::string_view user_id) {
|
|
{
|
|
mgr.find(user_id)
|
|
} -> std::same_as<tl::expected<proto::session*, proto::error>>;
|
|
} && requires(T& mgr, proto::session_id const& sid) {
|
|
{
|
|
mgr.find(sid)
|
|
} -> std::same_as<tl::expected<proto::session*, proto::error>>;
|
|
};
|
|
|
|
template <typename T>
|
|
concept async_session_manager = requires(T& mgr, proto::session* s) {
|
|
{
|
|
mgr.create_session()
|
|
} -> std::same_as<awaitable<tl::expected<proto::session*, proto::error>>>;
|
|
} && requires(T& mgr, proto::session* s) {
|
|
{
|
|
mgr.destroy_session(s)
|
|
} -> std::same_as<awaitable<tl::expected<tl::monostate, proto::error>>>;
|
|
} && requires(T& mgr, proto::session_id const& sid) {
|
|
{
|
|
mgr.find(sid)
|
|
} -> std::same_as<awaitable<tl::expected<proto::session*, proto::error>>>;
|
|
};
|
|
|
|
template <typename T>
|
|
concept session_manager = sync_session_manager<T> || async_session_manager<T>;
|
|
|
|
} // namespace parselink
|
|
|
|
#endif // session_manager_779b9fc5781fb66f
|