14#include "arcane/core/AxlOptionsBuilder.h"
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/Array.h"
18#include "arcane/utils/JSONWriter.h"
19#include "arcane/utils/ScopedPtr.h"
21#include "arcane/core/DomUtils.h"
22#include "arcane/core/XmlNode.h"
23#include "arcane/core/IXmlDocumentHolder.h"
24#include "arcane/core/CaseNodeNames.h"
32namespace Arcane::AxlOptionsBuilder
45 friend DocumentXmlWriter;
46 friend DocumentJSONWriter;
50 void add(
const std::initializer_list<OneOption>& options)
52 for (
const auto& o : options)
70 m_sub_option = cloned_list.m_p;
77ServiceInstance(
const String& option_name,
const String& service_name,
78 const std::initializer_list<OneOption>& options)
79: OneOption(
Type::CO_ServiceInstance, option_name, OptionList{})
81 m_sub_option->add(options);
82 m_service_name = service_name;
89ServiceInstance(
const String& option_name,
const String& service_name,
90 const OptionList& options)
91: OneOption(
Type::CO_ServiceInstance, option_name, options)
93 m_service_name = service_name;
100ServiceInstance(
const String& option_name,
const String& service_name)
103 m_service_name = service_name;
110Complex(
const String& name,
const std::initializer_list<OneOption>& options)
113 m_sub_option->add(options);
120Complex(
const String& name,
const OptionList& options)
133: m_p(std::make_shared<OneOptionImpl>())
141OptionList(
const std::initializer_list<OneOption>& options)
142: m_p(std::make_shared<OneOptionImpl>())
153 m_p->m_options.add(
OneOption(OneOption::Type::CO_Complex, name, option));
160OptionList& OptionList::
161add(
const std::initializer_list<OneOption>& options)
163 for (
const auto& o : options)
164 m_p->m_options.add(o);
171OptionList OptionList::
175 new_opt.m_p->m_options = m_p->m_options;
186class DocumentXmlWriter
192 auto* doc = domutils::createXmlDocument();
193 XmlNode document_node = doc->documentNode();
194 DocumentXmlWriter writer(d.language());
196 XmlNode root_element = document_node.createAndAppendElement(
"root",
String());
197 root_element.
setAttrValue(cnn.lang_attribute, d.language());
198 XmlNode opt_element = root_element.createAndAppendElement(
"dynamic-options",
String());
199 writer._writeToXml(d.m_options.m_p.get(), opt_element);
208 XmlNode current_element = element.createAndAppendElement(o.m_name, o.
m_value);
209 if (o.m_sub_option.get())
210 _writeToXml(o.m_sub_option.get(), current_element);
215 if (!o.m_function_name.
null()) {
216 String funcname_attr = m_case_node_names.function_ref;
217 current_element.
setAttrValue(funcname_attr, o.m_function_name);
224 explicit DocumentXmlWriter(
const String& lang)
225 : m_case_node_names(lang)
237class DocumentJSONWriter
243 DocumentJSONWriter writer(d.language());
246 return writer.m_json_writer.getBuffer();
254 m_json_writer.write(
"language", doc.language());
255 m_json_writer.write(
"version",
"1");
258 _write(doc.m_options.m_p.get());
279 if (o.m_type == OneOption::Type::CO_ServiceInstance) {
287 if (o.m_type == OneOption::Type::CO_Complex) {
301 if (!o.m_function_name.
null()) {
303 m_json_writer.write(m_case_function_json_name, o.m_function_name);
304 m_json_writer.write(
"$value", o.
m_value);
308 m_json_writer.write(o.m_name, o.
m_value);
313 explicit DocumentJSONWriter(
const String& lang)
314 : m_case_node_names(lang)
316 m_case_function_json_name =
String(
"$") + m_case_node_names.function_ref;
323 String m_case_function_json_name;
332 return DocumentXmlWriter::toXml(d);
349extern "C++" ARCANE_CORE_EXPORT
void
350_testAxlOptionsBuilder()
352 using namespace AxlOptionsBuilder;
353 std::cout <<
"TestOptionList\n";
354 OptionList sub_opt({ Simple(
"max", 35),
356 Simple(
"test", 1) });
358 OptionList service_opt({ Simple(
"service-option1", 42),
359 Simple(
"service-option2", -1.5) });
361 OptionList dco({ Simple(
"toto", 3),
362 Simple(
"titi", 3.1).addFunction(
"func1"),
363 Simple(
"tutu",
"Hello"),
364 Enumeration(
"a",
"vx"),
365 Extended(
"extended1",
"ext"),
366 ServiceInstance(
"my-service1",
"TestService1",
367 { Simple(
"service-option1", 25),
368 Simple(
"service-option2", 3.2) }),
369 ServiceInstance(
"my-service2",
"TestService2"),
371 ServiceInstance(
"my-service3",
"TestService3", service_opt),
375 Simple(
"test", 4) }),
376 Complex(
"sub-opt2", sub_opt) });
380 std::cout <<
"VALUE:" << s <<
"\n";
382 String ref_str =
"<?xml version=\"1.0\"?>\n"
383 "<root xml:lang=\"fr\"><dynamic-options><toto>3</toto><titi fonction=\"func1\">3.1</titi>"
384 "<tutu>Hello</tutu><a>vx</a><extended1>ext</extended1><my-service1 name=\"TestService1\">"
385 "<service-option1>25</service-option1><service-option2>3.2</service-option2></my-service1>"
386 "<my-service2 name=\"TestService2\"/><my-service3 name=\"TestService3\">"
387 "<service-option1>42</service-option1><service-option2>-1.5</service-option2></my-service3>"
388 "<sub-opt1><max>25</max><min>23.2</min><test>4</test></sub-opt1><sub-opt2><max>35</max>"
389 "<min>13.2</min><test>1</test></sub-opt2></dynamic-options></root>\n";
391 ARCANE_FATAL(
"BAD VALUE v={0} expected={1}", s, ref_str);
394 String json_string = DocumentJSONWriter::toJSON(doc);
396 std::ofstream ofile(
"test1.json");
397 ofile << json_string;
399 std::cout <<
"JSON=" << json_string <<
"\n";
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Data set 'ServiceInstance' option.
Base class for a dynamic option.
String m_value
Option name.
String m_service_name
Option value (if CO_Simple option).
OptionList()
Constructs an empty set of options.
XML node names of an Arcane dataset.
Manager of a DOM document.
Encapsulation of an automatically destructing pointer.
Unicode character string.
bool null() const
Returns true if the string is null.
1D data vector with value semantics (STL style).
void setAttrValue(const String &name, const String &value)
Sets the attribute name to the value value.
GenericDocument< UTF8<> > Document
GenericDocument with UTF8 encoding.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --