AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Acore::Impl::ChatCommands::ArgInfo< T, std::enable_if_t< std::is_enum_v< T > > > Struct Template Reference

#include "ChatCommandArgs.h"

Public Types

using SearchMap = std::map< std::string_view, Optional< T >, StringCompareLessI_T >
 

Static Public Member Functions

static SearchMap MakeSearchMap ()
 
static T const * Match (std::string_view s)
 
static ChatCommandResult TryConsume (T &val, ChatHandler const *handler, std::string_view args)
 

Static Public Attributes

static SearchMap const _map = MakeSearchMap()
 

Detailed Description

template<typename T>
struct Acore::Impl::ChatCommands::ArgInfo< T, std::enable_if_t< std::is_enum_v< T > > >

Member Typedef Documentation

◆ SearchMap

template<typename T >
using Acore::Impl::ChatCommands::ArgInfo< T, std::enable_if_t< std::is_enum_v< T > > >::SearchMap = std::map<std::string_view, Optional<T>, StringCompareLessI_T>

Member Function Documentation

◆ MakeSearchMap()

template<typename T >
static SearchMap Acore::Impl::ChatCommands::ArgInfo< T, std::enable_if_t< std::is_enum_v< T > > >::MakeSearchMap ( )
inlinestatic
132 {
133 SearchMap map;
134 for (T val : EnumUtils::Iterate<T>())
135 {
136 EnumText text = EnumUtils::ToString(val);
137
138 std::string_view title(text.Title);
139 std::string_view constant(text.Constant);
140
141 auto [constantIt, constantNew] = map.try_emplace(title, val);
142 if (!constantNew)
143 constantIt->second = std::nullopt;
144
145 if (title != constant)
146 {
147 auto [titleIt, titleNew] = map.try_emplace(title, val);
148 if (!titleNew)
149 titleIt->second = std::nullopt;
150 }
151 }
152 return map;
153 }
Definition: SmartEnum.h:25
char const *const Constant
Definition: SmartEnum.h:28
char const *const Title
Definition: SmartEnum.h:30
static EnumText ToString(Enum value)
Definition: SmartEnum.h:53
std::map< std::string_view, Optional< T >, StringCompareLessI_T > SearchMap
Definition: ChatCommandArgs.h:130

References EnumText::Constant, EnumText::Title, and EnumUtils::ToString().

◆ Match()

template<typename T >
static T const * Acore::Impl::ChatCommands::ArgInfo< T, std::enable_if_t< std::is_enum_v< T > > >::Match ( std::string_view  s)
inlinestatic
158 {
159 auto it = _map.lower_bound(s);
160 if (it == _map.end() || !StringStartsWithI(it->first, s)) // not a match
161 return nullptr;
162
163 if (!StringEqualI(it->first, s)) // we don't have an exact match - check if it is unique
164 {
165 auto it2 = it;
166 ++it2;
167 if ((it2 != _map.end()) && StringStartsWithI(it2->first, s)) // not unique
168 return nullptr;
169 }
170
171 if (it->second)
172 return &*it->second;
173 else
174 return nullptr;
175 }
bool StringEqualI(std::string_view a, std::string_view b)
Definition: Util.cpp:587
bool StringStartsWithI(std::string_view haystack, std::string_view needle)
Definition: Util.h:402
static SearchMap const _map
Definition: ChatCommandArgs.h:155

References StringEqualI(), and StringStartsWithI().

◆ TryConsume()

template<typename T >
static ChatCommandResult Acore::Impl::ChatCommands::ArgInfo< T, std::enable_if_t< std::is_enum_v< T > > >::TryConsume ( T &  val,
ChatHandler const *  handler,
std::string_view  args 
)
inlinestatic
178 {
179 std::string_view strVal;
180 ChatCommandResult next1 = ArgInfo<std::string_view>::TryConsume(strVal, handler, args);
181 if (next1)
182 {
183 if (T const* match = Match(strVal))
184 {
185 val = *match;
186 return next1;
187 }
188 }
189
190 // Value not found. Try to parse arg as underlying type and cast it to enum type
191 using U = std::underlying_type_t<T>;
192 U uVal = 0;
193 if (ChatCommandResult next2 = ArgInfo<U>::TryConsume(uVal, handler, args))
194 {
195 if (EnumUtils::IsValid<T>(uVal))
196 {
197 val = static_cast<T>(uVal);
198 return next2;
199 }
200 }
201
202 if (next1)
203 return FormatAcoreString(handler, LANG_CMDPARSER_STRING_VALUE_INVALID, STRING_VIEW_FMT_ARG(strVal), GetTypeName<T>().c_str());
204 else
205 return next1;
206 }
#define STRING_VIEW_FMT_ARG(str)
Definition: Define.h:101
@ LANG_CMDPARSER_STRING_VALUE_INVALID
Definition: Language.h:1011
std::string FormatAcoreString(ChatHandler const *handler, AcoreStrings which, Ts &&... args)
Definition: ChatCommandHelpers.h:126
static T const * Match(std::string_view s)
Definition: ChatCommandArgs.h:157
Definition: ChatCommandHelpers.h:101

References Acore::Impl::ChatCommands::FormatAcoreString(), LANG_CMDPARSER_STRING_VALUE_INVALID, and STRING_VIEW_FMT_ARG.

Member Data Documentation

◆ _map

template<typename T >
SearchMap const Acore::Impl::ChatCommands::ArgInfo< T, std::enable_if_t< std::is_enum_v< T > > >::_map = MakeSearchMap()
inlinestatic