1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pub use multimap::MultiMap;

pub fn custom_sections(bytes: &[u8]) -> Result<MultiMap<String, Vec<u8>>, String> {
    use wasmparser::Parser;
    use wasmparser::Payload;

    Parser::new(0)
        .parse_all(bytes)
        .filter_map(|payload| {
            let payload = match payload {
                Ok(payload) => payload,
                Err(e) => return Some(Err(e.to_string())),
            };
            match payload {
                Payload::CustomSection(reader) => {
                    let name = reader.name().to_string();
                    let data = reader.data().to_vec();
                    Some(Ok((name, data)))
                }
                _ => None,
            }
        })
        .collect()
}