Search code examples
loopsstructrustserde

Iterate over struct in rust


I am completely new to Rust coming from JS/TS

I have already seen other questions like: How do I iterate over elements of a struct in Rust? but they didn't get me to a real answer.

I am trying to iterate over the keys and values of a struct in rust

In JS/TS this would work like this:

const o = {
    a: "hello",
    b: "world"
};

const keys = Object.keys(o);
const values = Object.values(o);

// now loop over them 

How would something like this work in Rust?

I am using Serde to parse a config yaml file to a struct.


#[derive(Deserialize, Debug, Clone)]
pub struct Config {
    pub headers: Headers,
}

#[derive(Deserialize, Debug, Clone)]
pub struct Headers {
    #[serde(rename = "Content-Security-Policy")]
    pub content_security_policy: String,
    #[serde(rename = "x-frame-options")]
    pub x_frame_options: String,
    #[serde(rename = "x-content-type-options")]
    pub x_content_type_options: String,
    #[serde(rename = "x-permitted-cross-domain-policies")]
    pub x_permitted_cross_domain_policies: String,
    #[serde(rename = "x-download-options")]
    pub x_download_options: String,
    #[serde(rename = "x-xss-protection")]
    pub x_xss_protection: String,
    #[serde(rename = "referrer-policy")]
    pub referrer_policy: String,
    #[serde(rename = "Strict-Transport-Security")]
    pub strict_transport_security: String,
    #[serde(rename = "feature-policy")]
    pub feature_policy: String,
    #[serde(rename = "Cache-Control")]
    pub cache_control: String,
}

But this does not implement the .iter() function and i haven't found a solution searching for this.


Solution

  • Thanks to Caesar

    I tried this:

    
    use serde::{Deserialize, Serialize};
    
    #[derive(Deserialize, Debug, Clone, Serialize)]
    pub struct Config {
        pub headers: Headers,
    }
    
    #[derive(Deserialize, Debug, Clone, Serialize)]
    pub struct Headers {
        #[serde(rename = "Content-Security-Policy")]
        pub content_security_policy: String,
        #[serde(rename = "x-frame-options")]
        pub x_frame_options: String,
        #[serde(rename = "x-content-type-options")]
        pub x_content_type_options: String,
        #[serde(rename = "x-permitted-cross-domain-policies")]
        pub x_permitted_cross_domain_policies: String,
        #[serde(rename = "x-download-options")]
        pub x_download_options: String,
        #[serde(rename = "x-xss-protection")]
        pub x_xss_protection: String,
        #[serde(rename = "referrer-policy")]
        pub referrer_policy: String,
        #[serde(rename = "Strict-Transport-Security")]
        pub strict_transport_security: String,
        #[serde(rename = "feature-policy")]
        pub feature_policy: String,
        #[serde(rename = "Cache-Control")]
        pub cache_control: String,
    }
    
    let iterable_headers: HashMap<String, String> =
     serde_yaml::from_value(serde_yaml::to_value(&config.headers).unwrap()).unwrap();
    
    for header in &iterable_headers {
        res = res.header(header.0, header.1);
    }