Skip to content

Commit f4530f8

Browse files
Stranger6667blfpd
authored andcommitted
chore: Do not allocate a vector in parser::parse
1 parent 8cf069b commit f4530f8

3 files changed

Lines changed: 8 additions & 13 deletions

File tree

src/bin/parsereqs.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use globwalk::GlobError;
2-
use requirements::{self, Requirement};
2+
use requirements::{self, parse};
33
use std::{env, fs, path::Path};
44
use walkdir::DirEntry;
55

@@ -17,16 +17,14 @@ fn main() {
1717

1818
fn parse_requirements(path: &Path) {
1919
let content = fs::read_to_string(&path).expect("Cannot read file");
20-
let requirement_file: Vec<Requirement> = requirements::parse_str(&content).unwrap();
21-
22-
for requirement in requirement_file.into_iter() {
20+
for requirement in parse(&content).unwrap() {
2321
if let Some(name) = requirement.name {
2422
print!("{} ", name);
2523
}
2624
if let Some(comment) = requirement.comment {
2725
print!("({}) ", comment)
2826
}
29-
for (comparison, version) in requirement.specs.into_iter() {
27+
for (comparison, version) in &requirement.specs {
3028
print!("{}{} ", comparison, version);
3129
}
3230
println!();

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ mod parser;
2424
pub mod enums;
2525
mod requirements;
2626

27-
use parser::parse;
27+
pub use parser::parse;
2828
pub use crate::requirements::Requirement;
2929

3030
/// Parses requirements from a string
3131
pub fn parse_str(content: &str) -> Result<Vec<Requirement>, String> {
32-
parse(content)
32+
Ok(parse(content).map(Iterator::collect)?)
3333
}
3434

3535
// TODO: Add file loading code (recursive?) here.

src/parser/mod.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,18 +76,15 @@ fn parse_package(parsed: Pair<'_, Rule>) -> Requirement<'_> {
7676
package
7777
}
7878

79-
pub fn parse(unparsed_file: &str) -> Result<Vec<Requirement>, String> {
79+
pub fn parse(unparsed_file: &str) -> Result<impl Iterator<Item = Requirement>, String> {
8080
let req_file = match RequirementParser::parse(Rule::requirement_file, unparsed_file) {
8181
Ok(mut rules) => rules.next().unwrap(),
8282
Err(_) => return Err(String::from("Failed to parse requirements"))
8383
};
8484

85-
let requirements: Vec<Requirement> = req_file
85+
Ok(req_file
8686
.into_inner()
8787
.filter(|pair| pair.as_rule() == Rule::line)
88-
.map(parse_package)
89-
.collect();
90-
91-
Ok(requirements)
88+
.map(parse_package))
9289
}
9390

0 commit comments

Comments
 (0)