forked from mirrors/jj
templater: create a type for property+labels
I'm going to make `parse_method_chain` also return a list of labels to add, so we can make e.g. `author.timestamp()` automatically get labeled with both "author" and "timestamp".
This commit is contained in:
parent
4953467e44
commit
0b9ab871b2
1 changed files with 7 additions and 4 deletions
|
@ -287,11 +287,13 @@ impl<'a, I: 'a> Property<'a, I> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct PropertyAndLabels<'a, C>(Property<'a, C>, Vec<String>);
|
||||||
|
|
||||||
fn parse_commit_keyword<'a>(
|
fn parse_commit_keyword<'a>(
|
||||||
repo: RepoRef<'a>,
|
repo: RepoRef<'a>,
|
||||||
workspace_id: &WorkspaceId,
|
workspace_id: &WorkspaceId,
|
||||||
pair: Pair<Rule>,
|
pair: Pair<Rule>,
|
||||||
) -> (Property<'a, Commit>, String) {
|
) -> PropertyAndLabels<'a, Commit> {
|
||||||
assert_eq!(pair.as_rule(), Rule::identifier);
|
assert_eq!(pair.as_rule(), Rule::identifier);
|
||||||
let property = match pair.as_str() {
|
let property = match pair.as_str() {
|
||||||
"description" => Property::String(Box::new(DescriptionProperty)),
|
"description" => Property::String(Box::new(DescriptionProperty)),
|
||||||
|
@ -312,7 +314,7 @@ fn parse_commit_keyword<'a>(
|
||||||
"conflict" => Property::Boolean(Box::new(ConflictProperty)),
|
"conflict" => Property::Boolean(Box::new(ConflictProperty)),
|
||||||
name => panic!("unexpected identifier: {name}"),
|
name => panic!("unexpected identifier: {name}"),
|
||||||
};
|
};
|
||||||
(property, pair.as_str().to_string())
|
PropertyAndLabels(property, vec![pair.as_str().to_string()])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn coerce_to_string<'a, I: 'a>(
|
fn coerce_to_string<'a, I: 'a>(
|
||||||
|
@ -390,14 +392,15 @@ fn parse_commit_term<'a>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Rule::identifier => {
|
Rule::identifier => {
|
||||||
let (term_property, label) = parse_commit_keyword(repo, workspace_id, expr);
|
let PropertyAndLabels(term_property, labels) =
|
||||||
|
parse_commit_keyword(repo, workspace_id, expr);
|
||||||
let property = parse_method_chain(maybe_method, term_property);
|
let property = parse_method_chain(maybe_method, term_property);
|
||||||
let string_property = coerce_to_string(property);
|
let string_property = coerce_to_string(property);
|
||||||
Box::new(LabelTemplate::new(
|
Box::new(LabelTemplate::new(
|
||||||
Box::new(StringPropertyTemplate {
|
Box::new(StringPropertyTemplate {
|
||||||
property: string_property,
|
property: string_property,
|
||||||
}),
|
}),
|
||||||
vec![label],
|
labels,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
Rule::function => {
|
Rule::function => {
|
||||||
|
|
Loading…
Reference in a new issue