fiscal-rsfiscal-rs

Estrutura do Projeto

Mapa completo de diretórios e arquivos do repositório fiscal-rs

Visão Geral

O repositório fiscal-rs é um workspace Cargo com três crates de biblioteca, um crate fachada, suítes de teste, benchmarks, fuzz targets e infraestrutura de CI/CD.

fiscal-rs/
├── Cargo.toml              # Workspace root + crate fachada
├── Cargo.lock              # Lockfile de dependências
├── src/
│   └── lib.rs              # Fachada: re-exporta fiscal-core, fiscal-crypto, fiscal-sefaz
├── crates/
│   ├── fiscal-core/        # Lógica pura: tipos, impostos, XML builder
│   ├── fiscal-crypto/      # Certificado digital e assinatura XML
│   └── fiscal-sefaz/       # Comunicação com webservices SEFAZ
├── tests/                  # Testes de integração do workspace
│   ├── fixtures/           # Arquivos de teste (XML, TXT, certificados, XSD)
│   └── snapshots/          # Snapshots insta
├── benches/                # Benchmarks com divan
├── fuzz/                   # Fuzz targets com cargo-fuzz / libfuzzer
├── docs/                   # Site de documentação (Fumadocs/Next.js)
├── scripts/                # Git hooks e utilitários
├── .github/                # Workflows CI e Dependabot
├── clippy.toml             # Configuração do Clippy
├── rustfmt.toml            # Configuração do rustfmt
├── deny.toml               # Configuração do cargo-deny (licenças, advisories)
└── release-plz.toml        # Configuração do release-plz (publicação automática)

Crate Raiz — Fachada

ArquivoDescrição
Cargo.tomlDefine o workspace (members) e o crate fachada fiscal com dependências nos três sub-crates
src/lib.rsRe-exporta fiscal_core::*, fiscal_crypto::certificate e fiscal_sefaz

O crate fachada não contém lógica própria — existe apenas para oferecer um ponto de entrada unificado (use fiscal::...).

Crates Internos

crates/fiscal-core/

Núcleo funcional puro — sem I/O, sem unsafe, sem dependência de OpenSSL ou rede.

ArquivoMóduloDescrição
lib.rsDeclaração de todos os módulos públicos
types.rstypesStructs principais: IssuerData, RecipientData, InvoiceItemData, PaymentData, enums InvoiceModel, SefazEnvironment, TaxRegime
newtypes.rsnewtypesNewtypes validados: TaxId, Gtin, Ncm, Cfop, Cents, Rate, Rate4
error.rserrorFiscalError — tipo de erro unificado com thiserror
xml_builder/xml_builderInvoiceBuilder typestate (DraftBuiltSigned)
xml_utils.rsxml_utilsPrimitivas XML: tag(), escape_xml(), extract_xml_tag_value()
tax_element.rstax_elementTaxElement e TaxField — estrutura genérica de imposto
tax_icms.rstax_icmsICMS: 15+ variantes CST/CSOSN, acumulador IcmsTotals
tax_pis_cofins_ipi.rstax_pis_cofins_ipiPIS, COFINS, IPI e II (Imposto de Importação)
tax_issqn.rstax_issqnISSQN — imposto sobre serviços municipais
tax_is.rstax_isIS — imposto IBS/CBS da reforma tributária
complement.rscomplementAnexação de protocolo SEFAZ ao XML assinado
contingency.rscontingencyGerenciamento de contingência (SVC-AN, SVC-RS, offline)
qrcode.rsqrcodeGeração de URL de QR Code para NFC-e
convert.rsconvertConversão de arquivo TXT (SPED) para XML
standardize.rsstandardizeIdentificação de tipo de documento XML e conversão para JSON
gtin.rsgtinValidação de código de barras GTIN/EAN
format_utils.rsformat_utilsFormatação de centavos, alíquotas e quantidades para XML
state_codes.rsstate_codesTabela de códigos IBGE dos estados brasileiros
status_codes.rsstatus_codesCódigos de status (cStat) das respostas SEFAZ
constants.rsconstantsNamespaces XML, URIs de algoritmos, códigos de pagamento
traits.rstraitsTraits selados: TaxCalculation, XmlSerializable
sealed.rssealedInfraestrutura do sealed trait pattern

crates/fiscal-crypto/

Casca imperativa para criptografia — depende de OpenSSL.

ArquivoMóduloDescrição
lib.rsDeclaração do módulo certificate
certificate.rscertificateload_certificate() (PFX → chave + cert), sign_xml() (XML-DSig)

crates/fiscal-sefaz/

Casca imperativa para comunicação SEFAZ — depende de reqwest (feature-gated).

ArquivoMóduloDescrição
lib.rsDeclaração dos módulos e re-exportação de status_codes
urls.rsurlsResolução de URLs por UF e ambiente (produção/homologação)
services.rsservicesMetadados SOAP: método, operação, versão por serviço
request_builders.rsrequest_buildersBuilders de envelope SOAP para cada operação
response_parsers.rsresponse_parsersParsing de resposta XML e structs tipadas de resultado
client.rsclientClient HTTP async com mTLS via reqwest + native-tls
soap.rs(privado)Utilitários internos de envelope SOAP

Testes

O diretório tests/ contém testes de integração que exercitam o workspace inteiro.

Arquivos de Teste

ArquivoTipoDescrição
certificate_test.rsIntegraçãoCarregamento de PFX, extração de dados, assinatura XML
complement_test.rsIntegraçãoAnexação de protocolo de autorização
complement_ported_test.rsPortadoTestes portados do PHP sped-nfe (complement)
make_ported_test.rsPortadoTestes portados de construção de NF-e
deep_comm_coverage_ported_test.rsPortadoCobertura profunda de campos de comunicação
render_coverage_ported_test.rsPortadoCobertura de renderização XML
tax_coverage_ported_test.rsPortadoCobertura de cálculos de impostos (parte 1)
tax_coverage_ported_part2_test.rsPortadoCobertura de cálculos de impostos (parte 2)
tools_ported_test.rsPortadoUtilitários portados do PHP
misc_ported_test.rsPortadoTestes diversos portados do PHP
tax_icms_test.rsUnitárioTestes específicos de ICMS
tax_pis_cofins_ipi_test.rsUnitárioTestes específicos de PIS, COFINS e IPI
xml_builder_test.rsIntegraçãoInvoiceBuilder typestate end-to-end
qrcode_test.rsUnitárioGeração de QR Code NFC-e
property_tests.rsPropertyTestes baseados em propriedades com proptest
snapshot_tests.rsSnapshotTestes de snapshot com insta
common/mod.rsHelperMódulo compartilhado de utilidades para testes

Fixtures (tests/fixtures/)

DiretórioConteúdo
certs/Certificados PFX de teste (CNPJ e CPF com senha minhasenha)
xml/XMLs de referência: NF-e layout 4, NFC-e, CT-e, NF-e antiga v3.10, contingência
txt/Arquivos TXT no formato SPED para conversão TXT→XML
schemes/Schemas XSD oficiais (tiposBasico_v4.00.xsd)

Snapshots (tests/snapshots/)

Arquivos .snap gerados pelo insta para testes de snapshot. Capturam a saída exata de funções de serialização XML, formatação de tags e cálculos de impostos, protegendo contra regressões.

Benchmarks

ArquivoDescrição
benches/fiscal_bench.rsBenchmarks com divan para operações críticas de performance
benches/baseline_*.txtResultados de baselines históricas para comparação de performance

O Cargo.toml raiz configura o benchmark com harness = false (necessário para o divan):

[[bench]]
name = "fiscal_bench"
harness = false

Para executar:

cargo bench

Fuzz Targets

O diretório fuzz/ contém targets para cargo-fuzz (baseado em libfuzzer), focados em entradas não confiáveis.

TargetDescrição
fuzz_response_parsersFuzzing dos parsers de resposta SEFAZ
fuzz_txt_to_xmlFuzzing da conversão TXT→XML
fuzz_xml_standardizeFuzzing da identificação de tipo XML
fuzz_gtin_validationFuzzing da validação de código de barras
fuzz_xml_tag_extractionFuzzing da extração de valores de tags XML

O diretório fuzz/corpus/ contém seeds iniciais (XMLs válidos) para alimentar o fuzzer.

Para executar um target:

cargo +nightly fuzz run fuzz_response_parsers

CI/CD (.github/)

Workflows

WorkflowTriggerJobs
ci.ymlPush/PR para masterRustfmt (formatação), Clippy (lints), Tests (nextest), Doc tests, Documentation (cargo doc)
audit.ymlPush para master, diário (06:00 UTC), manualcargo-deny (licenças, bans, advisories), cargo-audit (RustSec)
release-plz.ymlPush para masterRelease (publica no crates.io), Release PR (abre PR de release com changelog)

Dependabot

O arquivo dependabot.yml configura atualizações automáticas de dependências Cargo e GitHub Actions.

Configuração de Qualidade

ArquivoFerramentaDestaques
clippy.tomlClippyMSRV 1.85, threshold de complexidade cognitiva = 30
rustfmt.tomlrustfmtEdition 2024, largura máxima 100, field init shorthand
deny.tomlcargo-denyLicenças permitidas (MIT, Apache-2.0, BSD, etc.), wildcards = "deny", advisories RustSec
release-plz.tomlrelease-plzConventional commits, semver-checks habilitado, timeout de 10 min para publicação

Scripts

ArquivoDescrição
scripts/install-hooks.shInstala git hooks do diretório scripts/hooks/ no .git/hooks/
scripts/hooks/pre-pushHook pre-push que executa fmt, clippy, testes, doc tests, cargo doc e cargo-deny antes de permitir o push

O hook pre-push replica localmente os mesmos checks do CI, bloqueando pushes que quebrariam o pipeline.

Site de Documentação (docs/)

O diretório docs/ é um site Fumadocs (Next.js + MDX):

CaminhoDescrição
content/docs/Páginas MDX da documentação
content/docs/meta.jsonOrdem e agrupamento das páginas na sidebar
src/components/mermaid.tsxComponente de diagramas Mermaid com zoom, pan e exportação JPG
src/components/mdx.tsxRegistro de componentes MDX customizados
source.config.tsConfiguração do Fumadocs source
next.config.mjsConfiguração do Next.js

On this page