v2.0.0
Loading...
Searching...
No Matches
mna_project.cpp
Go to the documentation of this file.
1//=============================================================================================================
21
22//=============================================================================================================
23// INCLUDES
24//=============================================================================================================
25
26#include "mna_project.h"
27#include "mna_io.h"
28
29#include <QJsonArray>
30#include <QCborArray>
31
32//=============================================================================================================
33// USED NAMESPACES
34//=============================================================================================================
35
36using namespace MNALIB;
37
38//=============================================================================================================
39// DEFINE METHODS
40//=============================================================================================================
41
44, created(QDateTime::currentDateTimeUtc())
45, modified(QDateTime::currentDateTimeUtc())
46{
47}
48
49//=============================================================================================================
50
51QJsonObject MnaProject::toJson() const
52{
53 // Start from extras to preserve unknown keys
54 QJsonObject json = extras;
55 json[QLatin1String("mna_version")] = mnaVersion;
56 json[QLatin1String("name")] = name;
57 json[QLatin1String("description")] = description;
58 json[QLatin1String("created")] = created.toString(Qt::ISODate);
59 json[QLatin1String("modified")] = modified.toString(Qt::ISODate);
60
61 QJsonArray subjArr;
62 for (const MnaSubject& s : subjects) {
63 subjArr.append(s.toJson());
64 }
65 json[QLatin1String("subjects")] = subjArr;
66
67 QJsonArray pipeArr;
68 for (const MnaNode& nd : pipeline) {
69 pipeArr.append(nd.toJson());
70 }
71 json[QLatin1String("pipeline")] = pipeArr;
72
73 return json;
74}
75
76//=============================================================================================================
77
78MnaProject MnaProject::fromJson(const QJsonObject& json)
79{
80 MnaProject proj;
81 proj.mnaVersion = json[QLatin1String("mna_version")].toString();
82 proj.name = json[QLatin1String("name")].toString();
83 proj.description = json[QLatin1String("description")].toString();
84 proj.created = QDateTime::fromString(json[QLatin1String("created")].toString(), Qt::ISODate);
85 proj.modified = QDateTime::fromString(json[QLatin1String("modified")].toString(), Qt::ISODate);
86
87 const QJsonArray subjArr = json[QLatin1String("subjects")].toArray();
88 for (const QJsonValue& v : subjArr) {
89 proj.subjects.append(MnaSubject::fromJson(v.toObject()));
90 }
91
92 const QJsonArray pipeArr = json[QLatin1String("pipeline")].toArray();
93 for (const QJsonValue& v : pipeArr) {
94 proj.pipeline.append(MnaNode::fromJson(v.toObject()));
95 }
96
97 // Capture unknown keys for lossless round-trip
98 static const QSet<QString> knownKeys = {
99 QStringLiteral("mna_version"), QStringLiteral("name"),
100 QStringLiteral("description"), QStringLiteral("created"),
101 QStringLiteral("modified"), QStringLiteral("subjects"),
102 QStringLiteral("pipeline")};
103 for (auto it = json.constBegin(); it != json.constEnd(); ++it) {
104 if (!knownKeys.contains(it.key()))
105 proj.extras.insert(it.key(), it.value());
106 }
107
108 return proj;
109}
110
111//=============================================================================================================
112
113QCborMap MnaProject::toCbor() const
114{
115 // Start from extras to preserve unknown keys
116 QCborMap cbor = QCborMap::fromJsonObject(extras);
117 cbor[QLatin1String("mna_version")] = mnaVersion;
118 cbor[QLatin1String("name")] = name;
119 cbor[QLatin1String("description")] = description;
120 cbor[QLatin1String("created")] = QCborValue(created);
121 cbor[QLatin1String("modified")] = QCborValue(modified);
122
123 QCborArray subjArr;
124 for (const MnaSubject& s : subjects) {
125 subjArr.append(s.toCbor());
126 }
127 cbor[QLatin1String("subjects")] = subjArr;
128
129 QCborArray pipeArr;
130 for (const MnaNode& nd : pipeline) {
131 pipeArr.append(nd.toCbor());
132 }
133 cbor[QLatin1String("pipeline")] = pipeArr;
134
135 return cbor;
136}
137
138//=============================================================================================================
139
140MnaProject MnaProject::fromCbor(const QCborMap& cbor)
141{
142 MnaProject proj;
143 proj.mnaVersion = cbor[QLatin1String("mna_version")].toString();
144 proj.name = cbor[QLatin1String("name")].toString();
145 proj.description = cbor[QLatin1String("description")].toString();
146 proj.created = cbor[QLatin1String("created")].toDateTime();
147 proj.modified = cbor[QLatin1String("modified")].toDateTime();
148
149 const QCborArray subjArr = cbor[QLatin1String("subjects")].toArray();
150 for (const QCborValue& v : subjArr) {
151 proj.subjects.append(MnaSubject::fromCbor(v.toMap()));
152 }
153
154 const QCborArray pipeArr = cbor[QLatin1String("pipeline")].toArray();
155 for (const QCborValue& v : pipeArr) {
156 proj.pipeline.append(MnaNode::fromCbor(v.toMap()));
157 }
158
159 // Capture unknown keys for lossless round-trip
160 static const QSet<QString> knownKeys = {
161 QStringLiteral("mna_version"), QStringLiteral("name"),
162 QStringLiteral("description"), QStringLiteral("created"),
163 QStringLiteral("modified"), QStringLiteral("subjects"),
164 QStringLiteral("pipeline")};
165 QJsonObject cborJson = cbor.toJsonObject();
166 for (auto it = cborJson.constBegin(); it != cborJson.constEnd(); ++it) {
167 if (!knownKeys.contains(it.key()))
168 proj.extras.insert(it.key(), it.value());
169 }
170
171 return proj;
172}
173
174//=============================================================================================================
175
176MnaProject MnaProject::read(const QString& path)
177{
178 return MnaIO::read(path);
179}
180
181//=============================================================================================================
182
183bool MnaProject::write(const MnaProject& project, const QString& path)
184{
185 return MnaIO::write(project, path);
186}
Reader and writer for MNA project containers — .mna (JSON, human-editable) and .mnx (CBOR,...
Top-level MNA container binding subjects, processing pipeline, schema version and project metadata.
MNE Analysis Container Format (mna/mnx).
static bool write(const MnaProject &project, const QString &path)
Definition mna_io.cpp:75
static MnaProject read(const QString &path)
Definition mna_io.cpp:58
Single executable step in an MNA pipeline graph, with attributes, typed ports, exec mode,...
Definition mna_node.h:77
static MnaNode fromJson(const QJsonObject &json)
Definition mna_node.cpp:131
static MnaNode fromCbor(const QCborMap &cbor)
Definition mna_node.cpp:242
QList< MnaSubject > subjects
Definition mna_project.h:86
QJsonObject toJson() const
static bool write(const MnaProject &project, const QString &path)
static MnaProject fromJson(const QJsonObject &json)
static MnaProject read(const QString &path)
static MnaProject fromCbor(const QCborMap &cbor)
QJsonObject extras
Definition mna_project.h:88
static constexpr const char * CURRENT_SCHEMA_VERSION
Definition mna_project.h:79
QList< MnaNode > pipeline
Definition mna_project.h:87
QCborMap toCbor() const
static MnaSubject fromJson(const QJsonObject &json)
static MnaSubject fromCbor(const QCborMap &cbor)