1 use std::fmt::{self, Display};
2 
3 #[derive(Copy, Clone)]
4 pub(crate) struct Error {
5     pub msg: &'static str,
6     #[allow(dead_code)] // only used by cxx-build, not cxxbridge-macro
7     pub label: Option<&'static str>,
8     #[allow(dead_code)] // only used by cxx-build, not cxxbridge-macro
9     pub note: Option<&'static str>,
10 }
11 
12 impl Display for Error {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result13     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
14         self.msg.fmt(formatter)
15     }
16 }
17 
18 pub(crate) static ERRORS: &[Error] = &[
19     BOX_CXX_TYPE,
20     CXXBRIDGE_RESERVED,
21     CXX_STRING_BY_VALUE,
22     CXX_TYPE_BY_VALUE,
23     DISCRIMINANT_OVERFLOW,
24     DOT_INCLUDE,
25     DOUBLE_UNDERSCORE,
26     RESERVED_LIFETIME,
27     RUST_TYPE_BY_VALUE,
28     UNSUPPORTED_TYPE,
29     USE_NOT_ALLOWED,
30 ];
31 
32 pub(crate) static BOX_CXX_TYPE: Error = Error {
33     msg: "Box of a C++ type is not supported yet",
34     label: None,
35     note: Some("hint: use UniquePtr<> or SharedPtr<>"),
36 };
37 
38 pub(crate) static CXXBRIDGE_RESERVED: Error = Error {
39     msg: "identifiers starting with cxxbridge are reserved",
40     label: Some("reserved identifier"),
41     note: Some("identifiers starting with cxxbridge are reserved"),
42 };
43 
44 pub(crate) static CXX_STRING_BY_VALUE: Error = Error {
45     msg: "C++ string by value is not supported",
46     label: None,
47     note: Some("hint: wrap it in a UniquePtr<>"),
48 };
49 
50 pub(crate) static CXX_TYPE_BY_VALUE: Error = Error {
51     msg: "C++ type by value is not supported",
52     label: None,
53     note: Some("hint: wrap it in a UniquePtr<> or SharedPtr<>"),
54 };
55 
56 pub(crate) static DISCRIMINANT_OVERFLOW: Error = Error {
57     msg: "discriminant overflow on value after ",
58     label: Some("discriminant overflow"),
59     note: Some("note: explicitly set `= 0` if that is desired outcome"),
60 };
61 
62 pub(crate) static DOT_INCLUDE: Error = Error {
63     msg: "#include relative to `.` or `..` is not supported in Cargo builds",
64     label: Some("#include relative to `.` or `..` is not supported in Cargo builds"),
65     note: Some("note: use a path starting with the crate name"),
66 };
67 
68 pub(crate) static DOUBLE_UNDERSCORE: Error = Error {
69     msg: "identifiers containing double underscore are reserved in C++",
70     label: Some("reserved identifier"),
71     note: Some("identifiers containing double underscore are reserved in C++"),
72 };
73 
74 pub(crate) static RESERVED_LIFETIME: Error = Error {
75     msg: "invalid lifetime parameter name: `'static`",
76     label: Some("'static is a reserved lifetime name"),
77     note: None,
78 };
79 
80 pub(crate) static RUST_TYPE_BY_VALUE: Error = Error {
81     msg: "opaque Rust type by value is not supported",
82     label: None,
83     note: Some("hint: wrap it in a Box<>"),
84 };
85 
86 pub(crate) static UNSUPPORTED_TYPE: Error = Error {
87     msg: "unsupported type: ",
88     label: Some("unsupported type"),
89     note: None,
90 };
91 
92 pub(crate) static USE_NOT_ALLOWED: Error = Error {
93     msg: "`use` items are not allowed within cxx bridge",
94     label: Some("not allowed"),
95     note: Some(
96         "`use` items are not allowed within cxx bridge; only types defined\n\
97          within your bridge, primitive types, or types exported by the cxx\n\
98          crate may be used",
99     ),
100 };
101