Skip to content

Commit 2311fb3

Browse files
simplify arg checking
1 parent 077a5f2 commit 2311fb3

File tree

2 files changed

+24
-45
lines changed

2 files changed

+24
-45
lines changed

crates/djls-templates/src/templatetags.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
mod specs;
22

3+
pub use specs::ArgSpec;
34
pub use specs::TagSpecs;
45

56
pub enum TagType {

crates/djls-templates/src/validation.rs

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use crate::ast::Span;
2323
use crate::ast::TagName;
2424
use crate::ast::TagNode;
2525
use crate::db::Db as TemplateDb;
26+
use crate::templatetags::ArgSpec;
2627
use crate::templatetags::TagType;
2728
use crate::Ast;
2829

@@ -52,25 +53,34 @@ impl<'db> TagValidator<'db> {
5253
if let Some(Node::Tag { name, bits, span }) = self.current_node() {
5354
let name_str = name.text(self.db);
5455

55-
match TagType::for_name(&name_str, &self.db.tag_specs()) {
56+
let tag_specs = self.db.tag_specs();
57+
let tag_type = TagType::for_name(&name_str, &tag_specs);
58+
59+
let arg_spec = match tag_type {
60+
TagType::Closer => tag_specs
61+
.get_end_spec_for_closer(&name_str)
62+
.and_then(|s| s.args.as_ref()),
63+
_ => tag_specs.get(&name_str).and_then(|s| s.args.as_ref()),
64+
};
65+
66+
self.check_arguments(&name_str, &bits, span, arg_spec);
67+
68+
match tag_type {
5669
TagType::Opener => {
57-
self.check_arguments(&name_str, &bits, span);
5870
self.stack.push(TagNode {
5971
name,
6072
bits: bits.clone(),
6173
span,
6274
});
6375
}
6476
TagType::Intermediate => {
65-
self.check_arguments(&name_str, &bits, span);
6677
self.handle_intermediate(&name_str, span);
6778
}
6879
TagType::Closer => {
69-
self.check_closer_arguments(&name_str, &bits, span);
7080
self.handle_closer(name, &bits, span);
7181
}
7282
TagType::Standalone => {
73-
self.check_arguments(&name_str, &bits, span);
83+
// No additional action needed for standalone tags
7484
}
7585
}
7686
}
@@ -89,46 +99,14 @@ impl<'db> TagValidator<'db> {
8999
self.errors
90100
}
91101

92-
fn check_arguments(&mut self, name: &str, bits: &[String], span: Span<'db>) {
93-
let tag_specs = self.db.tag_specs();
94-
let Some(spec) = tag_specs.get(name) else {
95-
return;
96-
};
97-
98-
let Some(arg_spec) = &spec.args else {
99-
return;
100-
};
101-
102-
if let Some(min) = arg_spec.min {
103-
if bits.len() < min {
104-
self.errors.push(AstError::MissingRequiredArguments {
105-
tag: name.to_string(),
106-
min,
107-
span_start: span.start(self.db),
108-
span_length: span.length(self.db),
109-
});
110-
}
111-
}
112-
113-
if let Some(max) = arg_spec.max {
114-
if bits.len() > max {
115-
self.errors.push(AstError::TooManyArguments {
116-
tag: name.to_string(),
117-
max,
118-
span_start: span.start(self.db),
119-
span_length: span.length(self.db),
120-
});
121-
}
122-
}
123-
}
124-
125-
fn check_closer_arguments(&mut self, name: &str, bits: &[String], span: Span<'db>) {
126-
let tag_specs = self.db.tag_specs();
127-
let Some(end_spec) = tag_specs.get_end_spec_for_closer(name) else {
128-
return;
129-
};
130-
131-
let Some(arg_spec) = &end_spec.args else {
102+
fn check_arguments(
103+
&mut self,
104+
name: &str,
105+
bits: &[String],
106+
span: Span<'db>,
107+
arg_spec: Option<&ArgSpec>,
108+
) {
109+
let Some(arg_spec) = arg_spec else {
132110
return;
133111
};
134112

0 commit comments

Comments
 (0)