use crate::state::{DealerState, parse_xtazy_parts, rust_backend_id_for_version};
pub(crate) fn has_complete_toolchain(state: &DealerState, version: &str) -> bool {
let tdir = state.toolchain_dir(version);
let parts_file = tdir.join(crate::constants::files::XTAZY_PARTS);
if !parts_file.is_file() {
let content = match fs::read_to_string(&parts_file) {
let parsed = match parse_xtazy_parts(&content) {
.join(crate::constants::dirs::PIKO_COMPONENT_DIR)
.join(&parsed.piko_version)
crate::constants::executables::EXE_PIKO,
std::env::consts::EXE_SUFFIX
.join(crate::constants::dirs::RUSTTIME_DIR)
.join(&parsed.rusttime_version);
.join(crate::constants::dirs::STD_DIR)
.join(&parsed.std_version);
let backend_id = rust_backend_id_for_version(&parsed.rust_version);
let rust_dir = state.rust_backend_dir(&backend_id);
let cargo_exe = rust_dir.join(crate::constants::dirs::BIN_DIR).join(format!(
crate::constants::executables::EXE_CARGO,
std::env::consts::EXE_SUFFIX
let rustc_exe = rust_dir.join(crate::constants::dirs::BIN_DIR).join(format!(
crate::constants::executables::EXE_RUSTC,
std::env::consts::EXE_SUFFIX
&& rust_dir.join("lib").join("rustlib").is_dir()