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::Halt) => "anvil_zksync-halt",
84            Kind::AnvilZksync(AnvilZksyncCode::Revert) => "anvil_zksync-revert",
85            Kind::AnvilZksync(AnvilZksyncCode::StateLoader) => "anvil_zksync-state",
86            Kind::AnvilZksync(AnvilZksyncCode::TransactionValidation) => "anvil_zksync-tx_invalid",
87            Kind::Compiler(CompilerCode::LLVM_EVM) => "compiler-llvm+evm",
88            Kind::Compiler(CompilerCode::LLVM_Era) => "compiler-llvm+era",
89            Kind::Compiler(CompilerCode::Solc) => "compiler-solc",
90            Kind::Compiler(CompilerCode::SolcFork) => "compiler-solc+fork",
91            Kind::Compiler(CompilerCode::Zksolc) => "compiler-zksolc",
92            Kind::Compiler(CompilerCode::Zkvyper) => "compiler-zkvyper",
93            Kind::Core(CoreCode::API) => "core-api",
94            Kind::Core(CoreCode::EraVM) => "core-eravm",
95            Kind::Core(CoreCode::ExecutionPlatform) => "core-exec",
96            Kind::Core(CoreCode::Sequencer) => "core-seq",
97            Kind::Foundry(FoundryCode::FoundryUpstream) => "foundry-upstream",
98            Kind::Foundry(FoundryCode::FoundryZksync) => "foundry-zksync",
99            Kind::Hardhat(HardhatCode::HardhatUpstream) => "hardhat-upstream",
100            Kind::Hardhat(HardhatCode::HardhatZksync) => "hardhat-zksync",
101        }
102        .into()
103    }
104}
105impl NamedError for Identifier {
106    fn get_error_name(&self) -> String {
107        match self.kind {
108            Kind::AnvilZksync(AnvilZksyncCode::AnvilEnvironment) => {
109                crate::error::definitions::AnvilEnvironmentCode::from_repr(self.code)
110                    .expect("Internal error")
111                    .get_error_name()
112            }
113            Kind::AnvilZksync(AnvilZksyncCode::AnvilGeneric) => {
114                crate::error::definitions::AnvilGenericCode::from_repr(self.code)
115                    .expect("Internal error")
116                    .get_error_name()
117            }
118            Kind::AnvilZksync(AnvilZksyncCode::AnvilNode) => {
119                crate::error::definitions::AnvilNodeCode::from_repr(self.code)
120                    .expect("Internal error")
121                    .get_error_name()
122            }
123            Kind::AnvilZksync(AnvilZksyncCode::Halt) => {
124                crate::error::definitions::HaltCode::from_repr(self.code)
125                    .expect("Internal error")
126                    .get_error_name()
127            }
128            Kind::AnvilZksync(AnvilZksyncCode::Revert) => {
129                crate::error::definitions::RevertCode::from_repr(self.code)
130                    .expect("Internal error")
131                    .get_error_name()
132            }
133            Kind::AnvilZksync(AnvilZksyncCode::StateLoader) => {
134                crate::error::definitions::StateLoaderCode::from_repr(self.code)
135                    .expect("Internal error")
136                    .get_error_name()
137            }
138            Kind::AnvilZksync(AnvilZksyncCode::TransactionValidation) => {
139                crate::error::definitions::TransactionValidationCode::from_repr(self.code)
140                    .expect("Internal error")
141                    .get_error_name()
142            }
143            Kind::Compiler(CompilerCode::LLVM_EVM) => {
144                crate::error::definitions::LLVM_EVMCode::from_repr(self.code)
145                    .expect("Internal error")
146                    .get_error_name()
147            }
148            Kind::Compiler(CompilerCode::LLVM_Era) => {
149                crate::error::definitions::LLVM_EraCode::from_repr(self.code)
150                    .expect("Internal error")
151                    .get_error_name()
152            }
153            Kind::Compiler(CompilerCode::Solc) => {
154                crate::error::definitions::SolcCode::from_repr(self.code)
155                    .expect("Internal error")
156                    .get_error_name()
157            }
158            Kind::Compiler(CompilerCode::SolcFork) => {
159                crate::error::definitions::SolcForkCode::from_repr(self.code)
160                    .expect("Internal error")
161                    .get_error_name()
162            }
163            Kind::Compiler(CompilerCode::Zksolc) => {
164                crate::error::definitions::ZksolcCode::from_repr(self.code)
165                    .expect("Internal error")
166                    .get_error_name()
167            }
168            Kind::Compiler(CompilerCode::Zkvyper) => {
169                crate::error::definitions::ZkvyperCode::from_repr(self.code)
170                    .expect("Internal error")
171                    .get_error_name()
172            }
173            Kind::Core(CoreCode::API) => crate::error::definitions::APICode::from_repr(self.code)
174                .expect("Internal error")
175                .get_error_name(),
176            Kind::Core(CoreCode::EraVM) => {
177                crate::error::definitions::EraVMCode::from_repr(self.code)
178                    .expect("Internal error")
179                    .get_error_name()
180            }
181            Kind::Core(CoreCode::ExecutionPlatform) => {
182                crate::error::definitions::ExecutionPlatformCode::from_repr(self.code)
183                    .expect("Internal error")
184                    .get_error_name()
185            }
186            Kind::Core(CoreCode::Sequencer) => {
187                crate::error::definitions::SequencerCode::from_repr(self.code)
188                    .expect("Internal error")
189                    .get_error_name()
190            }
191            Kind::Foundry(FoundryCode::FoundryUpstream) => {
192                crate::error::definitions::FoundryUpstreamCode::from_repr(self.code)
193                    .expect("Internal error")
194                    .get_error_name()
195            }
196            Kind::Foundry(FoundryCode::FoundryZksync) => {
197                crate::error::definitions::FoundryZksyncCode::from_repr(self.code)
198                    .expect("Internal error")
199                    .get_error_name()
200            }
201            Kind::Hardhat(HardhatCode::HardhatUpstream) => {
202                crate::error::definitions::HardhatUpstreamCode::from_repr(self.code)
203                    .expect("Internal error")
204                    .get_error_name()
205            }
206            Kind::Hardhat(HardhatCode::HardhatZksync) => {
207                crate::error::definitions::HardhatZksyncCode::from_repr(self.code)
208                    .expect("Internal error")
209                    .get_error_name()
210            }
211        }
212    }
213}
214impl crate::documentation::Documented for Identifier {
215    type Documentation = &'static zksync_error_description::ErrorDocumentation;
216    fn get_documentation(
217        &self,
218    ) -> Result<Option<Self::Documentation>, crate::documentation::DocumentationError> {
219        use crate::documentation::model;
220        let repr = &self.get_identifier_repr();
221        match model.errors.get(repr) {
222            Some(metadata) => Ok(metadata.documentation.as_ref()),
223            None => Err(crate::documentation::DocumentationError::IncompleteModel(
224                format!("Can not fetch description for error {repr}."),
225            )),
226        }
227    }
228}