///|
fn cache_dir(project : Project) -> String {
  join_path(project.root, ".moonforge")
}

///|
fn cache_path(project : Project) -> String {
  join_path(cache_dir(project), "cache.json")
}

///|
pub fn load_cache(project : Project) -> CacheSnapshot raise MoonforgeError {
  let path = cache_path(project)
  if !@fs.path_exists(path) {
    empty_cache()
  } else {
    let text = @fs.read_file_to_string(path) catch {
      @fs.IOError(message) =>
        cache_error("failed to read cache '\{path}': \{message}")
    }
    let value = @json.parse(text) catch {
      err =>
        cache_error("failed to parse cache '\{path}': \{@debug.to_string(err)}")
    }
    @json.from_json(value) catch {
      err =>
        cache_error(
          "failed to decode cache '\{path}': \{@debug.to_string(err)}",
        )
    }
  }
}

///|
pub fn save_cache(
  project : Project,
  snapshot : CacheSnapshot,
) -> Unit raise MoonforgeError {
  let path = cache_path(project)
  let text = snapshot.to_json().stringify(indent=2)
  write_text_file(path, text)
}