///|
fn config_base_dir(path : String) -> String {
  let raw_dirname = dirname_string(path)
  let config_dir : @mbpath.Path = raw_dirname
  config_dir.resolve().to_string()
}

///|
fn rebase_project_path(path : String, base_dir : String) -> String {
  let candidate : @mbpath.Path = path
  if candidate.is_absolute() {
    path
  } else {
    let base : @mbpath.Path = base_dir
    base.join(path).normalize().to_string()
  }
}

///|
fn join_path_string(base : String, child : String) -> String {
  let base_path : @mbpath.Path = base
  base_path.join(child).normalize().to_string()
}

///|
fn dirname_string(path : String) -> String {
  let mut separator_index : Int? = None
  for i, ch in path {
    if ch == '/' || ch == '\\' {
      separator_index = Some(i)
    }
  }
  match separator_index {
    None => "."
    Some(separator_index) => prefix_string(path, separator_index)
  }
}

///|
fn prefix_string(path : String, end_exclusive : Int) -> String {
  let builder = StringBuilder::new(size_hint=end_exclusive)
  for i, ch in path {
    if i >= end_exclusive {
      break
    }
    builder.write_char(ch)
  }
  builder.to_string()
}

///|
fn normalize_keyword(raw : String) -> String {
  raw.trim().to_owned().to_lower()
}