neo_solidity/cli/cli_parts/
cli_diagnostics.rs

1fn emit_warning(message: &str, contract: Option<&str>, json: bool, code: Option<&str>) {
2    emit_warning_with_suggestion(message, contract, json, code, None);
3}
4
5fn emit_warning_with_suggestion(
6    message: &str,
7    contract: Option<&str>,
8    json: bool,
9    code: Option<&str>,
10    suggestion: Option<&str>,
11) {
12    use std::io::{self, Write};
13
14    if json {
15        let warning = json!({
16            "component": "neo-solidity",
17            "severity": "warning",
18            "type": "CompilerWarning",
19            "code": code.unwrap_or("COMPILER_WARNING"),
20            "contract": contract,
21            "message": message,
22            "formattedMessage": message,
23            "suggestion": suggestion,
24        });
25        let mut stderr = io::stderr().lock();
26        let _ = stderr.write_all(warning.to_string().as_bytes());
27        let _ = stderr.write_all(b"\n");
28        return;
29    }
30
31    let code_tag = code.map(|c| format!("[{c}]")).unwrap_or_default();
32    let line = if let Some(contract) = contract {
33        format!("warning{code_tag} ({contract}): {message}\n")
34    } else {
35        format!("warning{code_tag}: {message}\n")
36    };
37
38    let mut stderr = io::stderr().lock();
39    let _ = stderr.write_all(line.as_bytes());
40    if let Some(hint) = suggestion {
41        let _ = stderr.write_all(format!("  help: {hint}\n").as_bytes());
42    }
43}
44
45fn emit_error(message: &str, code: &str, json: bool) {
46    use std::io::{self, Write};
47
48    if json {
49        let error = json!({
50            "component": "neo-solidity",
51            "severity": "error",
52            "type": "CompilerError",
53            "code": code,
54            "message": message,
55            "formattedMessage": message,
56        });
57        let mut stderr = io::stderr().lock();
58        let _ = stderr.write_all(error.to_string().as_bytes());
59        let _ = stderr.write_all(b"\n");
60    } else {
61        let mut stderr = io::stderr().lock();
62        let _ = stderr.write_all(format!("error: {message}\n").as_bytes());
63    }
64}