v2.0.0
Loading...
Searching...
No Matches
mna_project.cpp
Go to the documentation of this file.
1//=============================================================================================================
34
35//=============================================================================================================
36// INCLUDES
37//=============================================================================================================
38
39#include "mna_project.h"
40#include "mna_io.h"
41
42#include <QJsonArray>
43#include <QCborArray>
44
45//=============================================================================================================
46// USED NAMESPACES
47//=============================================================================================================
48
49using namespace MNALIB;
50
51//=============================================================================================================
52// DEFINE METHODS
53//=============================================================================================================
54
57 , created(QDateTime::currentDateTimeUtc())
58 , modified(QDateTime::currentDateTimeUtc())
59{
60}
61
62//=============================================================================================================
63
64QJsonObject MnaProject::toJson() const
65{
66 // Start from extras to preserve unknown keys
67 QJsonObject json = extras;
68 json[QLatin1String("mna_version")] = mnaVersion;
69 json[QLatin1String("name")] = name;
70 json[QLatin1String("description")] = description;
71 json[QLatin1String("created")] = created.toString(Qt::ISODate);
72 json[QLatin1String("modified")] = modified.toString(Qt::ISODate);
73
74 QJsonArray subjArr;
75 for(const MnaSubject& s : subjects) {
76 subjArr.append(s.toJson());
77 }
78 json[QLatin1String("subjects")] = subjArr;
79
80 QJsonArray pipeArr;
81 for(const MnaNode& nd : pipeline) {
82 pipeArr.append(nd.toJson());
83 }
84 json[QLatin1String("pipeline")] = pipeArr;
85
86 return json;
87}
88
89//=============================================================================================================
90
91MnaProject MnaProject::fromJson(const QJsonObject& json)
92{
93 MnaProject proj;
94 proj.mnaVersion = json[QLatin1String("mna_version")].toString();
95 proj.name = json[QLatin1String("name")].toString();
96 proj.description = json[QLatin1String("description")].toString();
97 proj.created = QDateTime::fromString(json[QLatin1String("created")].toString(), Qt::ISODate);
98 proj.modified = QDateTime::fromString(json[QLatin1String("modified")].toString(), Qt::ISODate);
99
100 const QJsonArray subjArr = json[QLatin1String("subjects")].toArray();
101 for(const QJsonValue& v : subjArr) {
102 proj.subjects.append(MnaSubject::fromJson(v.toObject()));
103 }
104
105 const QJsonArray pipeArr = json[QLatin1String("pipeline")].toArray();
106 for(const QJsonValue& v : pipeArr) {
107 proj.pipeline.append(MnaNode::fromJson(v.toObject()));
108 }
109
110 // Capture unknown keys for lossless round-trip
111 static const QSet<QString> knownKeys = {
112 QStringLiteral("mna_version"), QStringLiteral("name"),
113 QStringLiteral("description"), QStringLiteral("created"),
114 QStringLiteral("modified"), QStringLiteral("subjects"),
115 QStringLiteral("pipeline")
116 };
117 for (auto it = json.constBegin(); it != json.constEnd(); ++it) {
118 if (!knownKeys.contains(it.key()))
119 proj.extras.insert(it.key(), it.value());
120 }
121
122 return proj;
123}
124
125//=============================================================================================================
126
127QCborMap MnaProject::toCbor() const
128{
129 // Start from extras to preserve unknown keys
130 QCborMap cbor = QCborMap::fromJsonObject(extras);
131 cbor[QLatin1String("mna_version")] = mnaVersion;
132 cbor[QLatin1String("name")] = name;
133 cbor[QLatin1String("description")] = description;
134 cbor[QLatin1String("created")] = QCborValue(created);
135 cbor[QLatin1String("modified")] = QCborValue(modified);
136
137 QCborArray subjArr;
138 for(const MnaSubject& s : subjects) {
139 subjArr.append(s.toCbor());
140 }
141 cbor[QLatin1String("subjects")] = subjArr;
142
143 QCborArray pipeArr;
144 for(const MnaNode& nd : pipeline) {
145 pipeArr.append(nd.toCbor());
146 }
147 cbor[QLatin1String("pipeline")] = pipeArr;
148
149 return cbor;
150}
151
152//=============================================================================================================
153
154MnaProject MnaProject::fromCbor(const QCborMap& cbor)
155{
156 MnaProject proj;
157 proj.mnaVersion = cbor[QLatin1String("mna_version")].toString();
158 proj.name = cbor[QLatin1String("name")].toString();
159 proj.description = cbor[QLatin1String("description")].toString();
160 proj.created = cbor[QLatin1String("created")].toDateTime();
161 proj.modified = cbor[QLatin1String("modified")].toDateTime();
162
163 const QCborArray subjArr = cbor[QLatin1String("subjects")].toArray();
164 for(const QCborValue& v : subjArr) {
165 proj.subjects.append(MnaSubject::fromCbor(v.toMap()));
166 }
167
168 const QCborArray pipeArr = cbor[QLatin1String("pipeline")].toArray();
169 for(const QCborValue& v : pipeArr) {
170 proj.pipeline.append(MnaNode::fromCbor(v.toMap()));
171 }
172
173 // Capture unknown keys for lossless round-trip
174 static const QSet<QString> knownKeys = {
175 QStringLiteral("mna_version"), QStringLiteral("name"),
176 QStringLiteral("description"), QStringLiteral("created"),
177 QStringLiteral("modified"), QStringLiteral("subjects"),
178 QStringLiteral("pipeline")
179 };
180 QJsonObject cborJson = cbor.toJsonObject();
181 for (auto it = cborJson.constBegin(); it != cborJson.constEnd(); ++it) {
182 if (!knownKeys.contains(it.key()))
183 proj.extras.insert(it.key(), it.value());
184 }
185
186 return proj;
187}
188
189//=============================================================================================================
190
191MnaProject MnaProject::read(const QString& path)
192{
193 return MnaIO::read(path);
194}
195
196//=============================================================================================================
197
198bool MnaProject::write(const MnaProject& project, const QString& path)
199{
200 return MnaIO::write(project, path);
201}
MnaIO class declaration.
MnaProject class declaration.
MNE Analysis Container Format (mna/mnx).
static bool write(const MnaProject &project, const QString &path)
Definition mna_io.cpp:86
static MnaProject read(const QString &path)
Definition mna_io.cpp:69
Graph node representing a processing step.
Definition mna_node.h:75
static MnaNode fromJson(const QJsonObject &json)
Definition mna_node.cpp:134
static MnaNode fromCbor(const QCborMap &cbor)
Definition mna_node.cpp:246
QList< MnaSubject > subjects
Definition mna_project.h:88
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:90
static constexpr const char * CURRENT_SCHEMA_VERSION
Definition mna_project.h:81
QList< MnaNode > pipeline
Definition mna_project.h:89
QCborMap toCbor() const
static MnaSubject fromJson(const QJsonObject &json)
static MnaSubject fromCbor(const QCborMap &cbor)