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 {
15 void set_maximum_warnings(int n_warnings);
16 void set_raise_warnings(bool is_raise);
17 void set_ignored_warning(Warning warning, bool ignore = true);
18 void set_ignored_warning(const std::vector<Warning>& warning, bool ignore = true);
19 
20 void printError(Warning warning, const std::string& msg);
21 
22 namespace readers {
23 enum ErrorLevel { INFO, WARNING, ERROR };
24 
25 struct DebugInfo {
26  public:
27  DebugInfo(std::string filename = "")
28  : _filename(filename) {}
29 
30  void setLineNumber(uint32_t sectionId, unsigned int line) {
31  _lineNumbers[sectionId] = static_cast<int>(line);
32  }
33 
34  int32_t getLineNumber(uint32_t sectionId) const {
35  try {
36  return _lineNumbers.at(sectionId);
37  } catch (const std::out_of_range&) {
38  return -1;
39  }
40  }
41  std::string _filename;
42 
43  private:
44  std::map<unsigned int, int> _lineNumbers;
45 };
46 
47 static std::set<Warning> _ignoredWarnings;
48 
49 struct Sample {
50  Sample()
51  : valid(false)
52  , type(SECTION_UNDEFINED)
53  , parentId(-1)
54  , lineNumber(0) {}
55 
56  explicit Sample(const char* line, unsigned int lineNumber_)
57  : lineNumber(lineNumber_) {
58  floatType radius;
59  int int_type;
60 #ifdef MORPHIO_USE_DOUBLE
61  const auto format = "%20u%20d%20lg%20lg%20lg%20lg%20d";
62 #else
63  const auto format = "%20u%20d%20f%20f%20f%20f%20d";
64 #endif
65  valid = sscanf(line,
66  format,
67  &id,
68  &int_type,
69  &point[0],
70  &point[1],
71  &point[2],
72  &radius,
73  &parentId) == 7;
74 
75  type = static_cast<SectionType>(int_type);
76  diameter = radius * 2; // The point array stores diameters.
77  }
78 
79  floatType diameter;
80  bool valid;
81  Point point; // x, y, z and diameter
82  SectionType type;
83  int parentId;
84  unsigned int id;
85  unsigned int lineNumber;
86 };
87 
89 {
90  public:
91  ErrorMessages() {}
92  ErrorMessages(const std::string& uri)
93  : _uri(uri) {}
94 
98  static bool isIgnored(Warning warning);
99 
100  std::string errorLink(long unsigned int lineNumber, ErrorLevel errorLevel) const {
101  std::map<ErrorLevel, std::string> SEVERITY{{ErrorLevel::INFO, "info"},
102  {ErrorLevel::WARNING, "warning"},
103  {ErrorLevel::ERROR, "error"}};
104 
105  const std::map<ErrorLevel, std::string> COLOR{{ErrorLevel::INFO, "\033[1;34m"},
106  {ErrorLevel::WARNING, "\033[1;33m"},
107  {ErrorLevel::ERROR, "\033[1;31m"}};
108 
109  const std::string COLOR_END("\033[0m");
110 
111  return COLOR.at(errorLevel) + _uri + ":" + std::to_string(lineNumber) + ":" +
112  SEVERITY.at(errorLevel) + COLOR_END;
113  }
114 
115  std::string errorMsg(long unsigned int lineNumber,
116  ErrorLevel errorLevel,
117  std::string msg = "") const;
118 
120  // ERRORS
122 
123  std::string ERROR_OPENING_FILE() const;
124 
125  std::string ERROR_LINE_NON_PARSABLE(long unsigned int lineNumber) const;
126 
127  std::string ERROR_UNSUPPORTED_SECTION_TYPE(long unsigned int lineNumber,
128  const SectionType& type) const;
129 
130  std::string ERROR_UNSUPPORTED_VASCULATURE_SECTION_TYPE(long unsigned int lineNumber,
131  const VascularSectionType& type) const;
132 
133  std::string ERROR_MULTIPLE_SOMATA(const std::vector<Sample>& somata) const;
134 
135  std::string ERROR_MISSING_PARENT(const Sample& sample) const;
136 
137  std::string ERROR_SOMA_BIFURCATION(const Sample& sample,
138  const std::vector<Sample>& children) const;
139 
140  std::string ERROR_SOMA_WITH_NEURITE_PARENT(const Sample& sample) const;
141 
142  std::string ERROR_REPEATED_ID(const Sample& originalSample, const Sample& newSample) const;
143 
144  std::string ERROR_SELF_PARENT(const Sample& sample) const;
145 
146  std::string ERROR_NOT_IMPLEMENTED_UNDEFINED_SOMA(const std::string&) const;
147 
148  std::string ERROR_MISSING_MITO_PARENT(int mitoParentId) const;
149 
151  // NEUROLUCIDA
153  std::string ERROR_SOMA_ALREADY_DEFINED(long unsigned int lineNumber) const;
154 
155  std::string ERROR_PARSING_POINT(long unsigned int lineNumber, const std::string& point) const;
156 
157  std::string ERROR_UNKNOWN_TOKEN(long unsigned int lineNumber, const std::string& token) const;
158 
159  std::string ERROR_UNEXPECTED_TOKEN(long unsigned int lineNumber,
160  const std::string& expected,
161  const std::string& got,
162  const std::string& msg) const;
163 
164  std::string ERROR_EOF_REACHED(long unsigned int lineNumber) const;
165 
166  std::string ERROR_EOF_IN_NEURITE(long unsigned int lineNumber) const;
167 
168  std::string ERROR_EOF_UNBALANCED_PARENS(long unsigned int lineNumber) const;
169 
170  std::string ERROR_UNCOMPATIBLE_FLAGS(morphio::Option flag1, morphio::Option flag2) const;
171 
173  // WRITERS
175 
176  std::string ERROR_WRONG_EXTENSION(const std::string& filename) const;
177 
178  std::string ERROR_VECTOR_LENGTH_MISMATCH(const std::string& vec1,
179  size_t length1,
180  const std::string& vec2,
181  size_t length2) const;
182 
183  std::string ERROR_PERIMETER_DATA_NOT_WRITABLE();
184  std::string ERROR_ONLY_CHILD_SWC_WRITER(unsigned int parentId) const;
185 
186 
188  // WARNINGS
190 
191  std::string WARNING_MITOCHONDRIA_WRITE_NOT_SUPPORTED() const;
192  std::string WARNING_WRITE_NO_SOMA() const;
193  std::string WARNING_WRITE_EMPTY_MORPHOLOGY() const;
194  std::string WARNING_NO_SOMA_FOUND() const;
195  std::string WARNING_ZERO_DIAMETER(const Sample& sample) const;
196  std::string WARNING_DISCONNECTED_NEURITE(const Sample& sample) const;
197  std::string WARNING_WRONG_DUPLICATE(const std::shared_ptr<morphio::mut::Section>& current,
198  const std::shared_ptr<morphio::mut::Section>& parent) const;
199  std::string WARNING_APPENDING_EMPTY_SECTION(std::shared_ptr<morphio::mut::Section>);
200  std::string WARNING_ONLY_CHILD(const DebugInfo& info,
201  unsigned int parentId,
202  unsigned int childId) const;
203 
204  std::string WARNING_NEUROMORPHO_SOMA_NON_CONFORM(const Sample& root,
205  const Sample& child1,
206  const Sample& child2);
207 
208  std::string WARNING_WRONG_ROOT_POINT(const std::vector<Sample>& children) const;
209 
210  private:
211  std::string _uri;
212 };
213 
214 } // namespace readers
215 
216 } // namespace morphio
Definition: errorMessages.h:89
static bool isIgnored(Warning warning)
Definition: endoplasmic_reticulum.h:5
void set_maximum_warnings(int n_warnings)
Definition: errorMessages.h:25
Definition: errorMessages.h:49