diff --git a/examples/kybra_like.py b/examples/kybra_like.py new file mode 100644 index 000000000..c94ad3f59 --- /dev/null +++ b/examples/kybra_like.py @@ -0,0 +1,90 @@ +from dataclasses import dataclass +from typing import Dict, Any + +Query = Any +Update = Any +nat64 = Any + +__all__ = [ + "initialize_supply", + "transfer", + "balance", + "ticker", + "name", + "total_supply", +] + + +@dataclass +class Account: + address: str + balance: nat64 + + +@dataclass +class State: + accounts: Dict[str, Account] + total_supply: nat64 + ticker: str + name: str + + +state = State( + accounts={}, + total_supply=0, + ticker="", + name="KYBRA", +) + + +def initialize_supply( + ticker: str, name: str, total_supply: nat64, original_address: str +) -> Update: + global state + state = State( + accounts={ + original_address: Account( + address=original_address, + balance=total_supply, + ) + }, + ticker=ticker, + name=name, + total_supply=total_supply, + ) + + return True + + +def transfer(from_: str, to: str, amount: nat64) -> Update: + global state + if state.accounts[to] is None: + state.accounts[to] = Account(address=to, balance=0) + + state.accounts[from_].balance -= amount + state.accounts[to].balance += amount + + return True + + +def balance(address: str) -> Query: + account = state.accounts[address] + if account is None: + return 0 + return account.balance + + +def ticker() -> Query: + return state.ticker + + +def name() -> Query: + return state.name + + +def total_supply() -> Query: + return state.total_supply + + +if __name__ == "__main__": + print(name()) diff --git a/examples/kybra_like.rs b/examples/kybra_like.rs new file mode 100644 index 000000000..ae7ef9aaf --- /dev/null +++ b/examples/kybra_like.rs @@ -0,0 +1,27 @@ +use rustpython_vm as vm; +use vm::builtins::PyStrRef; + +fn main() -> vm::PyResult<()> { + let interp = vm::Interpreter::with_init(Default::default(), |vm| { + vm.add_native_modules(rustpython_stdlib::get_module_inits()); + }); + let result = interp + .run_or_else( + |vm, exc| { + vm.print_exception(exc.clone()); + Err(exc) + }, + |vm| { + vm.insert_sys_path(vm.new_pyobj("examples")) + .expect("add path"); + let module = vm.import("kybra_like", None, 0)?; + let name_func = module.get_attr("name", vm)?; + let result = vm.invoke(&name_func, ())?; + let result: PyStrRef = result.try_into_value(vm)?; + Ok(result) + }, + ) + .unwrap(); + println!("name: {}", &result); + Ok(()) +}