mirror of
https://github.com/danbulant/nushell
synced 2026-06-13 11:41:49 +00:00
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`).
102 lines
2.1 KiB
Rust
102 lines
2.1 KiB
Rust
use crate::value::{Primitive, UntaggedValue, Value};
|
|
use indexmap::IndexMap;
|
|
use nu_errors::ShellError;
|
|
use query_interface::{interfaces, vtable_for, Object, ObjectHash};
|
|
use serde::{Deserialize, Serialize};
|
|
use std::cmp::{Ord, Ordering, PartialOrd};
|
|
use std::fmt::Debug;
|
|
|
|
#[derive(Debug)]
|
|
pub struct Scope {
|
|
pub it: Value,
|
|
pub vars: IndexMap<String, Value>,
|
|
}
|
|
|
|
impl Scope {
|
|
pub fn new(it: Value) -> Scope {
|
|
Scope {
|
|
it,
|
|
vars: IndexMap::new(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Scope {
|
|
pub fn empty() -> Scope {
|
|
Scope {
|
|
it: UntaggedValue::Primitive(Primitive::Nothing).into_untagged_value(),
|
|
vars: IndexMap::new(),
|
|
}
|
|
}
|
|
|
|
pub fn it_value(value: Value) -> Scope {
|
|
Scope {
|
|
it: value,
|
|
vars: IndexMap::new(),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[typetag::serde(tag = "type")]
|
|
pub trait EvaluateTrait: Debug + Send + Sync + Object + ObjectHash + 'static {
|
|
fn invoke(&self, scope: &Scope) -> Result<Value, ShellError>;
|
|
fn clone_box(&self) -> Evaluate;
|
|
}
|
|
|
|
interfaces!(Evaluate: dyn ObjectHash);
|
|
|
|
#[typetag::serde]
|
|
impl EvaluateTrait for Evaluate {
|
|
fn invoke(&self, scope: &Scope) -> Result<Value, ShellError> {
|
|
self.expr.invoke(scope)
|
|
}
|
|
|
|
fn clone_box(&self) -> Evaluate {
|
|
self.expr.clone_box()
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Serialize, Deserialize)]
|
|
pub struct Evaluate {
|
|
expr: Box<dyn EvaluateTrait>,
|
|
}
|
|
|
|
impl Evaluate {
|
|
pub fn new(evaluate: impl EvaluateTrait) -> Evaluate {
|
|
Evaluate {
|
|
expr: Box::new(evaluate),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl std::hash::Hash for Evaluate {
|
|
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
|
|
self.expr.obj_hash(state)
|
|
}
|
|
}
|
|
|
|
impl Clone for Evaluate {
|
|
fn clone(&self) -> Evaluate {
|
|
self.expr.clone_box()
|
|
}
|
|
}
|
|
|
|
impl Ord for Evaluate {
|
|
fn cmp(&self, _: &Self) -> Ordering {
|
|
Ordering::Equal
|
|
}
|
|
}
|
|
|
|
impl PartialOrd for Evaluate {
|
|
fn partial_cmp(&self, _: &Evaluate) -> Option<Ordering> {
|
|
Some(Ordering::Equal)
|
|
}
|
|
}
|
|
|
|
impl PartialEq for Evaluate {
|
|
fn eq(&self, _: &Evaluate) -> bool {
|
|
true
|
|
}
|
|
}
|
|
|
|
impl Eq for Evaluate {}
|