Как подключить внешний файл в модуле Rust?

Как мне правильно подключить файл db.rs с помощью `mod db;` в файле lib.rs, чтобы избежать ошибки "file not found for module `db`"? Вот структура проекта: 

```
Project:
   src:
      main.rs
      lib.rs
      db.rs
```

В данном случае файл db.rs содержит следующее:

```rust
mod db;
use sqlx::{Result, SqlitePool, query, query_as};

pub async fn connect_db() -> Result<SqlitePool> {
    let pool = SqlitePool::connect("sqlite://passwordsx.db").await?;
    Ok(pool)
}
```

А в файле lib.rs есть такой код:

```rust
use sqlx::{SqlitePool, query};

pub mod cmd {
    use sqlx::{SqlitePool, query};
    mod db; // ошибка
    
    #[tauri::command]
    pub fn greet(name: &str) -> String {
        format!("Hello, {}! You've been greeted from Rust!", name)
    }
}
```

Уже 3 часа пытаюсь разобраться с этой ошибкой, подскажите, как ее устранить?
  • 29 марта 2025 г. 17:44
Ответы на вопрос 3
Кажется, у вас возникла проблема с подключением модуля `db` в вашем проекте Rust. Ошибка "file not found for module `db`" возникает, когда компилятор Rust не может найти файл, соответствующий модулю.

Давайте разберемся, как это правильно сделать.

### Структура проекта

Ваш проект имеет следующую структуру:

```
Project:
   src:
      main.rs
      lib.rs
      db.rs
```

### Как исправить ошибку

Вам нужно убедиться, что вы правильно указываете путь к модулю. В вашем случае вы хотите подключить `db.rs` внутри модуля `cmd`, который находится в `lib.rs`.

Вот правильный способ сделать это:

1. **Объявите модуль db** в файле `lib.rs` вне модуля `cmd`. Таким образом, Rust сможет найти ваш файл `db.rs` на верхнем уровне, и вы сможете его использовать.

Ваш `lib.rs` должен выглядеть так:

```rust
use sqlx::{SqlitePool, query};

pub mod cmd {
    use super::*; // Используем все, что есть в родительском модуле

    // Теперь подключаем db
    pub mod db; // Изменено с `mod db;` на `pub mod db;`
    
    #[tauri::command]
    pub fn greet(name: &str) -> String {
        format!("Hello, {}! You've been greeted from Rust!", name)
    }
}
```

2. **Измените `db.rs`**. Ваша структура файла `db.rs` может оставаться прежней, но нужно убрать строку `mod db;`, потому что это не нужно в этом контексте.

Ваш `db.rs` должен выглядеть так:

```rust
use sqlx::{Result, SqlitePool};

pub async fn connect_db() -> Result<SqlitePool> {
    let pool = SqlitePool::connect("sqlite://passwordsx.db").await?;
    Ok(pool)
}
```

Теперь структура проекта будет выглядеть так:

```
Project:
   src:
      main.rs
      lib.rs
      db.rs
```

### Итог

- Объявляйте модули (`pub mod db;`) на верхнем уровне в `lib.rs`.
- Убедитесь, что вы используете `use super::*;` в модуле `cmd`, если хотите использовать функции или типы из `lib.rs`.
- Убедитесь, что нет ненужного объявления `mod db;` внутри модуля `cmd`, так как вы уже подключили `db` модуль на верхнем уровне.

Теперь ваш проект должен компилироваться без ошибок, и модуль `db` станет доступен для использования в модуле `cmd`.
Я уже 3ч маучаюсь с этой ошибкой...
А мог за 15 минут прочитать 7 главу растбука , где все разобрано.
Структура модулей в крейте с точностью повторяет структуру файлов на диске, даже если модуль объявлен внутри модуля не вынесеного в отдельный файл. 
То есть одно и то же объявление mod db; будет искать файл в разных местах, в зависимости от того, где оно написано: Но у меня большое подозрение, что Вы вообще не понимаете, как работает ключевое слово mod, ибо напихали его где только можно, включая сам db.rs (там будет искать src/db/db.rs кстати). Ключевое слово mod подключает модуль как дочерний того модуля, где оно написано. А для импорта имён нужно использовать use.

И как верно подметил fenrir , если бы Вы внимательно прочитали растбук, то Вы бы это поняли.
Похожие вопросы