multiversx_sc_meta_lib/
report_info_json.rs

1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::{code_report_json::CodeReportJson, ei_check_json::EiCheckJson, tools::WasmReport};
6
7#[derive(Serialize, Deserialize)]
8#[serde(rename_all = "camelCase")]
9pub struct ReportInfoJson {
10    #[serde(default)]
11    #[serde(skip_serializing_if = "Vec::is_empty")]
12    pub imports: Vec<String>,
13
14    #[serde(default)]
15    pub is_mem_grow: bool,
16
17    #[serde(default)]
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub ei_check: Option<EiCheckJson>,
20
21    #[serde(default)]
22    #[serde(skip_serializing_if = "HashMap::is_empty")]
23    pub forbidden_opcodes: HashMap<String, Vec<String>>,
24
25    #[serde(default)]
26    pub code_report: CodeReportJson,
27}
28
29impl ReportInfoJson {
30    pub fn new(report: &WasmReport, ei_check_info: Option<EiCheckJson>, size: usize) -> Self {
31        let ei_check = if report.imports.is_empty() {
32            None
33        } else {
34            ei_check_info
35        };
36
37        ReportInfoJson {
38            imports: report.imports.iter().map(|i| i.to_string()).collect(),
39            is_mem_grow: report.memory_grow_flag,
40            ei_check,
41            forbidden_opcodes: report
42                .forbidden_opcodes
43                .iter()
44                .map(|(k, v)| (k.to_string(), v.iter().map(|s| s.to_string()).collect()))
45                .collect(),
46            code_report: CodeReportJson::new(&report.code, size),
47        }
48    }
49}