Módulos e Imports
Estrutura básica
Section titled “Estrutura básica”Em Soyuz:
- Um arquivo = um módulo
- Uma pasta = um package
Não há declaração de package no topo do arquivo — o caminho da pasta é o package.
Directorysrc/
- main.sy
Directoryusuario/
- model.sy
- service.sy
Visibilidade
Section titled “Visibilidade”Por padrão, tudo é privado ao módulo. Use pub para exportar:
pub record Usuario { // exportado id: Int nome: String}
record SenhaInterna { // privado — só usado internamente neste arquivo hash: String}
pub fn criarUsuario(nome: String) -> Usuario { return Usuario { id: 0, nome: nome }}Importando
Section titled “Importando”Em Soyuz, imports são agrupados em blocos import (...). Você pode importar de pacotes da biblioteca padrão (@soyuz/) ou de caminhos relativos à raiz do seu projeto (@/).
Import de Standard Library
Section titled “Import de Standard Library”import ( { range, readFile, getenv, Error } from @soyuz/prelude { List, Map } from @soyuz/collections)O @soyuz/prelude é auto-importado em todo arquivo Soyuz.
Import do Projeto (@/)
Section titled “Import do Projeto (@/)”O prefixo @/ refere-se à raiz do seu projeto (onde está o soyuz.toml):
import ( { Usuario, criarUsuario } from @/usuario/model)Caminho dos imports
Section titled “Caminho dos imports”O caminho é sempre absoluto a partir da raiz do projeto (@/) ou da stdlib (@soyuz/).
import ( { Usuario } from @/usuario/model { AppError } from @/shared/erros)Imports circulares
Section titled “Imports circulares”Imports circulares não são permitidos. Se A importa B e B importa A, o compilador emite um erro.
A solução é extrair os tipos compartilhados para um terceiro módulo:
// Antes — circularusuario/model.sy → produto/model.sy → usuario/model.sy
// Depois — sem cicloshared/tipos.sy ← usuario/model.syshared/tipos.sy ← produto/model.syConfiguração do projeto
Section titled “Configuração do projeto”O arquivo soyuz.toml na raiz define o projeto:
[project]name = "minha-app"version = "0.1.0"type = "binary" # ou "library"entry = "main.sy"
[packages]utils = "lib/utils" # @utils/... aponta para lib/utils/Exemplos práticos
Section titled “Exemplos práticos”Separação de responsabilidades
Section titled “Separação de responsabilidades”import ( { Pedido, StatusPedido } from @/pedido/model { PedidoVazioError } from @/pedido/erros { PedidoRepositorio } from @/pedido/repositorio)
pub class PedidoService { val repo: PedidoRepositorio
pub fn confirmar(self, id: Int) -> Result[Pedido] { val pedido = self.repo.buscar(id) |?> fn(p) => p // ... lógica return pedido }}import ( { PedidoService } from @/pedido/service { PedidoRepositorio } from @/pedido/repositorio)
fn main() { val repo = PedidoRepositorio { items: [] } val service = PedidoService { repo: repo }
match service.confirmar(1) { Ok(p) => print("Pedido confirmado") Err(e) => print("Erro: $(e.message())") }}