Skip to content

Commit 334bbbc

Browse files
Simplify label API slightly
1 parent 7513b2a commit 334bbbc

File tree

2 files changed

+18
-24
lines changed

2 files changed

+18
-24
lines changed

src/load_file.rs

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,7 @@ impl Core {
216216
self.instructions[index] = value;
217217
}
218218

219-
pub fn add_labels<T>(&mut self, index: usize, labels: Vec<T>) -> Result<(), String>
220-
where
221-
T: Into<String>,
222-
{
219+
pub fn add_label(&mut self, index: usize, label: String) -> Result<(), String> {
223220
if index > self.instructions.len() {
224221
return Err(format!(
225222
"Address {} is not valid for core of size {}",
@@ -228,18 +225,13 @@ impl Core {
228225
));
229226
}
230227

231-
for label in labels {
232-
match self.labels.entry(label.into()) {
233-
Entry::Occupied(entry) => {
234-
return Err(format!("Label '{}' already exists", entry.key()));
235-
}
236-
Entry::Vacant(entry) => {
237-
entry.insert(index);
238-
}
228+
match self.labels.entry(label) {
229+
Entry::Occupied(entry) => Err(format!("Label '{}' already exists", entry.key())),
230+
Entry::Vacant(entry) => {
231+
entry.insert(index);
232+
Ok(())
239233
}
240234
}
241-
242-
Ok(())
243235
}
244236

245237
pub fn label_address(&self, label: &str) -> Option<usize> {
@@ -427,13 +419,13 @@ mod tests {
427419
fn labels() {
428420
let mut core = Core::new(200);
429421

430-
core.add_labels(123, vec!["baz"]).expect("Should add label");
431-
core.add_labels(0, vec!["foo", "bar"])
432-
.expect("Should add two labels");
422+
core.add_label(123, "baz".into()).expect("Should add baz");
423+
core.add_label(0, "foo".into()).expect("Should add foo");
424+
core.add_label(0, "bar".into()).expect("Should add bar");
433425

434-
core.add_labels(256, vec!["goblin"])
426+
core.add_label(256, "goblin".into())
435427
.expect_err("Should fail to add labels > 200");
436-
core.add_labels(5, vec!["baz"])
428+
core.add_label(5, "baz".into())
437429
.expect_err("Should fail to add duplicate label");
438430

439431
assert_eq!(core.label_address("foo").unwrap(), 0);

src/parser.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,9 @@ pub fn parse(file_contents: &str) -> Result<Core, Error> {
8585
.take_while_ref(|pair| pair.as_rule() == Rule::Label)
8686
.map(|pair| pair.as_str().to_owned());
8787

88-
core.add_labels(i, label_pairs.collect())?;
88+
for label in label_pairs {
89+
core.add_label(i, label.to_string())?;
90+
}
8991

9092
if line_pair.peek().is_some() {
9193
core.set(i, parse_instruction(line_pair));
@@ -372,10 +374,10 @@ mod tests {
372374
Instruction::new(Opcode::Jmp, Field::direct(-1), Field::immediate(0)),
373375
);
374376

375-
expected_core
376-
.add_labels(0, vec!["preload", "begin"])
377-
.unwrap();
378-
expected_core.add_labels(2, vec!["loop", "main"]).unwrap();
377+
expected_core.add_label(0, "preload".into()).unwrap();
378+
expected_core.add_label(0, "begin".into()).unwrap();
379+
expected_core.add_label(2, "loop".into()).unwrap();
380+
expected_core.add_label(2, "main".into()).unwrap();
379381

380382
let parsed = parse(simple_input).unwrap();
381383

0 commit comments

Comments
 (0)