Skip to content

Commit e1ae3b7

Browse files
committed
try some more jinja type fixes
1 parent 26e22fc commit e1ae3b7

File tree

6 files changed

+16
-59
lines changed

6 files changed

+16
-59
lines changed

src/recipe/custom_yaml.rs

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -154,29 +154,18 @@ impl Render<Node> for Node {
154154

155155
impl Render<Node> for ScalarNode {
156156
fn render(&self, jinja: &Jinja, _name: &str) -> Result<Node, Vec<PartialParsingError>> {
157-
let rendered = jinja.render_str(self.as_str()).map_err(|err| {
157+
let (rendered, may_coerce) = jinja.render_str(self.as_str()).map_err(|err| {
158158
vec![_partialerror!(
159159
*self.span(),
160160
ErrorKind::JinjaRendering(err),
161161
label = jinja_error_to_label(&err)
162162
)]
163163
})?;
164-
println!("Rendered: {}", rendered);
165-
if rendered.starts_with("\"") && rendered.ends_with("\"") {
166-
// remove quotes and don't coerce string
167-
let rendered = rendered[1..rendered.len() - 1].to_string();
168-
println!("Rendered without quotes: {}", rendered);
169-
return Ok(Node::from(ScalarNode::new(
170-
*self.span(),
171-
rendered,
172-
false,
173-
)));
174-
}
175164

176165
Ok(Node::from(ScalarNode::new(
177166
*self.span(),
178167
rendered,
179-
self.may_coerce,
168+
self.may_coerce && may_coerce,
180169
)))
181170
}
182171
}
@@ -187,32 +176,21 @@ impl Render<Option<ScalarNode>> for ScalarNode {
187176
jinja: &Jinja,
188177
_name: &str,
189178
) -> Result<std::option::Option<ScalarNode>, Vec<PartialParsingError>> {
190-
let rendered = jinja.render_str(self.as_str()).map_err(|err| {
179+
let (rendered, may_coerce) = jinja.render_str(self.as_str()).map_err(|err| {
191180
vec![_partialerror!(
192181
*self.span(),
193182
ErrorKind::JinjaRendering(err),
194183
label = jinja_error_to_label(&err)
195184
)]
196185
})?;
197186

198-
// if rendered string starts with `"` and ends with `"` then remove them and turn may_coerce to false
199-
if rendered.starts_with("\"") && rendered.ends_with("\"") {
200-
// remove quotes and don't coerce string
201-
let rendered = rendered[1..rendered.len() - 1].to_string();
202-
return Ok(Some(ScalarNode::new(
203-
*self.span(),
204-
rendered,
205-
false,
206-
)));
207-
}
208-
209187
if rendered.is_empty() {
210188
Ok(None)
211189
} else {
212190
Ok(Some(ScalarNode::new(
213191
*self.span(),
214192
rendered,
215-
self.may_coerce,
193+
self.may_coerce && may_coerce,
216194
)))
217195
}
218196
}

src/recipe/custom_yaml/rendered.rs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -662,31 +662,20 @@ impl Render<RenderedNode> for Node {
662662

663663
impl Render<RenderedNode> for ScalarNode {
664664
fn render(&self, jinja: &Jinja, _name: &str) -> Result<RenderedNode, Vec<PartialParsingError>> {
665-
let rendered = jinja.render_str(self.as_str()).map_err(|err| {
665+
let (rendered, may_coerce) = jinja.render_str(self.as_str()).map_err(|err| {
666666
vec![_partialerror!(
667667
*self.span(),
668668
ErrorKind::JinjaRendering(err),
669669
label = jinja_error_to_label(&err),
670670
)]
671671
})?;
672672

673-
if rendered.starts_with("\"") && rendered.ends_with("\"") {
674-
// remove quotes
675-
let rendered = rendered[1..rendered.len() - 1].to_string();
676-
return Ok(RenderedNode::Scalar(RenderedScalarNode::new(
677-
*self.span(),
678-
self.as_str().to_string(),
679-
rendered,
680-
false,
681-
)));
682-
}
683-
684673
// unsure whether this should be allowed to coerce // check if it's quoted?
685674
let rendered = RenderedScalarNode::new(
686675
*self.span(),
687676
self.as_str().to_string(),
688677
rendered,
689-
self.may_coerce,
678+
self.may_coerce && may_coerce,
690679
);
691680

692681
if rendered.is_empty() {
@@ -703,7 +692,7 @@ impl Render<Option<RenderedNode>> for ScalarNode {
703692
jinja: &Jinja,
704693
_name: &str,
705694
) -> Result<Option<RenderedNode>, Vec<PartialParsingError>> {
706-
let rendered = jinja.render_str(self.as_str()).map_err(|err| {
695+
let (rendered, may_coerce) = jinja.render_str(self.as_str()).map_err(|err| {
707696
vec![_partialerror!(
708697
*self.span(),
709698
ErrorKind::JinjaRendering(err),
@@ -715,7 +704,7 @@ impl Render<Option<RenderedNode>> for ScalarNode {
715704
*self.span(),
716705
self.as_str().to_string(),
717706
rendered,
718-
self.may_coerce,
707+
self.may_coerce && may_coerce,
719708
);
720709

721710
if rendered.is_empty() {

src/recipe/jinja.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,6 @@ pub struct Jinja {
5454
context: BTreeMap<String, Value>,
5555
}
5656

57-
struct ForceString {
58-
value: String,
59-
force: bool,
60-
}
61-
6257
impl Jinja {
6358
/// Create a new Jinja instance with the given selector configuration.
6459
pub fn new(config: SelectorConfig) -> Self {
@@ -100,24 +95,23 @@ impl Jinja {
10095
}
10196

10297
/// Render a template with the current context.
103-
pub fn render_str(&self, template: &str) -> Result<String, minijinja::Error> {
98+
pub fn render_str(&self, template: &str) -> Result<(String, bool), minijinja::Error> {
10499
if template.starts_with("${{") && template.ends_with("}}") {
105100
// render as expression so that we know the type of the result, and can stringify accordingly
106101
// If we find something like "${{ foo }}" then we want to evaluate it type-safely and make sure that the MiniJinja type is kept
107-
println!("eval: {:?}", template);
108102
let tmplt = &template[3..template.len() - 2];
109103
let expr = self.env.compile_expression(tmplt)?;
110104
let evaled = expr.eval(self.context())?;
111105
if let Some(s) = evaled.to_str() {
112-
// quote the string so that YAML is not getting confused
113-
println!("evaled: {:?}", s);
114-
return Ok(format!("\"{}\"", s));
106+
// Make sure that the string stays a string by returning can_coerce: false
107+
return Ok((s.to_string(), false));
115108
} else {
116-
return Ok(evaled.to_string());
109+
return Ok((evaled.to_string(), true));
117110
}
118111
}
119112

120-
self.env.render_str(template, &self.context)
113+
let rendered = self.env.render_str(template, &self.context)?;
114+
Ok((rendered, !template.contains("${{")))
121115
}
122116

123117
/// Render, compile and evaluate a expr string with the current context.

src/recipe/parser.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,6 @@ impl Recipe {
183183
// add context values
184184
let mut context: IndexMap<String, Variable> = IndexMap::new();
185185
if let Some(context_map) = root_node.get("context") {
186-
println!("Rendering context: {:#?}", context);
187-
188186
let context_map = context_map.as_mapping().ok_or_else(|| {
189187
vec![_partialerror!(
190188
*context_map.span(),
@@ -236,8 +234,6 @@ impl Recipe {
236234
};
237235
context.insert(k.as_str().to_string(), variable.clone());
238236

239-
println!("Context variable with type: k {} {:#?}", k.as_str(), variable);
240-
241237
// also immediately insert into jinja context so that the value can be used
242238
// in later jinja expressions
243239
jinja

src/recipe/parser/build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ impl BuildString {
172172
pub fn resolve(&self, hash: &HashInfo, build_number: u64, jinja: &Jinja) -> Cow<'_, str> {
173173
match self {
174174
// TODO
175-
BuildString::UserSpecified(template) => jinja.render_str(template).unwrap().into(),
175+
BuildString::UserSpecified(template) => jinja.render_str(template).unwrap().0.into(),
176176
BuildString::Resolved(s) => s.as_str().into(),
177177
BuildString::Derived => Self::compute(hash, build_number).into(),
178178
}

src/script/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ impl Script {
219219
if let Some(jinja_context) = jinja_context {
220220
match script_content? {
221221
ResolvedScriptContents::Inline(script) => {
222-
let rendered = jinja_context.render_str(&script).map_err(|e| {
222+
let (rendered, _) = jinja_context.render_str(&script).map_err(|e| {
223223
std::io::Error::new(
224224
std::io::ErrorKind::Other,
225225
format!("Failed to render jinja template in build `script`: {}", e),

0 commit comments

Comments
 (0)