AgentSkillsCN

Tauri Rust Backend

Tauri Rust 后端

SKILL.md

🦀 Tauri Rust Backend Skill

Especialização em desenvolvimento backend Tauri 2.0 com Rust
Versão: 2.0.0 | Última Atualização: 30 de Janeiro de 2026

🌐 ECOSYSTEM CONTEXT

yaml
rust_projects:
  GIRO-D:
    path: GIRO/apps/desktop/src-tauri/
    stack: Tauri 2.0 + SQLx (SQLite)
    purpose: Desktop PDV/Enterprise backend
  LICENSE:
    path: giro-license-server/backend/
    stack: Axum + SQLx (PostgreSQL)
    purpose: License API server

shared_patterns:
  - SQLx for compile-time checked queries
  - Repository pattern for data access
  - thiserror for error handling
  - serde for serialization
  - tracing for logging

📋 Descrição

Esta skill fornece conhecimento especializado para desenvolvimento de aplicações desktop com Tauri 2.0, incluindo:

  • Criação de Tauri Commands (IPC)
  • Services e Repositories com SQLx
  • Integração com hardware (impressoras, balanças, scanners)
  • State management com Tauri State
  • Plugins Tauri (window, dialog, fs, shell)

🛠️ Stack Técnica

ComponenteVersãoUso
Tauri2.0+Framework desktop
Rust1.75+ (edition 2021)Linguagem backend
SQLx0.7+Queries tipadas SQLite
Tokio1.35+Runtime async
Serde1.0+Serialização JSON
serialport4.3+Comunicação hardware
thiserror1.0+Error handling

📁 Estrutura Padrão

code
apps/desktop/src-tauri/
├── src/
│   ├── main.rs              # Entry point, setup Tauri
│   ├── lib.rs               # Exports públicos
│   ├── commands/            # Tauri commands (IPC)
│   │   ├── mod.rs
│   │   ├── products.rs
│   │   ├── sales.rs
│   │   └── ...
│   ├── services/            # Business logic
│   │   ├── mod.rs
│   │   └── ...
│   ├── repositories/        # Data access (SQLx)
│   │   ├── mod.rs
│   │   └── ...
│   ├── hardware/            # Device drivers
│   │   ├── mod.rs
│   │   ├── printer.rs
│   │   ├── scale.rs
│   │   └── ...
│   ├── models/              # Domain models
│   └── database/            # DB connection pool
├── Cargo.toml
└── tauri.conf.json

📐 Padrões de Código

Tauri Command

rust
use tauri::command;
use crate::services::ProductService;
use crate::models::{Product, ProductFilter};

/// Lista produtos com filtros opcionais
#[command]
pub async fn get_products(
    filter: ProductFilter,
    state: tauri::State<'_, AppState>,
) -> Result<Vec<Product>, String> {
    let service = ProductService::new(state.pool.clone());

    service
        .list(filter)
        .await
        .map_err(|e| e.to_string())
}

Repository Pattern

rust
pub struct ProductRepository {
    pool: Pool<Sqlite>,
}

impl ProductRepository {
    pub fn new(pool: Pool<Sqlite>) -> Self {
        Self { pool }
    }

    pub async fn find_by_barcode(&self, barcode: &str) -> Result<Option<Product>, sqlx::Error> {
        sqlx::query_as!(
            Product,
            r#"
            SELECT id, barcode, name, sale_price, current_stock
            FROM products
            WHERE barcode = ? AND is_active = true
            "#,
            barcode
        )
        .fetch_optional(&self.pool)
        .await
    }
}

Error Handling

rust
use thiserror::Error;

#[derive(Error, Debug)]
pub enum AppError {
    #[error("Produto não encontrado")]
    ProductNotFound,

    #[error("Estoque insuficiente: {available} disponível, {requested} solicitado")]
    InsufficientStock { available: f64, requested: f64 },

    #[error("Erro de banco: {0}")]
    Database(#[from] sqlx::Error),
}

impl From<AppError> for String {
    fn from(error: AppError) -> Self {
        error.to_string()
    }
}

✅ Checklist de Implementação

  • Command registrado em main.rs com .invoke_handler()
  • Tipos de retorno são Result<T, String>
  • Erros tratados com mensagens em português
  • Logs em pontos críticos com tracing
  • Sem .unwrap() em produção
  • Transações para operações múltiplas
  • Índices em queries frequentes

🔗 Recursos