Skip to content

Commit 329d745

Browse files
committed
Add ... segment for allowing arbitrary uncaptured trailing text
1 parent cdb75ee commit 329d745

File tree

2 files changed

+28
-13
lines changed

2 files changed

+28
-13
lines changed

src/commands.rs

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ impl Commands {
6868
let mut opt_lambda_state = None;
6969
let mut opt_final_states = vec![];
7070

71+
let handler = Arc::new(Command {
72+
guard,
73+
ptr: Box::new(handler),
74+
});
75+
7176
command
7277
.split(' ')
7378
.filter(|segment| segment.len() > 0)
@@ -90,18 +95,25 @@ impl Commands {
9095
} else {
9196
opt_lambda_state = None;
9297
opt_final_states.truncate(0);
98+
let last_state = state;
9399
state = self.add_space(state, i);
94100

95101
if segment.starts_with("```\n") && segment.ends_with("```") {
96102
state = self.add_code_segment_multi_line(state, segment);
97103
} else if segment.starts_with("```") && segment.ends_with("```") {
98-
state = self.add_code_segment_single_line(state, 3, segment);
104+
state = self.add_code_segment_single_line(state, segment, 3);
99105
} else if segment.starts_with('`') && segment.ends_with('`') {
100-
state = self.add_code_segment_single_line(state, 1, segment);
106+
state = self.add_code_segment_single_line(state, segment, 1);
101107
} else if segment.starts_with('{') && segment.ends_with('}') {
102108
state = self.add_dynamic_segment(state, segment);
103109
} else if segment.ends_with("...") {
104-
state = self.add_remaining_segment(state, segment);
110+
if segment == "..." {
111+
self.state_machine.set_final_state(last_state);
112+
self.state_machine.set_handler(last_state, handler.clone());
113+
state = self.add_unnamed_remaining_segment(last_state);
114+
} else {
115+
state = self.add_remaining_segment(state, segment);
116+
}
105117
} else {
106118
segment.chars().for_each(|ch| {
107119
state = self.state_machine.add(state, CharacterSet::from_char(ch))
@@ -110,11 +122,6 @@ impl Commands {
110122
}
111123
});
112124

113-
let handler = Arc::new(Command {
114-
guard,
115-
ptr: Box::new(handler),
116-
});
117-
118125
if opt_lambda_state.is_some() {
119126
opt_final_states.iter().for_each(|state| {
120127
self.state_machine.set_final_state(*state);
@@ -246,6 +253,14 @@ impl Commands {
246253
state
247254
}
248255

256+
fn add_unnamed_remaining_segment(&mut self, mut state: usize) -> usize {
257+
let char_set = CharacterSet::any();
258+
state = self.state_machine.add(state, char_set);
259+
self.state_machine.add_next_state(state, state);
260+
261+
state
262+
}
263+
249264
fn add_code_segment_multi_line(&mut self, mut state: usize, s: &'static str) -> usize {
250265
let name = &s[4..s.len() - 3];
251266

@@ -279,8 +294,8 @@ impl Commands {
279294
fn add_code_segment_single_line(
280295
&mut self,
281296
mut state: usize,
282-
n_backticks: usize,
283297
s: &'static str,
298+
n_backticks: usize,
284299
) -> usize {
285300
use std::iter::repeat;
286301

src/main.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ fn app() -> Result<(), Error> {
119119
if config.eval {
120120
// rust playground
121121
cmds.add(
122-
"?play mode={} edition={} channel={} warn={} ```\ncode```",
122+
"?play mode={} edition={} channel={} warn={} ```\ncode``` ...",
123123
playground::run,
124124
);
125125
cmds.add("?play code...", playground::err);
@@ -130,15 +130,15 @@ fn app() -> Result<(), Error> {
130130
);
131131

132132
cmds.add(
133-
"?eval mode={} edition={} channel={} warn={} ```\ncode```",
133+
"?eval mode={} edition={} channel={} warn={} ```\ncode``` ...",
134134
playground::eval,
135135
);
136136
cmds.add(
137-
"?eval mode={} edition={} channel={} warn={} ```code```",
137+
"?eval mode={} edition={} channel={} warn={} ```code``` ...",
138138
playground::eval,
139139
);
140140
cmds.add(
141-
"?eval mode={} edition={} channel={} warn={} `code`",
141+
"?eval mode={} edition={} channel={} warn={} `code` ...",
142142
playground::eval,
143143
);
144144
cmds.add("?eval code...", playground::eval_err);

0 commit comments

Comments
 (0)