2025-03-07 22:15:49 +01:00

81 lines
1.4 KiB
C++

#include <seafire/protocol/token.hxx>
namespace seafire::protocol
{
/// Construct a new empty token.
///
token_t::
token_t() = default;
/// Construct a new token from a string.
///
/// \param str The token string.
/// \throws std::invalid_argument Thrown if \a str is invalid.
///
token_t::
token_t(std::string str)
: str_{
validate_token(str)
? std::move(str)
: throw std::invalid_argument{"invalid token"}
}
{}
/// Construct a new token from a string.
///
/// \param str The token string.
/// \throws std::invalid_argument Thrown if \a str is invalid.
///
token_t::
token_t(char const* str)
: str_{
str
? (
validate_token(str)
? str
: throw std::invalid_argument{"invalid token"}
)
: throw std::invalid_argument{"invalid token"}
}
{}
bool
token_t::
empty() const
{
return str().empty();
}
std::string const&
token_t::
str() const
{
return str_;
}
bool
token_t::
validate_token(std::string const& str)
{
// we allow empty tokens for the sake of simplicity.
//
if (str.empty())
return true;
for (auto const& c : str) {
if (!grammar::is_tchar(c))
return false;
}
return true;
}
std::ostream&
operator<<(std::ostream& o, token_t const& t)
{
return o << t.str();
}
} // namespace seafire::protocol