Skip to content

Commit

Permalink
Esboço da geração de controladores por modelos em Delégua.
Browse files Browse the repository at this point in the history
  • Loading branch information
leonelsanchesdasilva committed Jan 13, 2024
1 parent b260d01 commit 5e5b97a
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 3 deletions.
44 changes: 41 additions & 3 deletions index-gerar.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,26 @@
import prompts from 'prompts';
import * as sistemaArquivos from 'fs';
import * as caminho from 'path';

import prompts from 'prompts';

import { Lexador } from '@designliquido/delegua/fontes/lexador';
import { AvaliadorSintatico } from '@designliquido/delegua/fontes/avaliador-sintatico';
import { Importador } from '@designliquido/delegua-node/fontes/importador';
import { Classe } from '@designliquido/delegua/fontes/declaracoes';
import { pluralizar } from '@designliquido/flexoes';

const pontoDeEntradaGerar = async (argumentos: string[]) => {
// argumentos[0] normalmente é o nome do executável, seja Node, Bun, etc.
// argumentos[1] é o nome do arquivo deste ponto de entrada.
// argumentos[2] é o nome do modelo correspondente. Se vir vazio, perguntar o nome.
let nomeModelo = argumentos[2];
const diretorioModelos = caminho.join(process.cwd(), 'modelos');
if (nomeModelo === undefined || nomeModelo.length <= 0) {
const opcoesModelos = [];
sistemaArquivos.readdirSync(caminho.join(process.cwd(), "modelos")).forEach(arquivo => {
sistemaArquivos.readdirSync(diretorioModelos).forEach((arquivo) => {
if (arquivo.endsWith('.delegua')) {
const prefixoArquivo = arquivo.split('.')[0];
opcoesModelos.push({title: prefixoArquivo, value: prefixoArquivo});
opcoesModelos.push({ title: prefixoArquivo, value: prefixoArquivo });
}
});

Expand All @@ -25,6 +33,36 @@ const pontoDeEntradaGerar = async (argumentos: string[]) => {

nomeModelo = respostaNomeModelo.nomeModelo;
}

const lexador = new Lexador(false);
const avaliadorSintatico = new AvaliadorSintatico(false);
const importador = new Importador(lexador, avaliadorSintatico, {}, {}, false);

const resultadoImportacao = importador.importar(caminho.join(diretorioModelos, nomeModelo + '.delegua'));
const declaracoes = resultadoImportacao.retornoAvaliadorSintatico.declaracoes;

// Aqui apenas aceitamos declarações de classes. Pode ser mais de uma.
for (const declaracao of declaracoes.filter((d) => d instanceof Classe)) {
const declaracaoClasse = <Classe>declaracao;

const diretorioControladores = caminho.join(process.cwd(), 'controladores');

if (!sistemaArquivos.existsSync(diretorioControladores)) {
sistemaArquivos.mkdirSync(diretorioControladores);
}

// Controlador: cria-se um arquivo `.delegua` com quatro rotas: rotaGet, rotaPost, rotaPut, rotaDelete.
const nomeControladorPlural = pluralizar(declaracaoClasse.simbolo.lexema).toLocaleLowerCase('pt');

const conteudoControlador = `liquido.rotaGet(funcao(requisicao, resposta) {\n resposta.lmht({ "titulo": "Liquido" })\n})`;
const caminhoControlador = caminho.join(diretorioControladores, nomeControladorPlural + '.delegua');
sistemaArquivos.writeFileSync(
caminhoControlador,
conteudoControlador
);

console.info(`Controlador ${caminhoControlador} criado com sucesso!`);
}
};

pontoDeEntradaGerar(process.argv);
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
},
"dependencies": {
"@designliquido/delegua-node": "^0.29.1",
"@designliquido/flexoes": "^0.0.0",
"@designliquido/foles": "^0.6.1",
"@designliquido/lincones-sqlite": "^0.0.2",
"@designliquido/lmht-js": "^0.4.4",
Expand Down
5 changes: 5 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,11 @@
esprima "^4.0.1"
lodash.clonedeep "^4.5.0"

"@designliquido/flexoes@^0.0.0":
version "0.0.0"
resolved "https://registry.yarnpkg.com/@designliquido/flexoes/-/flexoes-0.0.0.tgz#7f9b9cb60804db898023c45325de5dcfbb1fd98c"
integrity sha512-G0KGAj/GyFO3SPVvnAHlPl9PdEHuqPO0jm9VDCtZOlnV9wYKAj1NKlWvS4RDdOeLLhNH8cOBMccjIxWjwGFQuw==

"@designliquido/foles@^0.6.1":
version "0.6.1"
resolved "https://registry.yarnpkg.com/@designliquido/foles/-/foles-0.6.1.tgz#70751fb63f0b1e53ab03a286ca97f4cc002ac765"
Expand Down

0 comments on commit 5e5b97a

Please sign in to comment.