Я использую Tauri для создания графического интерфейса. В моем бэкэнде я определяю две команды:
#[tauri::command]
fn functional_test(msg: String) {
println!("Received : {}", msg);
}
#[tauri::command]
fn no_functional_test(my_msg: String) {
println!("Received : {}", my_msg);
}
fn main() {
tauri::Builder::default()
.setup(...)
.invoke_handler(tauri::generate_handler![functional_test, no_functional_test])
.run(tauri::generate_context!())
.expect("failed to run app");
}
Обратите внимание, что единственная разница между этими двумя функциями — это имя параметра: msg и my_msg.
Во внешнем интерфейсе (с использованием реакции) у меня есть этот блок кода:
export function AComponent({name}: {name: string}) {
useEffect(() => {
const fetchSomething = async () => {
try {
await invoke('functional_test', {msg:"This is a message"})
await invoke('no_functional_test', {my_msg:"This is also a message"})
} catch (error) {
await invoke('functional_test', {msg:error})
}
};
fetchSomething();
}, [name]);
return (...)
}
Здесь я пытаюсь вызвать каждую из двух функций. Поскольку я не знаю, как отображать логи фронтенда, для отладки использую рабочую функцию.
Есть вывод:
Received : This is a message
Received : invalid args `myMsg` for command `no_functional_test`: command no_functional_test missing required key myMsg
Очевидно, что первая строка результата — это выполнение 5-й строки кода фронтенда, а вот вторая строка — это выполнение 8-й строки, поскольку 6-я строка вызывает ошибку. Как мы видим, Таури ожидает, что параметр будет иметь имя myMsg, а не my_msg, как я определил его в бэкэнде.
Что происходит? Это нормально?

В руководстве Таури по передаче аргументов команды говорится:
Обратите внимание: при объявлении аргументов в Rust с использованием Snake_case аргументы преобразуются в CamelCase для JavaScript.
Значит, это сделано Тельцом намеренно. Почему? Вероятно, это лучшая попытка следовать соглашениям (snake_case предпочтительнее в Rust, а CamelCase — в Javascript).
Если вы этого не хотите, вы можете настроить это при определении команды:
#[tauri::command(rename_all = "snake_case")]
Кроме того, имейте в виду, что автоматическое переименование влияет только на имена аргументов, а не на содержащиеся в них данные. Таким образом, внешнее имя будет CamelCase, но любые вложенные поля, скорее всего, будут Snake_case (соответствующие стороне Rust), если вы не настроите serde для их переименования через #[serde(rename_all = "camelCase")].
Связанный: