Tratamento de Erros no CXX: Exemplo QR

O gerador de cĂłdigo QR Ă© um exemplo onde um booleano Ă© usado para comunicar sucesso vs falha e onde o resultado bem-sucedido pode ser passado pela fronteira FFI:

#[cxx::bridge(namespace = "qr_code_generator")]
mod ffi {
    extern "Rust" {
        fn generate_qr_code_using_rust(
            data: &[u8],
            min_version: i16,
            out_pixels: Pin<&mut CxxVector<u8>>,
            out_qr_size: &mut usize,
        ) -> bool;
    }
}

Os alunos podem estar curiosos sobre a semĂąntica da saĂ­da out_qr_size. Este nĂŁo Ă© o tamanho do vetor, mas o tamanho do cĂłdigo QR (e, reconhecidamente, Ă© um pouco redundante - esta Ă© a raiz quadrada do tamanho do vetor).

Pode valer a pena destacar a importĂąncia de inicializar out_qr_size antes de chamar a função Rust. A criação de uma referĂȘncia Rust que aponta para a memĂłria nĂŁo inicializada resulta em Comportamento Indefinido (ao contrĂĄrio do C++, quando apenas o ato de desreferenciar tal memĂłria resulta em UB).

Se os alunos perguntarem sobre Pin, explique por que o CXX precisa dele para referĂȘncias mutĂĄveis a dados C++: a resposta Ă© que os dados C++ nĂŁo podem ser movidos como os dados Rust, porque podem conter ponteiros auto-referenciais.