]>
git.proxmox.com Git - rustc.git/blob - src/vendor/handlebars/src/error.rs
1 use std
::io
::Error
as IOError
;
5 use serde_json
::error
::Error
as SerdeError
;
7 use template
::Parameter
;
9 /// Error when rendering data on template.
11 pub struct RenderError
{
13 pub template_name
: Option
<String
>,
14 pub line_no
: Option
<usize>,
15 pub column_no
: Option
<usize>,
16 cause
: Option
<Box
<Error
+ Send
+ Sync
>>,
19 impl fmt
::Display
for RenderError
{
20 fn fmt(&self, f
: &mut fmt
::Formatter
) -> Result
<(), fmt
::Error
> {
21 match (self.line_no
, self.column_no
) {
22 (Some(line
), Some(col
)) => write
!(
24 "Error rendering \"{}\" line {}, col {}: {}",
27 .unwrap_or(&"Unnamed template".to_owned(),),
32 _
=> write
!(f
, "{}", self.desc
),
37 impl Error
for RenderError
{
38 fn description(&self) -> &str {
42 fn cause(&self) -> Option
<&Error
> {
43 self.cause
.as_ref().map(|e
| &**e
as &Error
)
47 impl From
<IOError
> for RenderError
{
48 fn from(e
: IOError
) -> RenderError
{
53 impl From
<SerdeError
> for RenderError
{
54 fn from(e
: SerdeError
) -> RenderError
{
60 pub fn new
<T
: AsRef
<str>>(desc
: T
) -> RenderError
{
62 desc
: desc
.as_ref().to_owned(),
70 pub fn with
<E
>(cause
: E
) -> RenderError
72 E
: Error
+ Send
+ Sync
+ '
static,
74 let mut e
= RenderError
::new(cause
.description());
75 e
.cause
= Some(Box
::new(cause
));
82 /// Template parsing error
83 #[derive(PartialEq, Debug, Clone)]
84 pub enum TemplateErrorReason
{
85 MismatchingClosedHelper(open
: String
, closed
: String
) {
86 display("helper {:?} was opened, but {:?} is closing",
88 description("wrong name of closing helper")
90 MismatchingClosedDirective(open
: Parameter
, closed
: Parameter
) {
91 display("directive {:?} was opened, but {:?} is closing",
93 description("wrong name of closing directive")
96 display("invalid handlebars syntax.")
97 description("invalid handlebars syntax")
99 InvalidParam (param
: String
) {
100 display("invalid parameter {:?}", param
)
101 description("invalid parameter")
103 NestedSubexpression
{
104 display("nested subexpression is not supported")
105 description("nested subexpression is not supported")
110 /// Error on parsing template.
111 #[derive(Debug, PartialEq)]
112 pub struct TemplateError
{
113 pub reason
: TemplateErrorReason
,
114 pub template_name
: Option
<String
>,
115 pub line_no
: Option
<usize>,
116 pub column_no
: Option
<usize>,
117 segment
: Option
<String
>,
121 pub fn of(e
: TemplateErrorReason
) -> TemplateError
{
131 pub fn at(mut self, template_str
: &str, line_no
: usize, column_no
: usize) -> TemplateError
{
132 self.line_no
= Some(line_no
);
133 self.column_no
= Some(column_no
);
134 self.segment
= Some(template_segment(template_str
, line_no
, column_no
));
138 pub fn in_template(mut self, name
: String
) -> TemplateError
{
139 self.template_name
= Some(name
);
144 impl Error
for TemplateError
{
145 fn description(&self) -> &str {
146 self.reason
.description()
150 fn template_segment(template_str
: &str, line
: usize, col
: usize) -> String
{
152 let line_start
= if line
>= range { line - range }
else { 0 }
;
153 let line_end
= line
+ range
;
155 let mut buf
= String
::new();
156 for (line_count
, line_content
) in template_str
.lines().enumerate() {
157 if line_count
>= line_start
&& line_count
<= line_end
{
158 buf
.push_str(&format
!("{:4} | {}\n", line_count
, line_content
));
159 if line_count
== line
- 1 {
161 for c
in 0..line_content
.len() {
176 impl fmt
::Display
for TemplateError
{
177 fn fmt(&self, f
: &mut fmt
::Formatter
) -> Result
<(), fmt
::Error
> {
178 match (self.line_no
, self.column_no
, &self.segment
) {
179 (Some(line
), Some(col
), &Some(ref seg
)) => write
!(
181 "Template error: {}\n --> Template error in \"{}\":{}:{}\n |\n{} |\n = reason: {}\n",
185 .unwrap_or(&"Unnamed template".to_owned()),
191 _
=> write
!(f
, "{}", self.reason
),
198 pub enum TemplateFileError
{
199 TemplateError(err
: TemplateError
) {
202 description(err
.description())
205 IOError(err
: IOError
, name
: String
) {
207 description(err
.description())
208 display("Template \"{}\": {}", name
, err
)
215 pub enum TemplateRenderError
{
216 TemplateError(err
: TemplateError
) {
219 description(err
.description())
222 RenderError(err
: RenderError
) {
225 description(err
.description())
228 IOError(err
: IOError
, name
: String
) {
230 description(err
.description())
231 display("Template \"{}\": {}", name
, err
)
236 impl TemplateRenderError
{
237 pub fn as_render_error(&self) -> Option
<&RenderError
> {
238 if let &TemplateRenderError
::RenderError(ref e
) = self {