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 };
104 for (auto it = json.constBegin(); it != json.constEnd(); ++it) {
105 if (!knownKeys.contains(it.key()))
106 proj.extras.insert(it.key(), it.value());
107 }
108
109 return proj;
110}
111
112//=============================================================================================================
113
114QCborMap MnaProject::toCbor() const
115{
116 // Start from extras to preserve unknown keys
117 QCborMap cbor = QCborMap::fromJsonObject(extras);
118 cbor[QLatin1String("mna_version")] = mnaVersion;
119 cbor[QLatin1String("name")] = name;
120 cbor[QLatin1String("description")] = description;
121 cbor[QLatin1String("created")] = QCborValue(created);
122 cbor[QLatin1String("modified")] = QCborValue(modified);
123
124 QCborArray subjArr;
125 for(const MnaSubject& s : subjects) {
126 subjArr.append(s.toCbor());
127 }
128 cbor[QLatin1String("subjects")] = subjArr;
129
130 QCborArray pipeArr;
131 for(const MnaNode& nd : pipeline) {
132 pipeArr.append(nd.toCbor());
133 }
134 cbor[QLatin1String("pipeline")] = pipeArr;
135
136 return cbor;
137}
138
139//=============================================================================================================
140
141MnaProject MnaProject::fromCbor(const QCborMap& cbor)
142{
143 MnaProject proj;
144 proj.mnaVersion = cbor[QLatin1String("mna_version")].toString();
145 proj.name = cbor[QLatin1String("name")].toString();
146 proj.description = cbor[QLatin1String("description")].toString();
147 proj.created = cbor[QLatin1String("created")].toDateTime();
148 proj.modified = cbor[QLatin1String("modified")].toDateTime();
149
150 const QCborArray subjArr = cbor[QLatin1String("subjects")].toArray();
151 for(const QCborValue& v : subjArr) {
152 proj.subjects.append(MnaSubject::fromCbor(v.toMap()));
153 }
154
155 const QCborArray pipeArr = cbor[QLatin1String("pipeline")].toArray();
156 for(const QCborValue& v : pipeArr) {
157 proj.pipeline.append(MnaNode::fromCbor(v.toMap()));
158 }
159
160 // Capture unknown keys for lossless round-trip
161 static const QSet<QString> knownKeys = {
162 QStringLiteral("mna_version"), QStringLiteral("name"),
163 QStringLiteral("description"), QStringLiteral("created"),
164 QStringLiteral("modified"), QStringLiteral("subjects"),
165 QStringLiteral("pipeline")
166 };
167 QJsonObject cborJson = cbor.toJsonObject();
168 for (auto it = cborJson.constBegin(); it != cborJson.constEnd(); ++it) {
169 if (!knownKeys.contains(it.key()))
170 proj.extras.insert(it.key(), it.value());
171 }
172
173 return proj;
174}
175
176//=============================================================================================================
177
178MnaProject MnaProject::read(const QString& path)
179{
180 return MnaIO::read(path);
181}
182
183//=============================================================================================================
184
185bool MnaProject::write(const MnaProject& project, const QString& path)
186{
187 return MnaIO::write(project, path);
188}
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:75
static MnaNode fromJson(const QJsonObject &json)
Definition mna_node.cpp:124
static MnaNode fromCbor(const QCborMap &cbor)
Definition mna_node.cpp:236
QList< MnaSubject > subjects
Definition mna_project.h:83
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:85
static constexpr const char * CURRENT_SCHEMA_VERSION
Definition mna_project.h:76
QList< MnaNode > pipeline
Definition mna_project.h:84
QCborMap toCbor() const
static MnaSubject fromJson(const QJsonObject &json)
static MnaSubject fromCbor(const QCborMap &cbor)