Dolphin
Dolphin

Reputation: 38773

Is it possible to change the Vec entity property?

I have a basic Rust Vec object named MenuResponse. The code looks like this:

#[get("/v1/role/menu")]
pub fn get_role_menu_tree() -> content::Json<String> {
    let menu_responses:Vec<MenuResponse> = menu_query_full_tree::<Vec<MenuResource>>(&request);
    let menu_vec:Vec<DynamicMenuResponse> = admin_user_menus(login_user_info);
    for mut menu_res in menu_responses {
        let ids:Vec<i32> = menu_vec.iter()
            .map(|item| item.id)
            .collect();
        if ids.contains(&menu_res.id){
            menu_res.checked = true;
        }
    }
    return box_rest_response(menu_responses);
}

The MenuResponse is defined like this:

#[derive(Deserialize, Serialize)]
#[allow(non_snake_case)]
pub struct MenuResponse {
    pub id: i32,
    pub name: String,
    pub res_type: i32,
    pub created_time: i64,
    pub updated_time: i64,
    pub remark: Option<String>,
    pub path: Option<String>,
    pub parent_id: i32,
    pub sort: i32,
    pub checked: bool,
    pub children: Vec<MenuResponse>
}

I want to change each element in the Vec<MenuResponse>'s property, in Java. In Java we can just set the value for each element. What should I do for an equivalent behavior in Rust? It seems I have to new Vec and put an element with the new value for each element? What should I do to change the menu_responses:Vec element property without creating a new Vec?

Upvotes: 0

Views: 93

Answers (1)

Netwave
Netwave

Reputation: 42716

You could use iter_mut to get &mut T of the Vec<T> elements:

#[get("/v1/role/menu")]
pub fn get_role_menu_tree() -> content::Json<String> {
    let mut menu_responses:Vec<MenuResponse> = menu_query_full_tree::<Vec<MenuResource>>(&request);
    let menu_vec:Vec<DynamicMenuResponse> = admin_user_menus(login_user_info);
    let ids:Vec<i32> = menu_vec.iter()
        .map(|item| item.id)
        .collect();
    for menu_res in menu_responses.iter_mut() {
        if ids.contains(&menu_res.id){
            menu_res.checked = true;
        }
    }
    return box_rest_response(menu_responses);
}

Playground example

Upvotes: 1

Related Questions