Skip to content

Commit

Permalink
Add Placeholder in AST for inner spacing
Browse files Browse the repository at this point in the history
  • Loading branch information
fabricereix authored and hurl-bot committed Nov 19, 2024
1 parent 5487a59 commit 5df1431
Show file tree
Hide file tree
Showing 28 changed files with 308 additions and 231 deletions.
10 changes: 1 addition & 9 deletions packages/hurl/src/runner/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ pub fn render(expr: &Expr, variables: &VariableSet) -> Result<String, RunnerErro
mod tests {
use super::*;
use hurl_core::{
ast::{SourceInfo, Variable, Whitespace},
ast::{SourceInfo, Variable},
reader::Pos,
};

Expand All @@ -62,18 +62,10 @@ mod tests {
let mut variables = VariableSet::new();
variables.insert("status".to_string(), Value::Bool(true));
let expr = Expr {
space0: Whitespace {
value: String::new(),
source_info: SourceInfo::new(Pos::new(0, 0), Pos::new(0, 0)),
},
variable: Variable {
name: "status".to_string(),
source_info: SourceInfo::new(Pos::new(0, 0), Pos::new(0, 0)),
},
space1: Whitespace {
value: String::new(),
source_info: SourceInfo::new(Pos::new(0, 0), Pos::new(0, 0)),
},
};
assert_eq!(eval(&expr, &variables).unwrap(), Value::Bool(true));
assert_eq!(render(&expr, &variables).unwrap(), "true");
Expand Down
32 changes: 19 additions & 13 deletions packages/hurl/src/runner/json.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@
* limitations under the License.
*
*/
use hurl_core::ast::{JsonListElement, JsonObjectElement, JsonValue, Template, TemplateElement};
use hurl_core::ast::{
JsonListElement, JsonObjectElement, JsonValue, Placeholder, Template, TemplateElement,
};
use hurl_core::parser::{parse_json_boolean, parse_json_null, parse_json_number};
use hurl_core::reader::Reader;

Expand Down Expand Up @@ -62,8 +64,8 @@ pub fn eval_json_value(
Ok(format!("{{{}}}", elems_string.join(",")))
}
}
JsonValue::Expression(exp) => {
let s = expr::render(exp, variables)?;
JsonValue::Placeholder(Placeholder { expr, .. }) => {
let s = expr::render(expr, variables)?;

// The String can only be null, a bool, a number
// It will be easier when your variables value have a type
Expand All @@ -81,7 +83,7 @@ pub fn eval_json_value(
return Ok(s);
}
let kind = RunnerErrorKind::InvalidJson { value: s };
Err(RunnerError::new(exp.variable.source_info, kind, false))
Err(RunnerError::new(expr.variable.source_info, kind, false))
}
}
}
Expand Down Expand Up @@ -150,7 +152,7 @@ fn eval_json_template_element(
) -> Result<String, RunnerError> {
match template_element {
TemplateElement::String { encoded, .. } => Ok(encoded.clone()),
TemplateElement::Expression(expr) => {
TemplateElement::Placeholder(Placeholder { expr, .. }) => {
let s = expr::render(expr, variables)?;
Ok(encode_json_string(&s))
}
Expand Down Expand Up @@ -190,14 +192,16 @@ mod tests {
value: "Hello ".to_string(),
encoded: "Hello\\u0020".to_string(),
},
TemplateElement::Expression(Expr {
TemplateElement::Placeholder(Placeholder {
space0: Whitespace {
value: String::new(),
source_info: SourceInfo::new(Pos::new(1, 15), Pos::new(1, 15)),
},
variable: Variable {
name: "name".to_string(),
source_info: SourceInfo::new(Pos::new(1, 15), Pos::new(1, 19)),
expr: Expr {
variable: Variable {
name: "name".to_string(),
source_info: SourceInfo::new(Pos::new(1, 15), Pos::new(1, 19)),
},
},
space1: Whitespace {
value: String::new(),
Expand Down Expand Up @@ -435,11 +439,13 @@ mod tests {
value: "Hello ".to_string(),
encoded: "Hello ".to_string(),
},
TemplateElement::Expression(Expr {
TemplateElement::Placeholder(Placeholder {
space0: whitespace(),
variable: Variable {
name: "quote".to_string(),
source_info: SourceInfo::new(Pos::new(0, 0), Pos::new(0, 0)),
expr: Expr {
variable: Variable {
name: "quote".to_string(),
source_info: SourceInfo::new(Pos::new(0, 0), Pos::new(0, 0)),
},
},
space1: whitespace(),
}),
Expand Down
85 changes: 47 additions & 38 deletions packages/hurl/src/runner/options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*/
use hurl_core::ast::{
BooleanOption, CountOption, DurationOption, Entry, EntryOption, Float, NaturalOption,
Number as AstNumber, OptionKind, SectionValue, VariableDefinition, VariableValue,
Number as AstNumber, OptionKind, Placeholder, SectionValue, VariableDefinition, VariableValue,
};
use hurl_core::typing::{BytesPerSec, Count, DurationUnit};

Expand Down Expand Up @@ -317,17 +317,19 @@ fn eval_boolean_option(
) -> Result<bool, RunnerError> {
match boolean_value {
BooleanOption::Literal(value) => Ok(*value),
BooleanOption::Expression(expr) => match expr::eval(expr, variables)? {
Value::Bool(value) => Ok(value),
v => {
let kind = RunnerErrorKind::TemplateVariableInvalidType {
name: expr.variable.name.clone(),
value: v.format(),
expecting: "boolean".to_string(),
};
Err(RunnerError::new(expr.variable.source_info, kind, false))
BooleanOption::Placeholder(Placeholder { expr, .. }) => {
match expr::eval(expr, variables)? {
Value::Bool(value) => Ok(value),
v => {
let kind = RunnerErrorKind::TemplateVariableInvalidType {
name: expr.variable.name.clone(),
value: v.format(),
expecting: "boolean".to_string(),
};
Err(RunnerError::new(expr.variable.source_info, kind, false))
}
}
},
}
}
}

Expand All @@ -337,28 +339,30 @@ fn eval_natural_option(
) -> Result<u64, RunnerError> {
match natural_value {
NaturalOption::Literal(value) => Ok(*value),
NaturalOption::Expression(expr) => match expr::eval(expr, variables)? {
Value::Number(Number::Integer(value)) => {
if value > 0 {
Ok(value as u64)
} else {
NaturalOption::Placeholder(Placeholder { expr, .. }) => {
match expr::eval(expr, variables)? {
Value::Number(Number::Integer(value)) => {
if value > 0 {
Ok(value as u64)
} else {
let kind = RunnerErrorKind::TemplateVariableInvalidType {
name: expr.variable.name.clone(),
value: format!("integer <{value}>"),
expecting: "integer > 0".to_string(),
};
Err(RunnerError::new(expr.variable.source_info, kind, false))
}
}
v => {
let kind = RunnerErrorKind::TemplateVariableInvalidType {
name: expr.variable.name.clone(),
value: format!("integer <{value}>"),
expecting: "integer > 0".to_string(),
value: v.format(),
expecting: "integer".to_string(),
};
Err(RunnerError::new(expr.variable.source_info, kind, false))
}
}
v => {
let kind = RunnerErrorKind::TemplateVariableInvalidType {
name: expr.variable.name.clone(),
value: v.format(),
expecting: "integer".to_string(),
};
Err(RunnerError::new(expr.variable.source_info, kind, false))
}
},
}
}
}

Expand All @@ -368,7 +372,7 @@ fn eval_count_option(
) -> Result<Count, RunnerError> {
match count_value {
CountOption::Literal(repeat) => Ok(*repeat),
CountOption::Expression(expr) => match expr::eval(expr, variables)? {
CountOption::Placeholder(Placeholder { expr, .. }) => match expr::eval(expr, variables)? {
Value::Number(Number::Integer(value)) => {
if value == -1 {
Ok(Count::Infinite)
Expand Down Expand Up @@ -411,7 +415,8 @@ fn eval_duration_option(
DurationUnit::Minute => value.value * 1000 * 60,
}
}
DurationOption::Expression(expr) => match expr::eval(expr, variables)? {
DurationOption::Placeholder(Placeholder { expr, .. }) => match expr::eval(expr, variables)?
{
Value::Number(Number::Integer(value)) => {
if value < 0 {
let kind = RunnerErrorKind::TemplateVariableInvalidType {
Expand Down Expand Up @@ -466,7 +471,7 @@ fn eval_number(number: &AstNumber) -> Value {

#[cfg(test)]
mod tests {
use hurl_core::ast::{Expr, SourceInfo, Variable, Whitespace};
use hurl_core::ast::{Expr, Placeholder, SourceInfo, Variable, Whitespace};
use hurl_core::reader::Pos;
use hurl_core::typing::{Duration, DurationUnit};

Expand All @@ -475,14 +480,16 @@ mod tests {

fn verbose_option_template() -> BooleanOption {
// {{verbose}}
BooleanOption::Expression(Expr {
BooleanOption::Placeholder(Placeholder {
space0: Whitespace {
value: String::new(),
source_info: SourceInfo::new(Pos::new(0, 0), Pos::new(0, 0)),
},
variable: Variable {
name: "verbose".to_string(),
source_info: SourceInfo::new(Pos::new(0, 0), Pos::new(0, 0)),
expr: Expr {
variable: Variable {
name: "verbose".to_string(),
source_info: SourceInfo::new(Pos::new(0, 0), Pos::new(0, 0)),
},
},
space1: Whitespace {
value: String::new(),
Expand All @@ -493,14 +500,16 @@ mod tests {

fn retry_option_template() -> DurationOption {
// {{retry}}
DurationOption::Expression(Expr {
DurationOption::Placeholder(Placeholder {
space0: Whitespace {
value: String::new(),
source_info: SourceInfo::new(Pos::new(0, 0), Pos::new(0, 0)),
},
variable: Variable {
name: "retry".to_string(),
source_info: SourceInfo::new(Pos::new(0, 0), Pos::new(0, 0)),
expr: Expr {
variable: Variable {
name: "retry".to_string(),
source_info: SourceInfo::new(Pos::new(0, 0), Pos::new(0, 0)),
},
},
space1: Whitespace {
value: String::new(),
Expand Down
10 changes: 6 additions & 4 deletions packages/hurl/src/runner/predicate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1251,14 +1251,16 @@ mod tests {
// {{base_url}}
let template = Template {
delimiter: Some('"'),
elements: vec![TemplateElement::Expression(Expr {
elements: vec![TemplateElement::Placeholder(Placeholder {
space0: Whitespace {
value: String::new(),
source_info: SourceInfo::new(Pos::new(1, 11), Pos::new(1, 11)),
},
variable: Variable {
name: String::from("base_url"),
source_info: SourceInfo::new(Pos::new(1, 11), Pos::new(1, 19)),
expr: Expr {
variable: Variable {
name: String::from("base_url"),
source_info: SourceInfo::new(Pos::new(1, 11), Pos::new(1, 19)),
},
},
space1: Whitespace {
value: String::new(),
Expand Down
2 changes: 1 addition & 1 deletion packages/hurl/src/runner/predicate_value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ pub fn eval_predicate_value(
}
PredicateValue::Hex(value) => Ok(Value::Bytes(value.value.clone())),
PredicateValue::Base64(value) => Ok(Value::Bytes(value.value.clone())),
PredicateValue::Expression(expr) => {
PredicateValue::Placeholder(Placeholder { expr, .. }) => {
let value = eval(expr, variables)?;
Ok(value)
}
Expand Down
26 changes: 15 additions & 11 deletions packages/hurl/src/runner/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -217,11 +217,13 @@ mod tests {
space1: whitespace(),
url: Template {
elements: vec![
TemplateElement::Expression(Expr {
TemplateElement::Placeholder(Placeholder {
space0: whitespace(),
variable: Variable {
name: String::from("base_url"),
source_info: SourceInfo::new(Pos::new(1, 7), Pos::new(1, 15)),
expr: Expr {
variable: Variable {
name: String::from("base_url"),
source_info: SourceInfo::new(Pos::new(1, 7), Pos::new(1, 15)),
},
},
space1: whitespace(),
}),
Expand Down Expand Up @@ -296,14 +298,16 @@ mod tests {
},
Template {
delimiter: None,
elements: vec![TemplateElement::Expression(Expr {
elements: vec![TemplateElement::Placeholder(Placeholder {
space0: whitespace(),
variable: Variable {
name: String::from("param1"),
source_info: SourceInfo::new(
Pos::new(1, 7),
Pos::new(1, 15),
),
expr: Expr {
variable: Variable {
name: String::from("param1"),
source_info: SourceInfo::new(
Pos::new(1, 7),
Pos::new(1, 15),
),
},
},
space1: whitespace(),
})],
Expand Down
12 changes: 7 additions & 5 deletions packages/hurl/src/runner/template.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ fn eval_template_element(
) -> Result<String, RunnerError> {
match template_element {
TemplateElement::String { value, .. } => Ok(value.clone()),
TemplateElement::Expression(expr) => expr::render(expr, variables),
TemplateElement::Placeholder(Placeholder { expr, .. }) => expr::render(expr, variables),
}
}

Expand All @@ -63,14 +63,16 @@ mod tests {

fn template_element_expression() -> TemplateElement {
// {{name}}
TemplateElement::Expression(Expr {
TemplateElement::Placeholder(Placeholder {
space0: Whitespace {
value: String::new(),
source_info: SourceInfo::new(Pos::new(1, 3), Pos::new(1, 3)),
},
variable: Variable {
name: "name".to_string(),
source_info: SourceInfo::new(Pos::new(1, 3), Pos::new(1, 7)),
expr: Expr {
variable: Variable {
name: "name".to_string(),
source_info: SourceInfo::new(Pos::new(1, 3), Pos::new(1, 7)),
},
},
space1: Whitespace {
value: String::new(),
Expand Down
Loading

0 comments on commit 5df1431

Please sign in to comment.