| 201 | ); |
| 202 | |
| 203 | std::unique_ptr<FormElement> MakeFormElement(json& element) |
| 204 | { |
| 205 | if (!element.is_object()) |
| 206 | throw std::invalid_argument { "Form element must be a json object." }; |
| 207 | if (!element.contains("name")) |
| 208 | throw std::invalid_argument{ "Form element must contain 'name' property. \nInvalid element:\n" + element.dump(4) }; |
| 209 | if (!element.contains("type")) |
| 210 | throw std::invalid_argument{ "Form element '" + element["name"].get<std::string>() + "' must contain 'type' property." }; |
| 211 | |
| 212 | switch (element["type"].get<FormElement::Type>()) |
| 213 | { |
| 214 | case FormElement::Type::Uint8: |
| 215 | return std::make_unique<NumericFormElement<uint8_t>>(element); |
| 216 | case FormElement::Type::Uint16: |
| 217 | return std::make_unique<NumericFormElement<uint16_t>>(element); |
| 218 | case FormElement::Type::Uint32: |
| 219 | return std::make_unique<NumericFormElement<uint32_t>>(element); |
| 220 | case FormElement::Type::Uint64: |
| 221 | return std::make_unique<NumericFormElement<uint64_t>>(element); |
| 222 | case FormElement::Type::Int8: |
| 223 | return std::make_unique<NumericFormElement<int8_t>>(element); |
| 224 | case FormElement::Type::Int16: |
| 225 | return std::make_unique<NumericFormElement<int16_t>>(element); |
| 226 | case FormElement::Type::Int32: |
| 227 | return std::make_unique<NumericFormElement<int32_t>>(element); |
| 228 | case FormElement::Type::Int64: |
| 229 | return std::make_unique<NumericFormElement<int64_t>>(element); |
| 230 | case FormElement::Type::Float: |
| 231 | return std::make_unique<NumericFormElement<float>>(element); |
| 232 | case FormElement::Type::Boolean: |
| 233 | return std::make_unique<BooleanFormElement>(element); |
| 234 | case FormElement::Type::String: |
| 235 | return std::make_unique<StringFormElement>(element); |
| 236 | case FormElement::Type::Ip: |
| 237 | return std::make_unique<IpFormElement>(element); |
| 238 | case FormElement::Type::Binary: |
| 239 | return std::make_unique<BinaryFormElement>(element); |
| 240 | default: |
| 241 | throw std::runtime_error("Unknown form argument type: \"" + element["type"].get<std::string>() + '"'); |
| 242 | } |
| 243 | } |
| 244 | } |