Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

command in rust does not get called via invoke, no error message

I've got 3 commands i am calling from the front end, 2 of them work perfectly, the third does not. The issue lies with the function tournament_search

main.rs:

fn main() {
    tauri::Builder::default()
        .manage(ApiKey {key: Default::default()})
        .invoke_handler(tauri::generate_handler![set_api_key, check_connection, tournament_search])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

#[tauri::command]
fn set_api_key(key: String , state: State<ApiKey>){
    let mut api_key = state.key.lock().unwrap();
    *api_key = key;
}


#[tauri::command]
async fn check_connection(api_key: State<'_, ApiKey>) -> Result<bool, ()> {
    let key = api_key.key.lock().unwrap().clone();
    let res = Client::new().get(API_URL).bearer_auth(key).send().await.unwrap().text().await.unwrap();
    let json: Value = serde_json::from_str(res.as_str()).unwrap();
    match json["success"].as_bool() {
        Some(_x) => Ok(false),
        None => Ok(true)
    }
}


#[tauri::command]
async fn tournament_search(search_string: String, api_key: State<'_, ApiKey>) -> Result<&str, ()> {
    println!("test: {}", search_string);
    let key = api_key.key.lock().unwrap().clone();
    let mut query: String = String::new();
    query.push_str("query($name:String){tournaments(query:{filter:{name:$name}}){nodes{name,slug,id}}},{$name:");
    query.push_str(search_string.as_str());
    query.push_str("}");
    let res = Client::new().get(API_URL).bearer_auth(key).body(query).send().await.unwrap().text().await.unwrap();
    println!("{}", res);

    Ok("")
}

index.js:

const { invoke } = window.__TAURI__.tauri

window.addEventListener("load", (ev) => {
    let test = document.getElementById("test");
    let apiKey = document.getElementById("apiKey");
    let tournamentSearch = document.getElementById("tournamentSearch");
    let tourneyList = document.getElementById("tourneyList");

    apiKey.addEventListener("input", (ev) => {
        invoke("set_api_key", {key: apiKey.value});
        invoke("check_connection").then((res) => {
            if(res){
                tournamentSearch.disabled = false;            
            }else{
                tournamentSearch.disabled = true;
            }
        });
    });

    tournamentSearch.addEventListener("input", (ev) => {
        test.innerText = "e";
        invoke('tournament_search', {search_string: tournamentSearch.value}).then((res) => {
            test.innerText = res;
        });
    });


});

Already looked for zero width characters, whether the event get's called in js etc. The issue is just that the function is not called.

like image 829
Xirom Avatar asked Oct 16 '25 05:10

Xirom


1 Answers

You'd only see an error message by adding a .catch() to the invoke call.

Anyawy, the issue here is that Tauri converts command arguments to camelCase on the rust side (to match the JS default) so it would be { searchString: tournamentSearch.value } instead.

If you'd prefer snake_case instead, you can tell Tauri to use that for arguments by changing the command like this:

#[tauri::command(rename_all = "snake_case")]
like image 91
FabianLars Avatar answered Oct 18 '25 22:10

FabianLars