1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
// Copyright (C) 2019-2024 Aleo Systems Inc.
// This file is part of the Leo library.

// The Leo library is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// The Leo library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.

use crate::create_messages;
use std::{
    error::Error as ErrorArg,
    fmt::{Debug, Display},
};

create_messages!(
    /// AstError enum that represents all the errors for the `leo-ast` crate.
    AstError,
    code_mask: 2000i32,
    code_prefix: "AST",

    /// For when the AST fails to be represented as a JSON string.
    @backtraced
    failed_to_convert_ast_to_json_string {
        args: (error: impl ErrorArg),
        msg: format!("failed to convert ast to a json string {error}"),
        help: None,
    }

    /// For when the AST fails to create the AST JSON file.
    @backtraced
    failed_to_create_ast_json_file {
        args: (path: impl Debug, error: impl ErrorArg),
        msg: format!("failed to create ast json file `{path:?}` {error}"),
        help: None,
    }

    /// For when the AST fails to write the AST JSON file.
    @backtraced
    failed_to_write_ast_to_json_file {
        args: (path: impl Debug, error: impl ErrorArg),
        msg: format!("failed to write ast to a json file `{path:?}` {error}"),
        help: None,
    }

    /// For when the a JSON string fails to be represented as an AST.
    @backtraced
    failed_to_read_json_string_to_ast {
        args: (error: impl ErrorArg),
        msg: format!("failed to convert json string to an ast {error}"),
        help: None,
    }

    /// For when the a JSON files fails to be represented as an AST.
    @backtraced
    failed_to_read_json_file {
        args: (path: impl Debug, error: impl ErrorArg),
        msg: format!("failed to convert json file `{path:?}` to an ast {error}"),
        help: None,
    }

    /// For when the AST fails to be represented as a JSON value.
    @backtraced
    failed_to_convert_ast_to_json_value {
        args: (error: impl ErrorArg),
        msg: format!("failed to convert ast to a json value {error}"),
        help: None,
    }

    /// For when a user shadows a function.
    @formatted
    shadowed_function {
        args: (func: impl Display),
        msg: format!("function `{func}` shadowed by"),
        help: None,
    }

    /// For when a user shadows a struct.
    @formatted
    shadowed_struct {
        args: (struct_: impl Display),
        msg: format!("struct `{struct_}` shadowed by"),
        help: None,
    }

    /// For when a user shadows a record.
    @formatted
    shadowed_record {
        args: (record: impl Display),
        msg: format!("record `{record}` shadowed by"),
        help: None,
    }

    /// For when a user shadows a variable.
    @formatted
    shadowed_variable {
        args: (var: impl Display),
        msg: format!("variable `{var}` shadowed by"),
        help: None,
    }

    /// For when the symbol table fails to be represented as a JSON string.
    @backtraced
    failed_to_convert_symbol_table_to_json_string {
        args: (error: impl ErrorArg),
        msg: format!("failed to convert symbol_table to a json string {error}"),
        help: None,
    }

    /// For when the symbol table fails to create the symbol table JSON file.
    @backtraced
    failed_to_create_symbol_table_json_file {
        args: (path: impl Debug, error: impl ErrorArg),
        msg: format!("failed to create symbol_table json file `{path:?}` {error}"),
        help: None,
    }

    /// For when the symbol table fails to write the symbol table JSON file.
    @backtraced
    failed_to_write_symbol_table_to_json_file {
        args: (path: impl Debug, error: impl ErrorArg),
        msg: format!("failed to write symbol_table to a json file `{path:?}` {error}"),
        help: None,
    }

    /// For when the a JSON string fails to be represented as an symbol table.
    @backtraced
    failed_to_read_json_string_to_symbol_table {
        args: (error: impl ErrorArg),
        msg: format!("failed to convert json string to an symbol_table {error}"),
        help: None,
    }

    /// For when the symbol table fails to be represented as a JSON value.
    @backtraced
    failed_to_convert_symbol_table_to_json_value {
        args: (error: impl ErrorArg),
        msg: format!("failed to convert symbol_table to a json value {error}"),
        help: None,
    }

    @formatted
    redefining_external_struct {
        args: (struct_: impl Display),
        msg: format!("There are two definitions of struct `{struct_}` that do not match."),
        help: Some("Check the import files to see if there are any struct definitions of the same name.".to_string()),
    }

    @backtraced
    function_not_found {
        args: (func: impl Display),
        msg: format!("function `{func}` not found"),
        help: None,
    }
);