Documentation
use cmp_len_str::cmp_len_str;

use crate::trie::ExtTrie;

fn strip_prefix(prefix: impl AsRef<str>, url: &str) -> Option<&str> {
  let prefix = prefix.as_ref();
  if prefix.is_empty() {
    return Some(url);
  }
  if let Some(c) = url.strip_prefix(prefix) {
    if let Some(c) = c.strip_prefix('/') {
      return Some(c);
    } else if c.is_empty() {
      return Some("");
    } else if let Some(p) = c.rfind('.') {
      if p == 0 {
        return Some(c);
      }
    }
  }
  None
}

#[derive(Debug, Clone)]
pub struct PrefixLi(pub Vec<(String, ExtTrie)>);

impl PrefixLi {
  pub fn new(mut prefix_li: Vec<String>) -> Self {
    prefix_li.sort_by(cmp_len_str);

    Self(
      prefix_li
        .into_iter()
        .map(|p| (p, Default::default()))
        .collect(),
    )
  }

  pub fn add(&mut self, rel: impl Into<String>, ver: impl Into<String>) {
    let rel = rel.into();

    for i in &mut self.0 {
      if let Some(rel) = strip_prefix(&i.0, &rel) {
        i.1.add(rel, ver);
        break;
      }
    }
  }
}