3 #include "fly/types/string/concepts.hpp"
4 #include "fly/types/string/detail/format_parameter_type.hpp"
5 #include "fly/types/string/detail/traits.hpp"
6 #include "fly/types/string/lexer.hpp"
11 namespace fly::detail {
20 template <fly::StandardCharacter CharType>
24 using view_type =
typename traits::view_type;
34 template <std::
size_t N>
36 const CharType (&format)[N],
37 const ParameterType *parameters,
38 std::size_t parameters_size) noexcept;
57 constexpr std::optional<ParameterType>
parameter_type(std::size_t position);
67 constexpr view_type
view()
const;
97 std::string
error()
const;
108 const ParameterType *m_parameters;
109 std::size_t m_parameters_size;
111 std::size_t m_next_position {0};
112 bool m_expect_no_positions_specified {
false};
113 bool m_expect_all_positions_specified {
false};
115 std::string_view m_error;
119 template <fly::StandardCharacter CharType>
120 template <std::
size_t N>
122 const CharType (&format)[N],
123 const ParameterType *parameters,
124 std::size_t parameters_size) noexcept :
126 m_parameters(parameters),
127 m_parameters_size(parameters_size)
132 template <fly::StandardCharacter CharType>
135 std::size_t position = 0;
137 if (
auto specified_position = m_lexer.consume_number(); specified_position)
139 m_expect_all_positions_specified =
true;
140 position =
static_cast<std::size_t
>(*specified_position);
144 m_expect_no_positions_specified =
true;
145 position = m_next_position++;
148 if (m_expect_all_positions_specified && m_expect_no_positions_specified)
150 on_error(
"Argument position must be provided on all or not on any specifier");
157 template <fly::StandardCharacter CharType>
158 constexpr std::optional<ParameterType>
161 if (position >= m_parameters_size)
163 on_error(
"Argument position exceeds number of provided arguments");
167 return m_parameters[position];
171 template <fly::StandardCharacter CharType>
178 template <fly::StandardCharacter CharType>
181 return m_lexer.view();
185 template <fly::StandardCharacter CharType>
192 template <fly::StandardCharacter CharType>
195 return !m_error.empty();
199 template <fly::StandardCharacter CharType>
202 return std::string(m_error.data(), m_error.size());
Definition: format_parse_context.hpp:22
constexpr std::optional< ParameterType > parameter_type(std::size_t position)
Definition: format_parse_context.hpp:159
std::string error() const
Definition: format_parse_context.hpp:200
constexpr bool has_error() const
Definition: format_parse_context.hpp:193
void on_error(const char *error)
Definition: format_parse_context.hpp:186
constexpr BasicFormatParseContext(const CharType(&format)[N], const ParameterType *parameters, std::size_t parameters_size) noexcept
Definition: format_parse_context.hpp:121
constexpr view_type view() const
Definition: format_parse_context.hpp:179
constexpr std::size_t next_position()
Definition: format_parse_context.hpp:133
constexpr fly::BasicLexer< CharType > & lexer()
Definition: format_parse_context.hpp:172
Definition: traits.hpp:18