errorMessages.h
1 #pragma once
2 
3 #include <map> // std::map
4 #include <memory> // std::shared_ptr
5 #include <set> // std::set
6 #include <string> // std::string
7 
8 #include <morphio/mut/modifiers.h>
9 #include <morphio/mut/section.h>
10 
11 namespace morphio {
13 void set_maximum_warnings(int n_warnings);
15 void set_raise_warnings(bool is_raise);
17 void set_ignored_warning(Warning warning, bool ignore = true);
19 void set_ignored_warning(const std::vector<Warning>& warning, bool ignore = true);
21 void printError(Warning warning, const std::string& msg);
22 
23 namespace readers {
24 
26 enum ErrorLevel {
27  INFO,
30 };
31 
33 struct DebugInfo {
34  public:
39  DebugInfo(std::string filename = "")
40  : _filename(filename) {}
41 
43  void setLineNumber(uint32_t sectionId, unsigned int line) {
44  _lineNumbers[sectionId] = static_cast<int>(line);
45  }
46 
48  int32_t getLineNumber(uint32_t sectionId) const {
49  try {
50  return _lineNumbers.at(sectionId);
51  } catch (const std::out_of_range&) {
52  return -1;
53  }
54  }
56  std::string _filename;
57 
58  private:
59  std::map<unsigned int, int> _lineNumbers;
60 };
61 
62 static std::set<Warning> _ignoredWarnings;
63 
65 struct Sample {
66  Sample()
67  : valid(false)
68  , type(SECTION_UNDEFINED)
69  , parentId(-1)
70  , lineNumber(0) {}
71 
72  explicit Sample(const char* line, unsigned int lineNumber_)
73  : lineNumber(lineNumber_) {
74  floatType radius;
75  int int_type;
76 #ifdef MORPHIO_USE_DOUBLE
77  const auto format = "%20u%20d%20lg%20lg%20lg%20lg%20d";
78 #else
79  const auto format = "%20u%20d%20f%20f%20f%20f%20d";
80 #endif
81  valid = sscanf(line,
82  format,
83  &id,
84  &int_type,
85  &point[0],
86  &point[1],
87  &point[2],
88  &radius,
89  &parentId) == 7;
90 
91  type = static_cast<SectionType>(int_type);
92  diameter = radius * 2; // The point array stores diameters.
93  }
94 
95  floatType diameter;
96  bool valid;
98  SectionType type;
99  int parentId;
100  unsigned int id;
101  unsigned int lineNumber;
102 };
103 
107 {
108  public:
115  ErrorMessages(const std::string& uri)
116  : _uri(uri) {}
117 
119  static bool isIgnored(Warning warning);
120 
122  std::string errorLink(long unsigned int lineNumber, ErrorLevel errorLevel) const {
123  std::map<ErrorLevel, std::string> SEVERITY{{ErrorLevel::INFO, "info"},
124  {ErrorLevel::WARNING, "warning"},
125  {ErrorLevel::ERROR, "error"}};
126 
127  const std::map<ErrorLevel, std::string> COLOR{{ErrorLevel::INFO, "\033[1;34m"},
128  {ErrorLevel::WARNING, "\033[1;33m"},
129  {ErrorLevel::ERROR, "\033[1;31m"}};
130 
131  const std::string COLOR_END("\033[0m");
132 
133  return COLOR.at(errorLevel) + _uri + ":" + std::to_string(lineNumber) + ":" +
134  SEVERITY.at(errorLevel) + COLOR_END;
135  }
136 
138  std::string errorMsg(long unsigned int lineNumber,
139  ErrorLevel errorLevel,
140  std::string msg = "") const;
141 
143  // ERRORS
145 
147  std::string ERROR_OPENING_FILE() const;
148 
150  std::string ERROR_LINE_NON_PARSABLE(long unsigned int lineNumber) const;
151 
153  std::string ERROR_UNSUPPORTED_SECTION_TYPE(long unsigned int lineNumber,
154  const SectionType& type) const;
155 
157  std::string ERROR_UNSUPPORTED_VASCULATURE_SECTION_TYPE(long unsigned int lineNumber,
158  const VascularSectionType& type) const;
159 
161  std::string ERROR_MULTIPLE_SOMATA(const std::vector<Sample>& somata) const;
162 
164  std::string ERROR_MISSING_PARENT(const Sample& sample) const;
165 
167  std::string ERROR_SOMA_BIFURCATION(const Sample& sample,
168  const std::vector<Sample>& children) const;
169 
171  std::string ERROR_SOMA_WITH_NEURITE_PARENT(const Sample& sample) const;
172 
174  std::string ERROR_REPEATED_ID(const Sample& originalSample, const Sample& newSample) const;
175 
177  std::string ERROR_SELF_PARENT(const Sample& sample) const;
178 
180  std::string ERROR_NOT_IMPLEMENTED_UNDEFINED_SOMA(const std::string&) const;
181 
183  std::string ERROR_MISSING_MITO_PARENT(int mitoParentId) const;
184 
186  // NEUROLUCIDA
188 
189  std::string ERROR_SOMA_ALREADY_DEFINED(long unsigned int lineNumber) const;
190 
192  std::string ERROR_PARSING_POINT(long unsigned int lineNumber, const std::string& point) const;
193 
195  std::string ERROR_UNKNOWN_TOKEN(long unsigned int lineNumber, const std::string& token) const;
196 
198  std::string ERROR_UNEXPECTED_TOKEN(long unsigned int lineNumber,
199  const std::string& expected,
200  const std::string& got,
201  const std::string& msg) const;
202 
204  std::string ERROR_EOF_REACHED(long unsigned int lineNumber) const;
205 
207  std::string ERROR_EOF_IN_NEURITE(long unsigned int lineNumber) const;
208 
210  std::string ERROR_EOF_UNBALANCED_PARENS(long unsigned int lineNumber) const;
211 
213  std::string ERROR_UNCOMPATIBLE_FLAGS(morphio::Option flag1, morphio::Option flag2) const;
214 
216  // WRITERS
218 
220  std::string ERROR_WRONG_EXTENSION(const std::string& filename) const;
221 
223  std::string ERROR_VECTOR_LENGTH_MISMATCH(const std::string& vec1,
224  size_t length1,
225  const std::string& vec2,
226  size_t length2) const;
227 
229  std::string ERROR_PERIMETER_DATA_NOT_WRITABLE();
231  std::string ERROR_ONLY_CHILD_SWC_WRITER(unsigned int parentId) const;
232 
233 
235  // WARNINGS
237 
239  std::string WARNING_MITOCHONDRIA_WRITE_NOT_SUPPORTED() const;
241  std::string WARNING_WRITE_NO_SOMA() const;
243  std::string WARNING_WRITE_EMPTY_MORPHOLOGY() const;
245  std::string WARNING_NO_SOMA_FOUND() const;
247  std::string WARNING_ZERO_DIAMETER(const Sample& sample) const;
249  std::string WARNING_DISCONNECTED_NEURITE(const Sample& sample) const;
251  std::string WARNING_WRONG_DUPLICATE(const std::shared_ptr<morphio::mut::Section>& current,
252  const std::shared_ptr<morphio::mut::Section>& parent) const;
254  std::string WARNING_APPENDING_EMPTY_SECTION(std::shared_ptr<morphio::mut::Section>);
256  std::string WARNING_ONLY_CHILD(const DebugInfo& info,
257  unsigned int parentId,
258  unsigned int childId) const;
259 
261  std::string WARNING_NEUROMORPHO_SOMA_NON_CONFORM(const Sample& root,
262  const Sample& child1,
263  const Sample& child2);
264 
266  std::string WARNING_WRONG_ROOT_POINT(const std::vector<Sample>& children) const;
267 
268  private:
269  std::string _uri;
270 };
271 
272 } // namespace readers
273 
274 } // namespace morphio
void set_maximum_warnings(int n_warnings)
std::array< morphio::floatType, 3 > Point
Definition: vector_types.h:24
void set_ignored_warning(Warning warning, bool ignore=true)
void set_raise_warnings(bool is_raise)
Info.
Definition: errorMessages.h:27
Option
Definition: enums.h:12
DebugInfo(std::string filename="")
Definition: errorMessages.h:39
Error.
Definition: errorMessages.h:29
void printError(Warning warning, const std::string &msg)
ErrorMessages(const std::string &uri)
Definition: errorMessages.h:115
Definition: dendritic_spine.h:9
ErrorMessages()
Definition: errorMessages.h:110
Warning
Definition: enums.h:24
std::string errorLink(long unsigned int lineNumber, ErrorLevel errorLevel) const
Definition: errorMessages.h:122
Definition: errorMessages.h:65
ErrorLevel
Definition: errorMessages.h:26
Warning.
Definition: errorMessages.h:28
Point point
x, y, z and diameter
Definition: errorMessages.h:97
Definition: errorMessages.h:106
int32_t getLineNumber(uint32_t sectionId) const
Definition: errorMessages.h:48
std::string _filename
Definition: errorMessages.h:56
float floatType
Definition: vector_types.h:17
void setLineNumber(uint32_t sectionId, unsigned int line)
Definition: errorMessages.h:43
Undefined section.
Definition: enums.h:62
VascularSectionType
Definition: enums.h:98
SectionType
Definition: enums.h:61
Definition: errorMessages.h:33