mirror of
https://github.com/nushell/nushell.git
synced 2025-05-10 13:04:28 +02:00
refactor: factor out part of parse_shape_name
to parse_generic_shape
This commit is contained in:
parent
fe5fae1e08
commit
67a16b30e7
@ -64,48 +64,14 @@ pub fn parse_shape_name(
|
|||||||
b"number" => SyntaxShape::Number,
|
b"number" => SyntaxShape::Number,
|
||||||
b"path" => SyntaxShape::Filepath,
|
b"path" => SyntaxShape::Filepath,
|
||||||
b"range" => SyntaxShape::Range,
|
b"range" => SyntaxShape::Range,
|
||||||
|
b"string" => SyntaxShape::String,
|
||||||
_ if bytes.starts_with(b"oneof")
|
_ if bytes.starts_with(b"oneof")
|
||||||
|| bytes.starts_with(b"list")
|
|| bytes.starts_with(b"list")
|
||||||
|| bytes.starts_with(b"record")
|
|| bytes.starts_with(b"record")
|
||||||
|| bytes.starts_with(b"table") =>
|
|| bytes.starts_with(b"table") =>
|
||||||
{
|
{
|
||||||
let (type_name, type_params) = split_generic_params(working_set, bytes, span);
|
parse_generic_shape(working_set, bytes, span, use_loc)
|
||||||
match type_name {
|
|
||||||
b"oneof" => SyntaxShape::OneOf(match type_params {
|
|
||||||
Some(params) => parse_type_params(working_set, params, use_loc),
|
|
||||||
None => vec![],
|
|
||||||
}),
|
|
||||||
b"list" => SyntaxShape::List(Box::new(match type_params {
|
|
||||||
Some(params) => {
|
|
||||||
let mut parsed_params = parse_type_params(working_set, params, use_loc);
|
|
||||||
if parsed_params.len() > 1 {
|
|
||||||
working_set.error(ParseError::LabeledError(
|
|
||||||
"expected a single type parameter".into(),
|
|
||||||
"only one parameter allowed".into(),
|
|
||||||
params.span,
|
|
||||||
));
|
|
||||||
SyntaxShape::Any
|
|
||||||
} else {
|
|
||||||
parsed_params.pop().unwrap_or(SyntaxShape::Any)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None => SyntaxShape::Any,
|
|
||||||
})),
|
|
||||||
b"record" => SyntaxShape::Record(match type_params {
|
|
||||||
Some(params) => parse_named_type_params(working_set, params, use_loc),
|
|
||||||
None => vec![],
|
|
||||||
}),
|
|
||||||
b"table" => SyntaxShape::Table(match type_params {
|
|
||||||
Some(params) => parse_named_type_params(working_set, params, use_loc),
|
|
||||||
None => vec![],
|
|
||||||
}),
|
|
||||||
_ => {
|
|
||||||
working_set.error(ParseError::UnknownType(span));
|
|
||||||
SyntaxShape::Any
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
b"string" => SyntaxShape::String,
|
|
||||||
_ => {
|
_ => {
|
||||||
if bytes.contains(&b'@') {
|
if bytes.contains(&b'@') {
|
||||||
let mut split = bytes.splitn(2, |b| b == &b'@');
|
let mut split = bytes.splitn(2, |b| b == &b'@');
|
||||||
@ -156,6 +122,49 @@ pub fn parse_shape_name(
|
|||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parse_generic_shape(
|
||||||
|
working_set: &mut StateWorkingSet<'_>,
|
||||||
|
bytes: &[u8],
|
||||||
|
span: Span,
|
||||||
|
use_loc: ShapeDescriptorUse,
|
||||||
|
) -> SyntaxShape {
|
||||||
|
let (type_name, type_params) = split_generic_params(working_set, bytes, span);
|
||||||
|
match type_name {
|
||||||
|
b"oneof" => SyntaxShape::OneOf(match type_params {
|
||||||
|
Some(params) => parse_type_params(working_set, params, use_loc),
|
||||||
|
None => vec![],
|
||||||
|
}),
|
||||||
|
b"list" => SyntaxShape::List(Box::new(match type_params {
|
||||||
|
Some(params) => {
|
||||||
|
let mut parsed_params = parse_type_params(working_set, params, use_loc);
|
||||||
|
if parsed_params.len() > 1 {
|
||||||
|
working_set.error(ParseError::LabeledError(
|
||||||
|
"expected a single type parameter".into(),
|
||||||
|
"only one parameter allowed".into(),
|
||||||
|
params.span,
|
||||||
|
));
|
||||||
|
SyntaxShape::Any
|
||||||
|
} else {
|
||||||
|
parsed_params.pop().unwrap_or(SyntaxShape::Any)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => SyntaxShape::Any,
|
||||||
|
})),
|
||||||
|
b"record" => SyntaxShape::Record(match type_params {
|
||||||
|
Some(params) => parse_named_type_params(working_set, params, use_loc),
|
||||||
|
None => vec![],
|
||||||
|
}),
|
||||||
|
b"table" => SyntaxShape::Table(match type_params {
|
||||||
|
Some(params) => parse_named_type_params(working_set, params, use_loc),
|
||||||
|
None => vec![],
|
||||||
|
}),
|
||||||
|
_ => {
|
||||||
|
working_set.error(ParseError::UnknownType(span));
|
||||||
|
SyntaxShape::Any
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn split_generic_params<'a>(
|
fn split_generic_params<'a>(
|
||||||
working_set: &mut StateWorkingSet,
|
working_set: &mut StateWorkingSet,
|
||||||
bytes: &'a [u8],
|
bytes: &'a [u8],
|
||||||
|
Loading…
Reference in New Issue
Block a user