Um resolvedor de fórmulas poderoso e flexível para Swift, com suporte a operações lógicas e matemáticas, além de uma ferramenta de linha de comando.
- Visão Geral
- Funcionalidades
- Instalação
- Uso
- Operações Disponíveis
- Exemplos
- Estrutura do Projeto
- Testes
- Requisitos
O Formula Solver é uma biblioteca Swift que permite avaliar e resolver fórmulas complexas com suporte a:
- Operações lógicas (AND, OR, NOT, IF, EQ)
- Operações matemáticas (SUM)
- Fórmulas aninhadas
- Referências de variáveis com contexto
- Tipos de dados múltiplos (Boolean, Number, String)
- Parser de Fórmulas: Converte strings em estruturas de dados que representam fórmulas
- Avaliador de Expressões: Executa operações e retorna resultados
- Suporte a Contexto: Permite passar variáveis externas para as fórmulas
- Validação de Sintaxe: Verifica se uma fórmula é válida antes de executá-la
- CLI Tool: Interface de linha de comando para resolver fórmulas rapidamente
- Type-Safe: Sistema de tipos robusto com validação de argumentos
Adicione ao seu Package.swift:
dependencies: [
.package(url: "https://github.com/miggelucas/PLC.git", from: "1.0.0")
]E então adicione FormulaSolver aos targets:
.target(
name: "MeuApp",
dependencies: ["FormulaSolver"]
)Clone o repositório e compile:
git clone https://github.com/miggelucas/PLC.git
cd PLC
swift build -c releaseO executável estará em .build/release/FST.
import FormulaSolver
let solver = FormulaSolver()
// Resolver uma fórmula simples
let result = try solver.solveFormula("SUM(1; 2; 3)")
print(result) // "6.0"// Operação AND
let andResult = try solver.solveFormula("AND(TRUE; TRUE)")
print(andResult) // "TRUE"
// Operação OR
let orResult = try solver.solveFormula("OR(FALSE; TRUE)")
print(orResult) // "TRUE"
// Operação NOT
let notResult = try solver.solveFormula("NOT(FALSE)")
print(notResult) // "TRUE"let context = [
"idade": "25",
"temCarro": "TRUE",
"salario": "5000"
]
let formula = "AND(EQ(idade; 25); temCarro)"
let result = try solver.solveFormula(formula, context: context)
print(result) // "TRUE"let formula = "IF(AND(TRUE; OR(FALSE; TRUE)); SUM(10; 20); 0)"
let result = try solver.solveFormula(formula)
print(result) // "30.0"A ferramenta de linha de comando (FST - Formula Solver Tool) fornece duas funcionalidades principais:
# Sintaxe básica
./FST solve "SUM(1; 2; 3)"
# 🔍 Calculando a fórmula: SUM(1; 2; 3)
# ✅ Resultado: 6.0
# Operações lógicas
./FST solve "AND(TRUE; OR(FALSE; TRUE))"
# ✅ Resultado: TRUE
# Fórmulas complexas
./FST solve "IF(EQ(10; 10); SUM(5; 5); 0)"
# ✅ Resultado: 10.0./FST validate "AND(TRUE; FALSE)"
# 🔎 Validando a fórmula: AND(TRUE; FALSE)
# ✅ A fórmula é válida../FST --help
# Exibe todas as opções disponíveis
./FST solve --help
# Exibe ajuda específica do comando solve| Operação | Descrição | Sintaxe | Exemplo |
|---|---|---|---|
AND |
E lógico - retorna TRUE se todos os argumentos forem TRUE | AND(arg1; arg2; ...) |
AND(TRUE; TRUE) → TRUE |
OR |
OU lógico - retorna TRUE se pelo menos um argumento for TRUE | OR(arg1; arg2; ...) |
OR(FALSE; TRUE) → TRUE |
NOT |
NÃO lógico - inverte o valor booleano | NOT(arg) |
NOT(FALSE) → TRUE |
IF |
Condicional - retorna um valor baseado em uma condição | IF(condição; valorSeVerdadeiro; valorSeFalso) |
IF(TRUE; 10; 20) → 10 |
EQ |
Igualdade - verifica se dois valores são iguais | EQ(arg1; arg2) |
EQ(5; 5) → TRUE |
| Operação | Descrição | Sintaxe | Exemplo |
|---|---|---|---|
SUM |
Soma - adiciona todos os argumentos numéricos | SUM(arg1; arg2; ...) |
SUM(1; 2; 3) → 6.0 |
- Boolean:
TRUE,FALSE - Number: Números inteiros e decimais (ex:
42,3.14) - String: Texto entre aspas duplas (ex:
"hello") - Reference: Nome de variável do contexto (ex:
idade,nome) - NestedFormula: Fórmulas dentro de outras fórmulas
let context = [
"idade": "18",
"temDocumento": "TRUE",
"aprovado": "TRUE"
]
let formula = "AND(EQ(idade; 18); AND(temDocumento; aprovado))"
let result = try solver.solveFormula(formula, context: context)
// Resultado: "TRUE"let context = [
"temDesconto": "TRUE",
"valorOriginal": "100"
]
let formula = "IF(temDesconto; SUM(valorOriginal; -20); valorOriginal)"
let result = try solver.solveFormula(formula, context: context)
// Resultado: "80.0"let context = [
"A1": "10",
"B1": "20",
"C1": "30",
"condicao": "TRUE"
]
let formula = "IF(condicao; SUM(A1; B1; C1); 0)"
let result = try solver.solveFormula(formula, context: context)
// Resultado: "60.0"let formula = "OR(EQ(5; 5); AND(FALSE; TRUE))"
let result = try solver.solveFormula(formula)
// Resultado: "TRUE"let context = [
"nome": "\"Lucas\"",
"nomeEsperado": "\"Lucas\""
]
let formula = "EQ(nome; nomeEsperado)"
let result = try solver.solveFormula(formula, context: context)
// Resultado: "TRUE"PLC/
├── Sources/
│ ├── FormulaSolver/ # Biblioteca principal
│ │ ├── Formula/ # Parser e resolver de fórmulas
│ │ │ ├── FormulaSolver.swift
│ │ │ ├── FormulaParser.swift
│ │ │ ├── Model/
│ │ │ │ ├── Formula.swift
│ │ │ │ └── Value.swift
│ │ │ ├── Protocols/
│ │ │ └── Error/
│ │ ├── Operation/ # Implementações de operações
│ │ │ ├── Logic/ # Operações lógicas
│ │ │ ├── Math/ # Operações matemáticas
│ │ │ ├── Protocols/
│ │ │ ├── Factory/
│ │ │ └── Error/
│ │ └── Extensions/ # Extensões úteis
│ └── FST/ # Ferramenta de linha de comando
│ ├── FormulaSolverTool.swift
│ └── SubCommands/
│ ├── Solve.swift
│ └── Validate.swift
└── Tests/
└── FormulaSolverTests/ # Testes unitários
O projeto inclui testes abrangentes para todas as funcionalidades:
# Executar todos os testes
swift test
# Executar testes com verbosidade
swift test --verbose- ✅ Parser de fórmulas
- ✅ Todas as operações lógicas
- ✅ Todas as operações matemáticas
- ✅ Resolução de fórmulas com contexto
- ✅ Fórmulas aninhadas
- ✅ Validação de tipos
- ✅ Tratamento de erros
- Swift 6.0 ou superior
- macOS 13+ / Linux com Swift instalado
Contribuições são bem-vindas! Sinta-se à vontade para:
- Fazer fork do projeto
- Criar uma branch para sua feature (
git checkout -b feature/MinhaFeature) - Commit suas mudanças (
git commit -am 'Adiciona nova feature') - Push para a branch (
git push origin feature/MinhaFeature) - Abrir um Pull Request
Este projeto está sob uma licença de código aberto. Consulte o arquivo LICENSE para mais detalhes.
- Lucas Migge
- Lucas Barros
Se você encontrar algum problema ou tiver sugestões, por favor abra uma issue no GitHub.