mirror of
https://github.com/nushell/nushell.git
synced 2025-04-30 16:14:27 +02:00
WIP
This commit is contained in:
parent
34033afce4
commit
71adfb4cdc
@ -262,7 +262,9 @@ macro_rules! command {
|
|||||||
Extract {
|
Extract {
|
||||||
$($extract:tt)* {
|
$($extract:tt)* {
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
$args.expect_nth($($positional_count)*)?.try_into()?
|
let value = $args.expect_nth($($positional_count)*)?;
|
||||||
|
let value = $param_kind.check(value)?;
|
||||||
|
value.extract()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
use crate::errors::ShellError;
|
use crate::errors::ShellError;
|
||||||
use crate::object::{Primitive, Switch, Value};
|
use crate::object::{Primitive, Switch, Value};
|
||||||
use crate::parser::parse::span::Span;
|
use crate::parser::parse::span::Span;
|
||||||
use crate::parser::registry::NamedType;
|
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
use mime::Mime;
|
use mime::Mime;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use crate::errors::ShellError;
|
use crate::errors::ShellError;
|
||||||
use crate::object::Block;
|
use crate::object::types::*;
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
use futures::future::ready;
|
use futures::future::ready;
|
||||||
use log::trace;
|
use log::trace;
|
||||||
|
@ -149,11 +149,6 @@ impl Deserialize<'de> for Block {
|
|||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
{
|
{
|
||||||
unimplemented!("deserialize block")
|
unimplemented!("deserialize block")
|
||||||
// let s = "\"unimplemented deserialize block\"";
|
|
||||||
// Ok(Block::new(
|
|
||||||
// TokenTreeBuilder::spanned_string((1, s.len() - 1), (0, s.len())),
|
|
||||||
// Text::from(s),
|
|
||||||
// ))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,86 @@
|
|||||||
|
use crate::object::base as value;
|
||||||
|
use crate::parser::hir;
|
||||||
|
use crate::prelude::*;
|
||||||
use derive_new::new;
|
use derive_new::new;
|
||||||
use serde_derive::{Deserialize, Serialize};
|
use serde_derive::{Deserialize, Serialize};
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq, Hash, Ord, PartialOrd, new)]
|
pub trait Type: std::fmt::Debug + Send {
|
||||||
pub enum Type {
|
fn name(&self) -> &'static str;
|
||||||
Any,
|
fn check(&self, value: Spanned<Value>) -> Result<Spanned<Value>, ShellError>;
|
||||||
|
fn coerce(&self) -> Option<hir::ExpressionKindHint> {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait ExtractType<T>: Type {
|
||||||
|
fn extract(value: Value) -> T;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize, Clone, Eq, PartialEq, Hash, Ord, PartialOrd, new)]
|
||||||
|
pub struct Any;
|
||||||
|
|
||||||
|
impl Type for Any {
|
||||||
|
fn name(&self) -> &'static str {
|
||||||
|
"Any"
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check(&self, value: Spanned<Value>) -> Result<Spanned<Value>, ShellError> {
|
||||||
|
Ok(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize, Clone, Eq, PartialEq, Hash, Ord, PartialOrd, new)]
|
||||||
|
pub struct Integer;
|
||||||
|
|
||||||
|
impl Type for Integer {
|
||||||
|
fn name(&self) -> &'static str {
|
||||||
|
"Integer"
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check(&self, value: Spanned<Value>) -> Result<Spanned<Value>, ShellError> {
|
||||||
|
match value {
|
||||||
|
v @ Spanned {
|
||||||
|
item: Value::Primitive(Primitive::Int(_)),
|
||||||
|
..
|
||||||
|
} => Ok(v),
|
||||||
|
other => Err(ShellError::type_error("Integer", other.spanned_type_name())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ExtractType<i64> for Integer {
|
||||||
|
fn extract(value: Value) -> i64 {
|
||||||
|
match value {
|
||||||
|
Value::Primitive(Primitive::Int(int)) => int,
|
||||||
|
_ => unreachable!("invariant: must check before extract"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize, Clone, Eq, PartialEq, Hash, Ord, PartialOrd, new)]
|
||||||
|
pub struct Block;
|
||||||
|
|
||||||
|
impl Type for Block {
|
||||||
|
fn name(&self) -> &'static str {
|
||||||
|
"Block"
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check(&self, value: Spanned<Value>) -> Result<Spanned<Value>, ShellError> {
|
||||||
|
match value {
|
||||||
|
v @ Spanned {
|
||||||
|
item: Value::Block(_),
|
||||||
|
..
|
||||||
|
} => Ok(v),
|
||||||
|
other => Err(ShellError::type_error("Block", other.spanned_type_name())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ExtractType<value::Block> for Block {
|
||||||
|
fn extract(value: Value) -> value::Block {
|
||||||
|
match value {
|
||||||
|
Value::Block(block) => block,
|
||||||
|
_ => unreachable!("invariant: must check before extract"),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,9 @@ crate use crate::context::Context;
|
|||||||
crate use crate::env::host::handle_unexpected;
|
crate use crate::env::host::handle_unexpected;
|
||||||
crate use crate::env::{Environment, Host};
|
crate use crate::env::{Environment, Host};
|
||||||
crate use crate::errors::ShellError;
|
crate use crate::errors::ShellError;
|
||||||
|
crate use crate::object::types::{ExtractType, Type};
|
||||||
crate use crate::object::{Primitive, Value};
|
crate use crate::object::{Primitive, Value};
|
||||||
|
crate use crate::parser::{Span, Spanned};
|
||||||
crate use crate::stream::{InputStream, OutputStream};
|
crate use crate::stream::{InputStream, OutputStream};
|
||||||
crate use crate::Text;
|
crate use crate::Text;
|
||||||
crate use futures::stream::BoxStream;
|
crate use futures::stream::BoxStream;
|
||||||
|
Loading…
Reference in New Issue
Block a user