forked from extern/nushell
e5d38dcff6
* Fix clippy lints in tests * Replace `format!` in `.push_str()` with `write!` Stylistically that might be a bit rough but elides an allocation. Fallibility of allocation is more explicit, but ignored with `let _ =` like in the clippy example: https://rust-lang.github.io/rust-clippy/master/index.html#format_push_string * Remove unused lifetime * Fix macro crate relative import * Derive `Eq` for `PartialEq` with `Eq` members https://rust-lang.github.io/rust-clippy/master/index.html#derive_partial_eq_without_eq * Remove unnnecessary `.to_string()` for Cow<str> * Remove `.to_string()` for `tendril::Tendril` Implements `Deref<Target = str>`
52 lines
1.3 KiB
Rust
52 lines
1.3 KiB
Rust
use super::Expression;
|
|
use crate::Span;
|
|
use serde::{Deserialize, Serialize};
|
|
use std::fmt::Write;
|
|
|
|
#[derive(Debug, Clone, PartialOrd, Serialize, Deserialize)]
|
|
pub enum PathMember {
|
|
String { val: String, span: Span },
|
|
Int { val: usize, span: Span },
|
|
}
|
|
|
|
impl PartialEq for PathMember {
|
|
fn eq(&self, other: &Self) -> bool {
|
|
match (self, other) {
|
|
(Self::String { val: l_val, .. }, Self::String { val: r_val, .. }) => l_val == r_val,
|
|
(Self::Int { val: l_val, .. }, Self::Int { val: r_val, .. }) => l_val == r_val,
|
|
_ => false,
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize)]
|
|
pub struct CellPath {
|
|
pub members: Vec<PathMember>,
|
|
}
|
|
|
|
impl CellPath {
|
|
pub fn into_string(&self) -> String {
|
|
let mut output = String::new();
|
|
|
|
for (idx, elem) in self.members.iter().enumerate() {
|
|
if idx > 0 {
|
|
output.push('.');
|
|
}
|
|
match elem {
|
|
PathMember::Int { val, .. } => {
|
|
let _ = write!(output, "{}", val);
|
|
}
|
|
PathMember::String { val, .. } => output.push_str(val),
|
|
}
|
|
}
|
|
|
|
output
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
|
pub struct FullCellPath {
|
|
pub head: Expression,
|
|
pub tail: Vec<PathMember>,
|
|
}
|