mirror of
https://github.com/nushell/nushell.git
synced 2025-05-09 12:34:26 +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"path" => SyntaxShape::Filepath,
|
||||
b"range" => SyntaxShape::Range,
|
||||
b"string" => SyntaxShape::String,
|
||||
_ if bytes.starts_with(b"oneof")
|
||||
|| bytes.starts_with(b"list")
|
||||
|| bytes.starts_with(b"record")
|
||||
|| bytes.starts_with(b"table") =>
|
||||
{
|
||||
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)
|
||||
parse_generic_shape(working_set, bytes, span, use_loc)
|
||||
}
|
||||
}
|
||||
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'@') {
|
||||
let mut split = bytes.splitn(2, |b| b == &b'@');
|
||||
@ -156,6 +122,49 @@ pub fn parse_shape_name(
|
||||
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>(
|
||||
working_set: &mut StateWorkingSet,
|
||||
bytes: &'a [u8],
|
||||
|
Loading…
Reference in New Issue
Block a user