pub fn hashable_task_env(
        &self,
        computed_wildcards: &[String],
        task_env: &[String],
    ) -> Result<DetailedMap, Error> {
        let mut explicit_env_var_map = EnvironmentVariableMap::default();
        let mut all_env_var_map = EnvironmentVariableMap::default();
        let mut matching_env_var_map = EnvironmentVariableMap::default();
        let inference_env_var_map = self.from_wildcards(computed_wildcards)?;

        let user_env_var_set = self.wildcard_map_from_wildcards_unresolved(task_env)?;

        all_env_var_map.union(&user_env_var_set.inclusions);
        all_env_var_map.union(&inference_env_var_map);
        all_env_var_map.difference(&user_env_var_set.exclusions);

        explicit_env_var_map.union(&user_env_var_set.inclusions);
        explicit_env_var_map.difference(&user_env_var_set.exclusions);

        matching_env_var_map.union(&inference_env_var_map);
        matching_env_var_map.difference(&user_env_var_set.exclusions);

        Ok(DetailedMap {
            all: all_env_var_map,
            by_source: BySource {
                explicit: explicit_env_var_map,
                matching: matching_env_var_map,
            },
        })
    }
Return a detailed map for which environment variables are factored into
the task's hash
crates/turborepo-env/src/lib.rs