Skip to content

Commit d069c24

Browse files
committed
Auto merge of #13249 - WeiTheShinobi:update_dependency_handlebars, r=epage
Update dependency handlebars to v5 for mdman. ### What does this PR try to resolve? issue #13238 - update dependency handlebars 4.5.0 -> 5.0.0 - fix code to fit the changes of Handlebars API - RenderError::new() is deprecated. Use RenderErrorReason instead ### How should we test and review this PR? pass all tests in /crates/mdman/tests
2 parents a885354 + 06201b9 commit d069c24

File tree

3 files changed

+59
-35
lines changed

3 files changed

+59
-35
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ git2-curl = "0.19.0"
4848
gix = { version = "0.57.1", default-features = false, features = ["blocking-http-transport-curl", "progress-tree", "revision"] }
4949
gix-features-for-configuration-only = { version = "0.37.1", package = "gix-features", features = [ "parallel" ] }
5050
glob = "0.3.1"
51-
handlebars = { version = "4.5.0", features = ["dir_source"] }
51+
handlebars = { version = "5.0.0", features = ["dir_source"] }
5252
hex = "0.4.3"
5353
hmac = "0.12.1"
5454
home = "0.5.9"

crates/mdman/src/hbs.rs

Lines changed: 56 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
//! Handlebars template processing.
22
3-
use crate::format::Formatter;
3+
use std::collections::HashMap;
4+
use std::path::Path;
5+
46
use anyhow::Error;
57
use handlebars::{
6-
handlebars_helper, Context, Decorator, Handlebars, Helper, HelperDef, HelperResult, Output,
7-
RenderContext, RenderError, Renderable,
8+
handlebars_helper, Context, Decorator, DirectorySourceOptions, Handlebars, Helper, HelperDef,
9+
HelperResult, Output, RenderContext, RenderError, RenderErrorReason, Renderable,
810
};
9-
use std::collections::HashMap;
10-
use std::path::Path;
11+
12+
use crate::format::Formatter;
1113

1214
type FormatterRef<'a> = &'a (dyn Formatter + Send + Sync);
1315

@@ -22,7 +24,12 @@ pub fn expand(file: &Path, formatter: FormatterRef<'_>) -> Result<String, Error>
2224
handlebars.register_decorator("set", Box::new(set_decorator));
2325
handlebars.register_template_file("template", file)?;
2426
let includes = file.parent().unwrap().join("includes");
25-
handlebars.register_templates_directory(".md", includes)?;
27+
let options = DirectorySourceOptions {
28+
tpl_extension: ".md".to_string(),
29+
hidden: false,
30+
temporary: false,
31+
};
32+
handlebars.register_templates_directory(includes, options)?;
2633
let man_name = file
2734
.file_stem()
2835
.expect("expected filename")
@@ -42,22 +49,29 @@ struct OptionsHelper<'a> {
4249
impl HelperDef for OptionsHelper<'_> {
4350
fn call<'reg: 'rc, 'rc>(
4451
&self,
45-
h: &Helper<'reg, 'rc>,
52+
h: &Helper<'rc>,
4653
r: &'reg Handlebars<'reg>,
4754
ctx: &'rc Context,
4855
rc: &mut RenderContext<'reg, 'rc>,
4956
out: &mut dyn Output,
5057
) -> HelperResult {
5158
if in_options(rc) {
52-
return Err(RenderError::new("options blocks cannot be nested"));
59+
return Err(
60+
RenderErrorReason::Other("options blocks cannot be nested".to_string()).into(),
61+
);
5362
}
5463
// Prevent nested {{#options}}.
5564
set_in_context(rc, "__MDMAN_IN_OPTIONS", serde_json::Value::Bool(true));
5665
let s = self.formatter.render_options_start();
5766
out.write(&s)?;
5867
let t = match h.template() {
5968
Some(t) => t,
60-
None => return Err(RenderError::new("options block must not be empty")),
69+
None => {
70+
return Err(RenderErrorReason::Other(
71+
"options block must not be empty".to_string(),
72+
)
73+
.into());
74+
}
6175
};
6276
let block = t.renders(r, ctx, rc)?;
6377
out.write(&block)?;
@@ -83,20 +97,23 @@ struct OptionHelper<'a> {
8397
impl HelperDef for OptionHelper<'_> {
8498
fn call<'reg: 'rc, 'rc>(
8599
&self,
86-
h: &Helper<'reg, 'rc>,
100+
h: &Helper<'rc>,
87101
r: &'reg Handlebars<'reg>,
88102
ctx: &'rc Context,
89103
rc: &mut RenderContext<'reg, 'rc>,
90104
out: &mut dyn Output,
91105
) -> HelperResult {
92106
if !in_options(rc) {
93-
return Err(RenderError::new("option must be in options block"));
107+
return Err(
108+
RenderErrorReason::Other("option must be in options block".to_string()).into(),
109+
);
94110
}
95111
let params = h.params();
96112
if params.is_empty() {
97-
return Err(RenderError::new(
98-
"option block must have at least one param",
99-
));
113+
return Err(RenderErrorReason::Other(
114+
"option block must have at least one param".to_string(),
115+
)
116+
.into());
100117
}
101118
// Convert params to strings.
102119
let params = params
@@ -105,12 +122,19 @@ impl HelperDef for OptionHelper<'_> {
105122
param
106123
.value()
107124
.as_str()
108-
.ok_or_else(|| RenderError::new("option params must be strings"))
125+
.ok_or_else(|| {
126+
RenderErrorReason::Other("option params must be strings".to_string())
127+
})
128+
.into()
109129
})
110-
.collect::<Result<Vec<&str>, RenderError>>()?;
130+
.collect::<Result<Vec<&str>, RenderErrorReason>>()?;
111131
let t = match h.template() {
112132
Some(t) => t,
113-
None => return Err(RenderError::new("option block must not be empty")),
133+
None => {
134+
return Err(
135+
RenderErrorReason::Other("option block must not be empty".to_string()).into(),
136+
);
137+
}
114138
};
115139
// Render the block.
116140
let block = t.renders(r, ctx, rc)?;
@@ -127,7 +151,7 @@ impl HelperDef for OptionHelper<'_> {
127151
let option = self
128152
.formatter
129153
.render_option(&params, &block, man_name)
130-
.map_err(|e| RenderError::new(format!("option render failed: {}", e)))?;
154+
.map_err(|e| RenderErrorReason::Other(format!("option render failed: {}", e)))?;
131155
out.write(&option)?;
132156
Ok(())
133157
}
@@ -141,30 +165,30 @@ struct ManLinkHelper<'a> {
141165
impl HelperDef for ManLinkHelper<'_> {
142166
fn call<'reg: 'rc, 'rc>(
143167
&self,
144-
h: &Helper<'reg, 'rc>,
168+
h: &Helper<'rc>,
145169
_r: &'reg Handlebars<'reg>,
146170
_ctx: &'rc Context,
147171
_rc: &mut RenderContext<'reg, 'rc>,
148172
out: &mut dyn Output,
149173
) -> HelperResult {
150174
let params = h.params();
151175
if params.len() != 2 {
152-
return Err(RenderError::new("{{man}} must have two arguments"));
176+
return Err(
177+
RenderErrorReason::Other("{{man}} must have two arguments".to_string()).into(),
178+
);
153179
}
154-
let name = params[0]
155-
.value()
156-
.as_str()
157-
.ok_or_else(|| RenderError::new("man link name must be a string"))?;
158-
let section = params[1]
159-
.value()
160-
.as_u64()
161-
.ok_or_else(|| RenderError::new("man link section must be an integer"))?;
162-
let section =
163-
u8::try_from(section).map_err(|_e| RenderError::new("section number too large"))?;
180+
let name = params[0].value().as_str().ok_or_else(|| {
181+
RenderErrorReason::Other("man link name must be a string".to_string())
182+
})?;
183+
let section = params[1].value().as_u64().ok_or_else(|| {
184+
RenderErrorReason::Other("man link section must be an integer".to_string())
185+
})?;
186+
let section = u8::try_from(section)
187+
.map_err(|_e| RenderErrorReason::Other("section number too large".to_string()))?;
164188
let link = self
165189
.formatter
166190
.linkify_man_to_md(name, section)
167-
.map_err(|e| RenderError::new(format!("failed to linkify man: {}", e)))?;
191+
.map_err(|e| RenderErrorReason::Other(format!("failed to linkify man: {}", e)))?;
168192
out.write(&link)?;
169193
Ok(())
170194
}
@@ -174,7 +198,7 @@ impl HelperDef for ManLinkHelper<'_> {
174198
///
175199
/// This sets a variable to a value within the template context.
176200
fn set_decorator(
177-
d: &Decorator<'_, '_>,
201+
d: &Decorator<'_>,
178202
_: &Handlebars<'_>,
179203
_ctx: &Context,
180204
rc: &mut RenderContext<'_, '_>,

0 commit comments

Comments
 (0)