forked from extern/nushell
"Integers" in column paths fetch a row from a table.
This commit is contained in:
parent
2d44b7d296
commit
cea8fab307
@ -475,6 +475,13 @@ impl Value {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn get_data_by_index(&self, idx: usize) -> Option<&Tagged<Value>> {
|
||||||
|
match self {
|
||||||
|
Value::Table(value_set) => value_set.get(idx),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn get_data_by_key(&self, name: &str) -> Option<&Tagged<Value>> {
|
pub(crate) fn get_data_by_key(&self, name: &str) -> Option<&Tagged<Value>> {
|
||||||
match self {
|
match self {
|
||||||
Value::Row(o) => o.get_data_by_key(name),
|
Value::Row(o) => o.get_data_by_key(name),
|
||||||
@ -526,7 +533,15 @@ impl Value {
|
|||||||
) -> Option<Tagged<&Value>> {
|
) -> Option<Tagged<&Value>> {
|
||||||
let mut current = self;
|
let mut current = self;
|
||||||
for p in path {
|
for p in path {
|
||||||
match current.get_data_by_key(p) {
|
let value = if p.chars().all(char::is_numeric) {
|
||||||
|
current.get_data_by_index(p.chars().fold(0 as usize, |acc, c| {
|
||||||
|
c.to_digit(10).unwrap_or(0) as usize + acc
|
||||||
|
}))
|
||||||
|
} else {
|
||||||
|
current.get_data_by_key(p)
|
||||||
|
};
|
||||||
|
|
||||||
|
match value {
|
||||||
Some(v) => current = v,
|
Some(v) => current = v,
|
||||||
None => return None,
|
None => return None,
|
||||||
}
|
}
|
||||||
@ -960,7 +975,7 @@ mod tests {
|
|||||||
|
|
||||||
let (version, tag) = string("0.4.0").into_parts();
|
let (version, tag) = string("0.4.0").into_parts();
|
||||||
|
|
||||||
let row = Value::row(indexmap! {
|
let value = Value::row(indexmap! {
|
||||||
"package".into() =>
|
"package".into() =>
|
||||||
row(indexmap! {
|
row(indexmap! {
|
||||||
"name".into() => string("nu"),
|
"name".into() => string("nu"),
|
||||||
@ -969,7 +984,7 @@ mod tests {
|
|||||||
});
|
});
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
**row.get_data_by_column_path(tag, &field_path).unwrap(),
|
**value.get_data_by_column_path(tag, &field_path).unwrap(),
|
||||||
version
|
version
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -980,7 +995,7 @@ mod tests {
|
|||||||
|
|
||||||
let (name, tag) = string("Andrés N. Robalino").into_parts();
|
let (name, tag) = string("Andrés N. Robalino").into_parts();
|
||||||
|
|
||||||
let row = Value::row(indexmap! {
|
let value = Value::row(indexmap! {
|
||||||
"package".into() => row(indexmap! {
|
"package".into() => row(indexmap! {
|
||||||
"name".into() => string("nu"),
|
"name".into() => string("nu"),
|
||||||
"version".into() => string("0.4.0"),
|
"version".into() => string("0.4.0"),
|
||||||
@ -993,11 +1008,37 @@ mod tests {
|
|||||||
});
|
});
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
**row.get_data_by_column_path(tag, &field_path).unwrap(),
|
**value.get_data_by_column_path(tag, &field_path).unwrap(),
|
||||||
name
|
name
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn column_path_that_contains_just_a_numbers_gets_a_row_from_a_table() {
|
||||||
|
let field_path = column_path(&vec![string("package"), string("authors"), string("0")]);
|
||||||
|
|
||||||
|
let (_, tag) = string("Andrés N. Robalino").into_parts();
|
||||||
|
|
||||||
|
let value = Value::row(indexmap! {
|
||||||
|
"package".into() => row(indexmap! {
|
||||||
|
"name".into() => string("nu"),
|
||||||
|
"version".into() => string("0.4.0"),
|
||||||
|
"authors".into() => table(&vec![
|
||||||
|
row(indexmap!{"name".into() => string("Andrés N. Robalino")}),
|
||||||
|
row(indexmap!{"name".into() => string("Jonathan Turner")}),
|
||||||
|
row(indexmap!{"name".into() => string("Yehuda Katz")})
|
||||||
|
])
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
**value.get_data_by_column_path(tag, &field_path).unwrap(),
|
||||||
|
Value::row(indexmap! {
|
||||||
|
"name".into() => string("Andrés N. Robalino")
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn replaces_matching_field_from_a_row() {
|
fn replaces_matching_field_from_a_row() {
|
||||||
let field_path = column_path(&vec![string("amigos")]);
|
let field_path = column_path(&vec![string("amigos")]);
|
||||||
|
Loading…
Reference in New Issue
Block a user