forked from extern/nushell
# Description This PR adds a fix for reading tag values from YAML file. A tag in YAML file is denoted by using the exclamation point ("!") symbol. For example - Key: !Value Additional passing test has also been added supporting the bug fix - - `test_convert_yaml_value_to_nu_value_for_tagged_values` The fix passes all the below required tests suites locally - >To check standard code formatting. - `cargo fmt --all -- --check` (`cargo fmt --all` applies these changes) >To check that you're using the standard code style. - `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A clippy::needless_collect` >To check that all tests pass - `cargo test --workspace` --------- Co-authored-by: Nitin Londhe <nitin.londhe@genmills.com>
This commit is contained in:
parent
4c97b3dd28
commit
106ca65c58
@ -174,6 +174,30 @@ fn convert_yaml_value_to_nu_value(
|
|||||||
|
|
||||||
Value::from(collected)
|
Value::from(collected)
|
||||||
}
|
}
|
||||||
|
serde_yaml::Value::Tagged(t) => {
|
||||||
|
let tag = &t.tag;
|
||||||
|
let value = match &t.value {
|
||||||
|
serde_yaml::Value::String(s) => {
|
||||||
|
let val = format!("{} {}", tag, s).trim().to_string();
|
||||||
|
Value::String { val, span }
|
||||||
|
}
|
||||||
|
serde_yaml::Value::Number(n) => {
|
||||||
|
let val = format!("{} {}", tag, n).trim().to_string();
|
||||||
|
Value::String { val, span }
|
||||||
|
}
|
||||||
|
serde_yaml::Value::Bool(b) => {
|
||||||
|
let val = format!("{} {}", tag, b).trim().to_string();
|
||||||
|
Value::String { val, span }
|
||||||
|
}
|
||||||
|
serde_yaml::Value::Null => {
|
||||||
|
let val = format!("{}", tag).trim().to_string();
|
||||||
|
Value::String { val, span }
|
||||||
|
}
|
||||||
|
v => convert_yaml_value_to_nu_value(v, span, val_span)?,
|
||||||
|
};
|
||||||
|
|
||||||
|
value
|
||||||
|
}
|
||||||
serde_yaml::Value::Null => Value::nothing(span),
|
serde_yaml::Value::Null => Value::nothing(span),
|
||||||
x => unimplemented!("Unsupported YAML case: {:?}", x),
|
x => unimplemented!("Unsupported YAML case: {:?}", x),
|
||||||
})
|
})
|
||||||
@ -314,4 +338,63 @@ mod test {
|
|||||||
|
|
||||||
test_examples(FromYaml {})
|
test_examples(FromYaml {})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_convert_yaml_value_to_nu_value_for_tagged_values() {
|
||||||
|
struct TestCase {
|
||||||
|
input: &'static str,
|
||||||
|
expected: Result<Value, ShellError>,
|
||||||
|
}
|
||||||
|
|
||||||
|
let test_cases: Vec<TestCase> = vec![
|
||||||
|
TestCase {
|
||||||
|
input: "Key: !Value ${TEST}-Test-role",
|
||||||
|
expected: Ok(Value::Record {
|
||||||
|
cols: vec!["Key".to_string()],
|
||||||
|
vals: vec![Value::test_string("!Value ${TEST}-Test-role")],
|
||||||
|
span: Span::test_data(),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
TestCase {
|
||||||
|
input: "Key: !Value test-${TEST}",
|
||||||
|
expected: Ok(Value::Record {
|
||||||
|
cols: vec!["Key".to_string()],
|
||||||
|
vals: vec![Value::test_string("!Value test-${TEST}")],
|
||||||
|
span: Span::test_data(),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
TestCase {
|
||||||
|
input: "Key: !Value",
|
||||||
|
expected: Ok(Value::Record {
|
||||||
|
cols: vec!["Key".to_string()],
|
||||||
|
vals: vec![Value::test_string("!Value")],
|
||||||
|
span: Span::test_data(),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
TestCase {
|
||||||
|
input: "Key: !True",
|
||||||
|
expected: Ok(Value::Record {
|
||||||
|
cols: vec!["Key".to_string()],
|
||||||
|
vals: vec![Value::test_string("!True")],
|
||||||
|
span: Span::test_data(),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
TestCase {
|
||||||
|
input: "Key: !123",
|
||||||
|
expected: Ok(Value::Record {
|
||||||
|
cols: vec!["Key".to_string()],
|
||||||
|
vals: vec![Value::test_string("!123")],
|
||||||
|
span: Span::test_data(),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
for test_case in test_cases {
|
||||||
|
let doc = serde_yaml::Deserializer::from_str(test_case.input);
|
||||||
|
let v: serde_yaml::Value = serde_yaml::Value::deserialize(doc.last().unwrap()).unwrap();
|
||||||
|
let result = convert_yaml_value_to_nu_value(&v, Span::test_data(), Span::test_data());
|
||||||
|
assert!(result.is_ok());
|
||||||
|
assert!(result.ok().unwrap() == test_case.expected.ok().unwrap());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user