zksync_error/
identifier.rs

1//
2// AUTOGENERATED BASED ON A SET OF JSON FILES, DO NOT EDIT MANUALLY
3//
4use crate::error::domains::AnvilZksyncCode;
5use crate::error::domains::CompilerCode;
6use crate::error::domains::CoreCode;
7use crate::error::domains::FoundryCode;
8use crate::error::domains::HardhatCode;
9use crate::error::NamedError;
10use crate::kind::DomainCode;
11use crate::kind::Kind;
12#[derive(Clone, Debug, Eq, PartialEq, serde :: Deserialize, serde :: Serialize)]
13pub struct StructuredErrorCode {
14    pub domain_code: u32,
15    pub component_code: u32,
16    pub error_code: u32,
17}
18impl StructuredErrorCode {
19    pub fn encode(&self) -> u32 {
20        self.domain_code * 10000 + self.component_code * 1000 + self.error_code
21    }
22    pub fn decode(raw_code: u32) -> Self {
23        let error_code = raw_code % 1000;
24        let component_code = (raw_code / 1000) % 10;
25        let domain_code = (raw_code / 10000) % 10;
26        StructuredErrorCode {
27            domain_code,
28            component_code,
29            error_code,
30        }
31    }
32}
33#[derive(Clone, Debug, Eq, PartialEq, serde :: Deserialize, serde :: Serialize)]
34pub struct Identifier {
35    pub kind: Kind,
36    pub code: u32,
37}
38impl Identifier {
39    pub fn new(kind: Kind, code: u32) -> Self {
40        Self { kind, code }
41    }
42    pub fn encode(&self) -> u32 {
43        let domain_code: u32 = self.kind.domain_code();
44        let component_code: u32 = self.kind.component_code();
45        domain_code * 10000 + component_code * 1000 + self.code
46    }
47    pub fn decode(code: StructuredErrorCode) -> Option<Self> {
48        let StructuredErrorCode {
49            domain_code,
50            component_code,
51            error_code,
52        } = code;
53        let domain = DomainCode::from_repr(domain_code)?;
54        let kind: Kind = match domain {
55            DomainCode::AnvilZksync => {
56                Kind::AnvilZksync(AnvilZksyncCode::from_repr(component_code)?)
57            }
58            DomainCode::Compiler => Kind::Compiler(CompilerCode::from_repr(component_code)?),
59            DomainCode::Core => Kind::Core(CoreCode::from_repr(component_code)?),
60            DomainCode::Foundry => Kind::Foundry(FoundryCode::from_repr(component_code)?),
61            DomainCode::Hardhat => Kind::Hardhat(HardhatCode::from_repr(component_code)?),
62        };
63        Some(Identifier {
64            kind,
65            code: error_code,
66        })
67    }
68}
69pub trait Identifying {
70    fn get_identifier_repr(&self) -> String;
71}
72impl Identifying for Identifier {
73    fn get_identifier_repr(&self) -> String {
74        format!("[{}-{}]", self.kind.get_identifier_repr(), self.code)
75    }
76}
77impl Identifying for Kind {
78    fn get_identifier_repr(&self) -> String {
79        match self {
80            Kind::AnvilZksync(AnvilZksyncCode::AnvilEnvironment) => "anvil_zksync-env",
81            Kind::AnvilZksync(AnvilZksyncCode::AnvilGeneric) => "anvil_zksync-gen",
82            Kind::AnvilZksync(AnvilZksyncCode::AnvilNode) => "anvil_zksync-node",
83            Kind::AnvilZksync(AnvilZksyncCode::GasEstimation) => "anvil_zksync-gas_estim",
84            Kind::AnvilZksync(AnvilZksyncCode::Halt) => "anvil_zksync-halt",
85            Kind::AnvilZksync(AnvilZksyncCode::Revert) => "anvil_zksync-revert",
86            Kind::AnvilZksync(AnvilZksyncCode::StateLoader) => "anvil_zksync-state",
87            Kind::AnvilZksync(AnvilZksyncCode::TransactionValidation) => "anvil_zksync-tx_invalid",
88            Kind::Compiler(CompilerCode::LLVM_EVM) => "compiler-llvm+evm",
89            Kind::Compiler(CompilerCode::LLVM_Era) => "compiler-llvm+era",
90            Kind::Compiler(CompilerCode::Solc) => "compiler-solc",
91            Kind::Compiler(CompilerCode::SolcFork) => "compiler-solc+fork",
92            Kind::Compiler(CompilerCode::Zksolc) => "compiler-zksolc",
93            Kind::Compiler(CompilerCode::Zkvyper) => "compiler-zkvyper",
94            Kind::Core(CoreCode::API) => "core-api",
95            Kind::Core(CoreCode::EraVM) => "core-eravm",
96            Kind::Core(CoreCode::ExecutionPlatform) => "core-exec",
97            Kind::Core(CoreCode::Sequencer) => "core-seq",
98            Kind::Foundry(FoundryCode::FoundryUpstream) => "foundry-upstream",
99            Kind::Foundry(FoundryCode::FoundryZksync) => "foundry-zksync",
100            Kind::Hardhat(HardhatCode::HardhatUpstream) => "hardhat-upstream",
101            Kind::Hardhat(HardhatCode::HardhatZksync) => "hardhat-zksync",
102        }
103        .into()
104    }
105}
106impl NamedError for Identifier {
107    fn get_error_name(&self) -> String {
108        match self.kind {
109            Kind::AnvilZksync(AnvilZksyncCode::AnvilEnvironment) => {
110                crate::error::definitions::AnvilEnvironmentCode::from_repr(self.code)
111                    .expect("Internal error")
112                    .get_error_name()
113            }
114            Kind::AnvilZksync(AnvilZksyncCode::AnvilGeneric) => {
115                crate::error::definitions::AnvilGenericCode::from_repr(self.code)
116                    .expect("Internal error")
117                    .get_error_name()
118            }
119            Kind::AnvilZksync(AnvilZksyncCode::AnvilNode) => {
120                crate::error::definitions::AnvilNodeCode::from_repr(self.code)
121                    .expect("Internal error")
122                    .get_error_name()
123            }
124            Kind::AnvilZksync(AnvilZksyncCode::GasEstimation) => {
125                crate::error::definitions::GasEstimationCode::from_repr(self.code)
126                    .expect("Internal error")
127                    .get_error_name()
128            }
129            Kind::AnvilZksync(AnvilZksyncCode::Halt) => {
130                crate::error::definitions::HaltCode::from_repr(self.code)
131                    .expect("Internal error")
132                    .get_error_name()
133            }
134            Kind::AnvilZksync(AnvilZksyncCode::Revert) => {
135                crate::error::definitions::RevertCode::from_repr(self.code)
136                    .expect("Internal error")
137                    .get_error_name()
138            }
139            Kind::AnvilZksync(AnvilZksyncCode::StateLoader) => {
140                crate::error::definitions::StateLoaderCode::from_repr(self.code)
141                    .expect("Internal error")
142                    .get_error_name()
143            }
144            Kind::AnvilZksync(AnvilZksyncCode::TransactionValidation) => {
145                crate::error::definitions::TransactionValidationCode::from_repr(self.code)
146                    .expect("Internal error")
147                    .get_error_name()
148            }
149            Kind::Compiler(CompilerCode::LLVM_EVM) => {
150                crate::error::definitions::LLVM_EVMCode::from_repr(self.code)
151                    .expect("Internal error")
152                    .get_error_name()
153            }
154            Kind::Compiler(CompilerCode::LLVM_Era) => {
155                crate::error::definitions::LLVM_EraCode::from_repr(self.code)
156                    .expect("Internal error")
157                    .get_error_name()
158            }
159            Kind::Compiler(CompilerCode::Solc) => {
160                crate::error::definitions::SolcCode::from_repr(self.code)
161                    .expect("Internal error")
162                    .get_error_name()
163            }
164            Kind::Compiler(CompilerCode::SolcFork) => {
165                crate::error::definitions::SolcForkCode::from_repr(self.code)
166                    .expect("Internal error")
167                    .get_error_name()
168            }
169            Kind::Compiler(CompilerCode::Zksolc) => {
170                crate::error::definitions::ZksolcCode::from_repr(self.code)
171                    .expect("Internal error")
172                    .get_error_name()
173            }
174            Kind::Compiler(CompilerCode::Zkvyper) => {
175                crate::error::definitions::ZkvyperCode::from_repr(self.code)
176                    .expect("Internal error")
177                    .get_error_name()
178            }
179            Kind::Core(CoreCode::API) => crate::error::definitions::APICode::from_repr(self.code)
180                .expect("Internal error")
181                .get_error_name(),
182            Kind::Core(CoreCode::EraVM) => {
183                crate::error::definitions::EraVMCode::from_repr(self.code)
184                    .expect("Internal error")
185                    .get_error_name()
186            }
187            Kind::Core(CoreCode::ExecutionPlatform) => {
188                crate::error::definitions::ExecutionPlatformCode::from_repr(self.code)
189                    .expect("Internal error")
190                    .get_error_name()
191            }
192            Kind::Core(CoreCode::Sequencer) => {
193                crate::error::definitions::SequencerCode::from_repr(self.code)
194                    .expect("Internal error")
195                    .get_error_name()
196            }
197            Kind::Foundry(FoundryCode::FoundryUpstream) => {
198                crate::error::definitions::FoundryUpstreamCode::from_repr(self.code)
199                    .expect("Internal error")
200                    .get_error_name()
201            }
202            Kind::Foundry(FoundryCode::FoundryZksync) => {
203                crate::error::definitions::FoundryZksyncCode::from_repr(self.code)
204                    .expect("Internal error")
205                    .get_error_name()
206            }
207            Kind::Hardhat(HardhatCode::HardhatUpstream) => {
208                crate::error::definitions::HardhatUpstreamCode::from_repr(self.code)
209                    .expect("Internal error")
210                    .get_error_name()
211            }
212            Kind::Hardhat(HardhatCode::HardhatZksync) => {
213                crate::error::definitions::HardhatZksyncCode::from_repr(self.code)
214                    .expect("Internal error")
215                    .get_error_name()
216            }
217        }
218    }
219}
220impl crate::documentation::Documented for Identifier {
221    type Documentation = &'static zksync_error_description::ErrorDocumentation;
222    fn get_documentation(
223        &self,
224    ) -> Result<Option<Self::Documentation>, crate::documentation::DocumentationError> {
225        use crate::documentation::model;
226        let repr = &self.get_identifier_repr();
227        match model.errors.get(repr) {
228            Some(metadata) => Ok(metadata.documentation.as_ref()),
229            None => Err(crate::documentation::DocumentationError::IncompleteModel(
230                format!("Can not fetch description for error {repr}."),
231            )),
232        }
233    }
234}