mirror of
https://github.com/nushell/nushell.git
synced 2024-10-18 00:04:34 +02:00
e4226def16
This commit extracts five new crates: - nu-source, which contains the core source-code handling logic in Nu, including Text, Span, and also the pretty.rs-based debug logic - nu-parser, which is the parser and expander logic - nu-protocol, which is the bulk of the types and basic conveniences used by plugins - nu-errors, which contains ShellError, ParseError and error handling conveniences - nu-textview, which is the textview plugin extracted into a crate One of the major consequences of this refactor is that it's no longer possible to `impl X for Spanned<Y>` outside of the `nu-source` crate, so a lot of types became more concrete (Value became a concrete type instead of Spanned<Value>, for example). This also turned a number of inherent methods in the main nu crate into plain functions (impl Value {} became a bunch of functions in the `value` namespace in `crate::data::value`).
94 lines
2.3 KiB
Rust
94 lines
2.3 KiB
Rust
use nu_errors::ShellError;
|
|
use crate::value::Value;
|
|
use derive_new::new;
|
|
use indexmap::IndexMap;
|
|
use nu_source::Tag;
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
#[derive(Deserialize, Serialize, Debug, Clone)]
|
|
pub struct CallInfo {
|
|
pub args: EvaluatedArgs,
|
|
pub name_tag: Tag,
|
|
}
|
|
|
|
#[derive(Debug, Default, new, Serialize, Deserialize, Clone)]
|
|
pub struct EvaluatedArgs {
|
|
pub positional: Option<Vec<Value>>,
|
|
pub named: Option<IndexMap<String, Value>>,
|
|
}
|
|
|
|
impl EvaluatedArgs {
|
|
pub fn slice_from(&self, from: usize) -> Vec<Value> {
|
|
let positional = &self.positional;
|
|
|
|
match positional {
|
|
None => vec![],
|
|
Some(list) => list[from..].to_vec(),
|
|
}
|
|
}
|
|
|
|
pub fn nth(&self, pos: usize) -> Option<&Value> {
|
|
match &self.positional {
|
|
None => None,
|
|
Some(array) => array.iter().nth(pos),
|
|
}
|
|
}
|
|
|
|
pub fn expect_nth(&self, pos: usize) -> Result<&Value, ShellError> {
|
|
match &self.positional {
|
|
None => Err(ShellError::unimplemented("Better error: expect_nth")),
|
|
Some(array) => match array.iter().nth(pos) {
|
|
None => Err(ShellError::unimplemented("Better error: expect_nth")),
|
|
Some(item) => Ok(item),
|
|
},
|
|
}
|
|
}
|
|
|
|
pub fn len(&self) -> usize {
|
|
match &self.positional {
|
|
None => 0,
|
|
Some(array) => array.len(),
|
|
}
|
|
}
|
|
|
|
pub fn has(&self, name: &str) -> bool {
|
|
match &self.named {
|
|
None => false,
|
|
Some(named) => named.contains_key(name),
|
|
}
|
|
}
|
|
|
|
pub fn get(&self, name: &str) -> Option<&Value> {
|
|
match &self.named {
|
|
None => None,
|
|
Some(named) => named.get(name),
|
|
}
|
|
}
|
|
|
|
pub fn positional_iter(&self) -> PositionalIter<'_> {
|
|
match &self.positional {
|
|
None => PositionalIter::Empty,
|
|
Some(v) => {
|
|
let iter = v.iter();
|
|
PositionalIter::Array(iter)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
pub enum PositionalIter<'a> {
|
|
Empty,
|
|
Array(std::slice::Iter<'a, Value>),
|
|
}
|
|
|
|
impl<'a> Iterator for PositionalIter<'a> {
|
|
type Item = &'a Value;
|
|
|
|
fn next(&mut self) -> Option<Self::Item> {
|
|
match self {
|
|
PositionalIter::Empty => None,
|
|
PositionalIter::Array(iter) => iter.next(),
|
|
}
|
|
}
|
|
}
|