1use std::sync::OnceLock;
2
3use anyhow::Result;
4
5use self::arithops::ArithOps;
6use self::cellops::CellOps;
7use self::cmpops::CmpOps;
8use self::configops::ConfigOps;
9use self::contops::ContOps;
10use self::cryptops::CryptOps;
11use self::currencyops::CurrencyOps;
12use self::debugops::DebugOps;
13use self::dictops::DictOps;
14use self::gasops::GasOps;
15use self::logicops::LogicOps;
16use self::messageops::MessageOps;
17use self::randops::RandOps;
18use self::sizeops::SizeOps;
19use self::stackops::StackOps;
20use self::tupleops::TupleOps;
21use crate::dispatch::{DispatchTable, Opcodes};
22
23mod arithops;
24mod cellops;
25mod cmpops;
26mod configops;
27mod contops;
28mod cryptops;
29mod currencyops;
30mod debugops;
31mod dictops;
32mod gasops;
33mod logicops;
34mod messageops;
35mod randops;
36mod sizeops;
37mod stackops;
38mod tupleops;
39
40pub fn codepage(n: u16) -> Option<&'static DispatchTable> {
42 match n {
43 0 => Some(codepage0()),
44 _ => None,
45 }
46}
47
48pub fn codepage0() -> &'static DispatchTable {
50 fn build() -> Result<DispatchTable> {
51 let mut cp = DispatchTable::builder(0);
52 ArithOps.init(&mut cp)?;
53 CmpOps.init(&mut cp)?;
54 LogicOps.init(&mut cp)?;
55 CellOps.init(&mut cp)?;
56 ContOps.init(&mut cp)?;
57 StackOps.init(&mut cp)?;
58 TupleOps.init(&mut cp)?;
59 DebugOps.init(&mut cp)?;
60 DictOps.init(&mut cp)?;
61 GasOps.init(&mut cp)?;
62 RandOps.init(&mut cp)?;
63 ConfigOps.init(&mut cp)?;
64 MessageOps.init(&mut cp)?;
65 CryptOps.init(&mut cp)?;
66 CurrencyOps.init(&mut cp)?;
67 SizeOps.init(&mut cp)?;
68 Ok(cp.build())
69 }
70
71 static CP0: OnceLock<DispatchTable> = OnceLock::new();
72 CP0.get_or_init(|| build().unwrap())
73}
74
75trait Module {
76 fn init(&self, opcodes: &mut Opcodes) -> Result<()>;
77}