2 #define SCARAB_API_EXPORTS 11 LOGGER( parselog,
"nonoption_parser" );
19 for(
const std::string& arg : an_args )
34 if( an_arg[0] ==
f_option_starter )
throw error() <<
"Cannot parse an option with the nonoption_parser: " << an_arg;
37 if( t_val_pos != std::string::npos )
41 f_kw_args.merge( t_new_param->as_node() );
58 throw error() <<
"No address for keyword argument with value <" << a_value <<
">";
62 std::string t_top_addr = an_addr.substr( 0, t_div_pos );
66 if( t_new_param->is_node() )
69 std::string t_next_addr = t_div_pos == an_addr.npos ?
"" : an_addr.substr( t_div_pos+1 );
70 add_next( *t_new_param, t_top_addr, t_next_addr, a_value );
74 throw error() <<
"Top param type must be a node; this address is invalid: <" << an_addr <<
">";
86 if( a_next_addr.empty() )
95 std::string t_top_addr = a_next_addr.substr( 0, t_div_pos );
97 std::string t_next_addr = t_div_pos == a_next_addr.npos ?
"" : a_next_addr.substr( t_div_pos+1 );
98 add_next( *t_child, t_top_addr, t_next_addr, a_value );
104 unsigned index = std::stoul( an_addr_in_parent );
106 if( index > t_parent_array.
size() ) t_parent_array.
resize( index+1 );
107 a_parent.
as_array().
assign( std::stoul( an_addr_in_parent ), std::move(t_child) );
111 a_parent.
as_node().
replace( an_addr_in_parent, std::move(t_child) );
115 throw error() <<
"Invalid param type: only nodes and arrays accepted";
123 if( an_addr.empty() )
return std::unique_ptr< param_value >( (
new param_value() ) );
127 for(
const char& ch : an_addr )
129 if( ! std::isdigit( ch ) )
return std::unique_ptr< param_node >(
new param_node() );
132 return std::unique_ptr< param_array >(
new param_array() );
138 if( a_value.empty() )
140 LTRACE( parselog,
"Parsed value as NULL" );
141 return std::unique_ptr< param >(
new param() );
144 else if( a_value ==
"true" )
146 LTRACE( parselog,
"Parsing value (" << a_value <<
") as bool(true)" );
147 return std::unique_ptr< param_value >(
new param_value(
true ) );
149 else if( a_value ==
"false" )
151 LTRACE( parselog,
"Parsing value (" << a_value <<
") as bool(false)" );
152 return std::unique_ptr< param_value >(
new param_value(
false ) );
160 std::stringstream t_conv_double( a_value );
161 if( a_value.find(
'.' ) == a_value.rfind(
'.' ) &&
162 a_value.find(
'-' ) == a_value.rfind(
'-' ) &&
163 ! (t_conv_double >> t_double).fail() )
166 if( a_value.find(
'.' ) != std::string::npos ||
167 a_value.find(
'e' ) != std::string::npos ||
168 a_value.find(
'E' ) != std::string::npos )
171 LTRACE( parselog,
"Parsing value (" << a_value <<
") as double(" << t_double <<
")" );
172 return std::unique_ptr< param_value >(
new param_value( t_double ) );
174 else if( a_value[ 0 ] ==
'-' )
177 LTRACE( parselog,
"Parsing value (" << a_value <<
") as int(" << (int64_t)t_double <<
")" );
178 return std::unique_ptr< param_value >(
new param_value( (int64_t)t_double ) );
183 LTRACE( parselog,
"Parsing value (" << a_value <<
") as uint(" << (uint64_t)t_double <<
")" );
184 return std::unique_ptr< param_value >(
new param_value( (uint64_t)t_double ) );
190 LTRACE( parselog,
"Parsing value (" << a_value <<
") as a string" );
191 return std::unique_ptr< param_value >(
new param_value( a_value ) );
virtual bool is_node() const
void replace(const std::string &a_name, const param &a_value)
Creates a copy of a_value; overwrites if the key exits.
static const char f_option_starter
static const char f_value_separator
void add_next(param &a_parent, const std::string &an_addr_in_parent, const std::string &a_next_addr, const std::string &a_value)
virtual ~nonoption_parser()
param_ptr_t parse_value(const std::string &a_value)
nonoption_parser(std::vector< std::string > an_args)
LOGGER(parselog,"nonoption_parser")
Contains the logger class and macros, based on Kasper's KLogger class.
static const char f_node_separator
std::unique_ptr< param > param_ptr_t
param_ptr_t parse_kw_arg(const std::string &an_addr, const std::string &a_value)
void parse(const std::string &an_arg)
void assign(unsigned a_index, const param &a_value)
param_ptr_t new_param_from_addr(const std::string &an_addr)
virtual bool is_array() const
void resize(unsigned a_size)