cairo-lang-executable-plugin 2.18.0-rc.0

Cairo executable plugin.
Documentation
//! > Test executable on generic.

//! > test_runner_name
ExpandExecutableTestRunner(expect_diagnostics: true)

//! > cairo_code
#[executable]
fn main<T>() {}

//! > generated_cairo_code
#[executable]
fn main<T>() {}

//! > expected_diagnostics
error[E2200]: Plugin diagnostic: Executable functions cannot have generic params.
 --> lib.cairo:2:8
fn main<T>() {}
       ^^^

//! > ==========================================================================

//! > Test executable with arguments with no serde.

//! > test_runner_name
ExpandExecutableTestRunner(expect_diagnostics: true)

//! > cairo_code
#[executable]
fn main(a: NoSerde, b: felt252) -> felt252 {
    a.v + b
}

struct NoSerde {
    v: felt252,
}

//! > generated_cairo_code
#[executable]
fn main(a: NoSerde, b: felt252) -> felt252 {
    a.v + b
}

struct NoSerde {
    v: felt252,
}
#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod)]
#[executable_raw]
fn __executable_wrapper__main(mut input: Span<felt252>, ref output: Array<felt252>) {

    let __param__executable_wrapper__0 = Serde::deserialize(ref input).expect('Failed to deserialize param #0');
    let __param__executable_wrapper__1 = Serde::deserialize(ref input).expect('Failed to deserialize param #1');
    assert(core::array::SpanTrait::is_empty(input), 'Input too long for params.');
    let __result = @main(
        __param__executable_wrapper__0,
        __param__executable_wrapper__1,
    );
    Serde::serialize(__result, ref output);
}

//! > expected_diagnostics
error[E2311]: Trait has no implementation in context: core::serde::Serde::<test::NoSerde>.
 --> lib.cairo:2:9
fn main(a: NoSerde, b: felt252) -> felt252 {
        ^^^^^^^^^^

//! > ==========================================================================

//! > Test executable with result with no serde.

//! > test_runner_name
ExpandExecutableTestRunner(expect_diagnostics: true)

//! > cairo_code
#[executable]
fn main(a: felt252, b: felt252) -> NoSerde {
    NoSerde { v: a + b }
}

struct NoSerde {
    v: felt252,
}

//! > generated_cairo_code
#[executable]
fn main(a: felt252, b: felt252) -> NoSerde {
    NoSerde { v: a + b }
}

struct NoSerde {
    v: felt252,
}
#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod)]
#[executable_raw]
fn __executable_wrapper__main(mut input: Span<felt252>, ref output: Array<felt252>) {

    let __param__executable_wrapper__0 = Serde::deserialize(ref input).expect('Failed to deserialize param #0');
    let __param__executable_wrapper__1 = Serde::deserialize(ref input).expect('Failed to deserialize param #1');
    assert(core::array::SpanTrait::is_empty(input), 'Input too long for params.');
    let __result = @main(
        __param__executable_wrapper__0,
        __param__executable_wrapper__1,
    );
    Serde::serialize(__result, ref output);
}

//! > expected_diagnostics
error[E2311]: Trait has no implementation in context: core::serde::Serde::<test::NoSerde>.
 --> lib.cairo:2:33
fn main(a: felt252, b: felt252) -> NoSerde {
                                ^^^^^^^^^^

//! > ==========================================================================

//! > Test raw executable with return type.

//! > test_runner_name
ExpandExecutableTestRunner(expect_diagnostics: true)

//! > cairo_code
#[executable_raw]
fn main(mut _input: Span<felt252>, ref _output: Array<felt252>) -> felt252 {
    1
}

//! > generated_cairo_code
#[executable_raw]
fn main(mut _input: Span<felt252>, ref _output: Array<felt252>) -> felt252 {
    1
}

//! > expected_diagnostics
error[E2200]: Plugin diagnostic: Invalid return type for `#[executable_raw]` function, expected `()`.
 --> lib.cairo:2:65
fn main(mut _input: Span<felt252>, ref _output: Array<felt252>) -> felt252 {
                                                                ^^^^^^^^^^

//! > ==========================================================================

//! > Test raw executable wrong number of parameters.

//! > test_runner_name
ExpandExecutableTestRunner(expect_diagnostics: true)

//! > cairo_code
#[executable_raw]
fn main(mut _input: Span<felt252>, ref _output: Array<felt252>, extra: felt252) {}

//! > generated_cairo_code
#[executable_raw]
fn main(mut _input: Span<felt252>, ref _output: Array<felt252>, extra: felt252) {}

//! > expected_diagnostics
error[E2200]: Plugin diagnostic: Invalid number of params for `#[executable_raw]` function, expected 2.
 --> lib.cairo:2:9
fn main(mut _input: Span<felt252>, ref _output: Array<felt252>, extra: felt252) {}
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

//! > ==========================================================================

//! > Test raw executable bad input type.

//! > test_runner_name
ExpandExecutableTestRunner(expect_diagnostics: true)

//! > cairo_code
#[executable_raw]
fn main(mut _input: Span<u8>, ref _output: Array<felt252>) {}

//! > generated_cairo_code
#[executable_raw]
fn main(mut _input: Span<u8>, ref _output: Array<felt252>) {}

//! > expected_diagnostics
error[E2200]: Plugin diagnostic: Invalid first param type for `#[executable_raw]` function, expected `Span<felt252>`.
 --> lib.cairo:2:13
fn main(mut _input: Span<u8>, ref _output: Array<felt252>) {}
            ^^^^^^

//! > ==========================================================================

//! > Test raw executable bad output type.

//! > test_runner_name
ExpandExecutableTestRunner(expect_diagnostics: true)

//! > cairo_code
#[executable_raw]
fn main(mut _input: Span<felt252>, ref _output: Array<u8>) {}

//! > generated_cairo_code
#[executable_raw]
fn main(mut _input: Span<felt252>, ref _output: Array<u8>) {}

//! > expected_diagnostics
error[E2200]: Plugin diagnostic: Invalid second param type for `#[executable_raw]` function, expected `Array<felt252>`.
 --> lib.cairo:2:40
fn main(mut _input: Span<felt252>, ref _output: Array<u8>) {}
                                       ^^^^^^^

//! > ==========================================================================

//! > Test raw executable bad input modifier.

//! > test_runner_name
ExpandExecutableTestRunner(expect_diagnostics: true)

//! > cairo_code
#[executable_raw]
fn main(ref _input: Span<felt252>, ref _output: Array<felt252>) {}

//! > generated_cairo_code
#[executable_raw]
fn main(ref _input: Span<felt252>, ref _output: Array<felt252>) {}

//! > expected_diagnostics
error[E2200]: Plugin diagnostic: Invalid first param mutability for `#[executable_raw]` function, got unexpected `ref`.
 --> lib.cairo:2:13
fn main(ref _input: Span<felt252>, ref _output: Array<felt252>) {}
            ^^^^^^

//! > ==========================================================================

//! > Test raw executable bad output modifier.

//! > test_runner_name
ExpandExecutableTestRunner(expect_diagnostics: true)

//! > cairo_code
#[executable_raw]
fn main(mut _input: Span<felt252>, _output: Array<felt252>) {}

//! > generated_cairo_code
#[executable_raw]
fn main(mut _input: Span<felt252>, _output: Array<felt252>) {}

//! > expected_diagnostics
error[E2200]: Plugin diagnostic: Invalid second param mutability for `#[executable_raw]` function, expected `ref`.
 --> lib.cairo:2:36
fn main(mut _input: Span<felt252>, _output: Array<felt252>) {}
                                   ^^^^^^^

//! > ==========================================================================

//! > Test executable with ref arg.

//! > test_runner_name
ExpandExecutableTestRunner(expect_diagnostics: true)

//! > cairo_code
#[executable]
fn with_ref_arg(ref a: felt252) {
    a += 1;
}

//! > generated_cairo_code
#[executable]
fn with_ref_arg(ref a: felt252) {
    a += 1;
}

//! > expected_diagnostics
error[E2200]: Plugin diagnostic: Parameters of an `#[executable]` function can't be `ref`.
 --> lib.cairo:2:17
fn with_ref_arg(ref a: felt252) {
                ^^^