You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: ty.rs
    path of file: ./repos/diem/language/move-prover/interpreter/src/concrete
    
    the code of the file until where you have to start completion: // Copyright (c) The Diem Core Contributors
// SPDX-License-Identifier: Apache-2.0

//! The type system in move-model is a fat type system that is designed to cover all cases that can
//! possibly appear in the whole bytecode transformation pipeline. Natually, this means that some
//! types are no longer applicable when the Move program reaches the end of the transformation.
//!
//! The type system for the interpreter is a strict subset of what is offered in the move-model.
//! In oth
    
pub fn convert_model_base_type(env: &GlobalEnv, ty: &MT::Type, subst: &[BaseType]) -> BaseType {
    match ty {
        MT::Type::Primitive(MT::PrimitiveType::Bool) => BaseType::mk_bool(),
        MT::Type::Primitive(MT::PrimitiveType::U8) => BaseType::mk_u8(),
        MT::Type::Primitive(MT::PrimitiveType::U64) => BaseType::mk_u64(),
        MT::Type::Primitive(MT::PrimitiveType::U128) => BaseType::mk_u128(),
        MT::Type::Primitive(MT::PrimitiveType::Num) => BaseType::mk_num(),
        MT::Type::Primitive(MT::PrimitiveType::Address) => BaseType::mk_address(),
        MT::Type::Primitive(MT::PrimitiveType::Signer) => BaseType::mk_signer(),
        MT::Type::Vector(elem) => BaseType::mk_vector(convert_model_base_type(env, elem, subst)),
        MT::Type::Struct(module_id, struct_id, ty_insts) => BaseType::mk_struct(
            convert_model_struct_type(env, *module_id, *struct_id, ty_insts, subst),
        ),
        MT::Type::TypeParameter(index) => subst.get(*index as usize).unwrap().clone(),
        _ => unreachable!(),
    }
}