///|
let data_uri_scheme = "data://"

///|
pub fn data_uri(relative_path : String) -> String {
  data_uri_scheme + relative_path
}

///|
pub fn data_uri_relative_path(uri : String) -> String? {
  if uri.has_prefix(data_uri_scheme) && uri.length() > data_uri_scheme.length() {
    Some(uri[data_uri_scheme.length():uri.length()].to_owned())
  } else {
    None
  }
}

///|
pub fn data_relative_path_is_safe(path : String) -> Bool {
  path != "" &&
  path != "." &&
  path != ".." &&
  !path.has_prefix("/") &&
  !path.has_suffix("/") &&
  !path.contains("\\") &&
  !path.contains("//") &&
  !path.contains("/../") &&
  !path.has_prefix("../") &&
  !path.has_suffix("/..") &&
  !path.contains("/./") &&
  !path.has_prefix("./") &&
  !path.has_suffix("/.")
}

///|
pub fn data_payload_uri_relative_path(uri : String) -> String? {
  match data_uri_relative_path(uri) {
    Some(path) if data_relative_path_is_safe(path) => Some(path)
    _ => None
  }
}

///|
pub fn data_payload_root(uri : String) -> String {
  match data_payload_uri_relative_path(uri) {
    Some(path) =>
      if path.has_prefix("payloads/") {
        "payloads"
      } else if path.has_prefix("artifacts/") {
        "artifacts"
      } else if path.has_prefix("exports/") {
        "exports"
      } else {
        "other"
      }
    None => "external"
  }
}