Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extern crate regex; // 1.0.2
- use regex::{Match, Regex};
- #[derive(Debug)]
- struct Candidate<'a> {
- text: &'a str,
- mat: Option<Match<'a>>,
- score: usize,
- }
- fn score<'a>(re: &Regex, text: &'a str) -> Candidate<'a> {
- match re.find(text) {
- Some(m) => Candidate {
- text,
- mat: Some(m),
- score: text.len() - m.start() + m.end(),
- },
- None => Candidate {
- text,
- mat: None,
- score: 0,
- },
- }
- }
- struct Search<'a> {
- terms: &'a str,
- re: Regex,
- candidates: Vec<Candidate<'a>>,
- }
- impl<'a> Search<'a> {
- fn new(terms: &'a str) -> Search {
- let raw_re = format!("(?i){}", terms);
- let re = Regex::new(&raw_re).unwrap();
- Search {
- terms,
- re,
- candidates: Vec::new(),
- }
- }
- fn search(&mut self, items: &[&'a str]) -> usize {
- self.candidates.clear();
- for item in items {
- self.candidates.push(score(&self.re, item));
- }
- self.candidates.len()
- }
- }
- fn print_score(candidate: &Candidate) {
- println!("{:2} {}", candidate.score, candidate.text);
- }
- fn main() {
- let items_path = vec![
- "/project/serializer/place.py",
- "/project/serializer/core/place.py",
- "/project/serializer/core/lace.py",
- "/project/serializers/Place.py",
- ];
- let items_symbols = [
- "serializer.PlaceSerializer",
- "serializer.ThingSerializer",
- ];
- let search_string = "serializer place";
- let re = Regex::new("(?i)(serializer).*(place)").unwrap();
- println!("{}", search_string);
- println!();
- print_score(&score(&re, "/project/serializer/place.py"));
- print_score(&score(&re, "/project/serializer/core/place.py"));
- print_score(&score(&re, "/project/serializer/core/lace.py"));
- print_score(&score(&re, "/project/serializers/Place.py"));
- println!();
- print_score(&score(&re, "serializer.PlaceSerializer"));
- print_score(&score(&re, "serializer.ThingSerializer"));
- println!();
- let search = Search::new(search_string);
- }
Add Comment
Please, Sign In to add comment