thalir-parser 0.1.0

Parser for ThalIR files
Documentation
use thalir_parser;

#[test]
fn test_parse_cli_generated_simple_storage() {
    let input = r#"
; Contract: SimpleStorage
; Version: 0.8.0

function %set(i256) {
    ; Visibility: Public
    ; Mutability: NonPayable

block0(v0: i256):
    storage_store slot0, v0
    return
}

function %get() -> i256 {
    ; Visibility: Public
    ; Mutability: View

block0:
    v0 = storage_load slot0
    return v0
}
"#;

    match thalir_parser::parse(input) {
        Ok(_) => {}
        Err(e) => panic!("Failed to parse CLI-generated IR: {}", e),
    }
}

#[test]
fn test_parse_cli_generated_erc20_style() {
    let input = r#"
; Contract: TokenLike
; Version: 0.8.0

function %transfer(address, i256) -> i1 {
    ; Visibility: Public
    ; Mutability: NonPayable

block0(v0: address, v1: i256):
    v2 = get_context msg.sender
    v3 = mapping_load map0, v2
    v4 = icmp uge v3, v1
    require v4, "insufficient balance"
    v5 = isub.i256 v3, v1
    mapping_store map0, v2, v5
    v6 = mapping_load map0, v0
    v7 = iadd.i256 v6, v1
    mapping_store map0, v0, v7
    v8 = iconst.i1 1
    return v8
}
"#;

    match thalir_parser::parse(input) {
        Ok(_) => {}
        Err(e) => panic!("Failed to parse CLI-generated ERC20-style IR: {}", e),
    }
}

#[test]
fn test_parse_with_all_visibility_mutability() {
    let input = r#"
function %publicFunc() {
    ; Visibility: Public
    ; Mutability: NonPayable

block0:
    return
}

function %viewFunc() -> i256 {
    ; Visibility: Public
    ; Mutability: View

block0:
    v0 = iconst.i256 42
    return v0
}

function %payableFunc() {
    ; Visibility: Public
    ; Mutability: Payable

block0:
    v0 = get_context msg.value
    storage_store slot0, v0
    return
}
"#;

    assert!(thalir_parser::parse(input).is_ok());
}