harn-vm 0.7.10

Async bytecode virtual machine for the Harn programming language
Documentation
/** metadata_namespace. */
pub fn metadata_namespace(dir, namespace) {
  return metadata_resolve(dir, namespace) ?? {}
}

/** metadata_local_namespace. */
pub fn metadata_local_namespace(dir, namespace) {
  let normalized = if dir == "" { "." } else { dir }
  for entry in metadata_entries(namespace) {
    if entry.dir == normalized {
      return entry.local ?? {}
    }
  }
  return {}
}

/** project_inventory. */
pub fn project_inventory(namespace) {
  return {
    entries: metadata_entries(namespace),
    status: metadata_status(namespace),
  }
}

/** project_root_package. */
pub fn project_root_package() -> string {
  var root_package = ""
  let root_enrichment = metadata_get("", "enrichment")
  if root_enrichment?.rootPackageName {
    root_package = root_enrichment?.rootPackageName
  }
  if !root_package {
    let src_enrichment = metadata_get("src", "enrichment")
    if src_enrichment?.rootPackageName {
      root_package = src_enrichment?.rootPackageName
    }
  }
  if !root_package {
    let project_root = project_root() ?? ""
    let pyproject = read_file(project_root + "/pyproject.toml")
    if pyproject {
      for line in pyproject.split("\n") {
        let trimmed = line.trim()
        if trimmed.starts_with("name") && trimmed.contains("=") {
          let quoted = trimmed.split("\"")
          if quoted?.count ?? 0 >= 2 {
            root_package = quoted[1]
            break
          }
          let single_quoted = trimmed.split("'")
          if single_quoted?.count ?? 0 >= 2 {
            root_package = single_quoted[1]
            break
          }
        }
      }
    }
  }
  if !root_package {
    let project_root = project_root() ?? ""
    let package_json = read_file(project_root + "/package.json")
    if package_json {
      for line in package_json.split("\n") {
        let trimmed = line.trim()
        if trimmed.starts_with("\"name\"") {
          let parts = trimmed.split("\"")
          if parts?.count ?? 0 >= 4 {
            root_package = parts[3]
            break
          }
        }
      }
    }
  }
  if !root_package {
    let project_root = project_root() ?? ""
    let go_mod = read_file(project_root + "/go.mod")
    if go_mod {
      for line in go_mod.split("\n") {
        let trimmed = line.trim()
        if trimmed.starts_with("module ") {
          let module_path = trimmed.replace("module ", "")
          let parts = module_path.split("/")
          if parts?.count ?? 0 > 0 {
            root_package = parts[parts?.count ?? 0 - 1]
            break
          }
        }
      }
    }
  }
  if !root_package {
    let project_root = project_root() ?? ""
    let cargo_toml = read_file(project_root + "/Cargo.toml")
    if cargo_toml {
      for line in cargo_toml.split("\n") {
        let trimmed = line.trim()
        if trimmed.starts_with("name") && trimmed.contains("=") {
          let parts = trimmed.split("\"")
          if parts?.count ?? 0 >= 2 {
            root_package = parts[1]
            break
          }
        }
      }
    }
  }
  return root_package
}

/** project_scan. */
pub fn project_scan(path, options) {
  return scan_directory(path, options)
}

/** project_scan_paths. */
pub fn project_scan_paths(path, options) {
  var paths = []
  for entry in project_scan(path, options) {
    paths = paths + [entry.path]
  }
  return paths
}

/** project_stale. */
pub fn project_stale(namespace) {
  return metadata_status(namespace).stale
}

/** project_stale_dirs. */
pub fn project_stale_dirs(namespace) {
  let stale = project_stale(namespace)
  var dirs = []
  for dir in stale.tier1 {
    dirs = dirs + [dir]
  }
  for dir in stale.tier2 {
    dirs = dirs + [dir]
  }
  return dirs
}

/** project_requires_refresh. */
pub fn project_requires_refresh(namespace) {
  let status = metadata_status(namespace)
  if status.stale.any_stale {
    return true
  }
  for _dir in status.missing_structure_hash {
    return true
  }
  for _dir in status.missing_content_hash {
    return true
  }
  return false
}