63 lines
1.8 KiB
C
63 lines
1.8 KiB
C
|
#ifndef __TEMPLATESEGMENTRULE_H__
|
||
|
#define __TEMPLATESEGMENTRULE_H__
|
||
|
|
||
|
#include <boost/url/error_types.hpp>
|
||
|
#include <boost/url/grammar/delim_rule.hpp>
|
||
|
#include <boost/url/grammar/optional_rule.hpp>
|
||
|
#include <boost/url/grammar/range_rule.hpp>
|
||
|
#include <boost/url/grammar/tuple_rule.hpp>
|
||
|
#include <boost/url/pct_string_view.hpp>
|
||
|
|
||
|
class TemplateSegment {
|
||
|
friend class TemplateSegmentRule;
|
||
|
|
||
|
public:
|
||
|
enum class Modifier {
|
||
|
None,
|
||
|
Optional, // {id?}
|
||
|
Star, // {id*}
|
||
|
Plus // {id+}
|
||
|
};
|
||
|
|
||
|
public:
|
||
|
bool isLiteral() const;
|
||
|
bool isStar() const;
|
||
|
bool isPlus() const;
|
||
|
bool isOptional() const;
|
||
|
bool hasModifier() const;
|
||
|
boost::urls::string_view id() const;
|
||
|
boost::urls::string_view string() const;
|
||
|
bool match(boost::urls::pct_string_view segement) const;
|
||
|
bool operator==(const TemplateSegment &other) const;
|
||
|
|
||
|
// segments have precedence:
|
||
|
// - literal
|
||
|
// - unique
|
||
|
// - optional
|
||
|
// - plus
|
||
|
// - star
|
||
|
bool operator<(const TemplateSegment &other) const;
|
||
|
|
||
|
private:
|
||
|
Modifier modifier = Modifier::None;
|
||
|
std::string m_string;
|
||
|
bool m_isLiteral = true;
|
||
|
};
|
||
|
|
||
|
class TemplateSegmentRule {
|
||
|
public:
|
||
|
using value_type = TemplateSegment;
|
||
|
boost::urls::result<value_type> parse(char const *&iterator, char const *end) const noexcept;
|
||
|
};
|
||
|
|
||
|
constexpr auto templateSegmentRule = TemplateSegmentRule{};
|
||
|
|
||
|
constexpr auto templatePathRule = boost::urls::grammar::tuple_rule(
|
||
|
boost::urls::grammar::squelch(boost::urls::grammar::optional_rule(boost::urls::grammar::delim_rule('/'))),
|
||
|
boost::urls::grammar::range_rule(
|
||
|
templateSegmentRule,
|
||
|
boost::urls::grammar::tuple_rule(boost::urls::grammar::squelch(boost::urls::grammar::delim_rule('/')),
|
||
|
templateSegmentRule)));
|
||
|
|
||
|
#endif // __TEMPLATESEGMENTRULE_H__
|