Manual de Uso R2D2
Tags: ledscommunity, langium, codegenerator, csharp
Published: 2024-06-03 16:44:23

Este manual descreve o uso da extensão de Visual Studio Code geradora de código e documentação R2D2. 

### Instalação:
1- Abra o Visual Studio Code
2- Clique em extensões
3- Pesquise R2D2
4- Clique para instalar a extensão R2D2 do LEDS IFES

![Imagem da loja do VSCode com a extensão aberta](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3i2scynb37lq8wq3bv46.png)

### Como usar:

#### Criando o arquivo para geração:
1- Crie um arquivo de nome qualquer com a extensão .r2d2.
2- Após criar o arquivo, abra-o.
3- Aqui iniciaremos a programação da geração de código. Primeiro, definimos a configuração do projeto a ser gerado. Para fins de exemplo, vamos seguir o modelo de exemplo do Slave-One (Outro projeto do Leds). Assim, definimos as configurações do projeto:
   ```
   Configuration {
       software_name: "Slave-One" // O nome do projeto
       about: "Slave-one project example" // Uma descrição do projeto
       language: csharp-minimal-api // Escolha a linguagem em que o código será gerado
   }
   ```
   Para a linguagem, temos três opções por enquanto: python, java e csharp-minimal-api.
4- Depois, definimos módulos. Assim, definimos um módulo:
   ```
   module Main {
       // Aqui ficam os componentes dos módulos
   }
   ```
5- Dentro de módulos, definimos entidades e enums:
   ```
   entity Projeto {
       nome: string
       data_inicio: date
       data_fim: date
       orcamento: decimal
       cliente: string
       patrocinador: string
       objetivo: string
       Projeto OneToMany Projeto
       Projeto OneToMany Time
       Projeto uses ProjetoStatus
   }

   enum ProjetoStatus {
       Ativo
       Cancelado
       Entregue
   }
   ```
   Dentro da declaração de entidade, temos os seus atributos, como `nome: string`, as relações entre as classes, como `Projeto OneToMany Projeto`, e o `Projeto uses ProjetoStatus`, que indica o uso de um enum. Na declaração do Enum, apenas colocamos quais os valores do enum. E assim continuamos a declarações com quantos módulos, entidades e enums forem necessários.

#### Rodando R2D2 para gerar o código:
Após criar, estruturar e salvar o arquivo .r2d2, clique com o botão direito em qualquer lugar dentro do arquivo e escolha o que você deseja gerar **(Na versão atual, o r2d2 gera apenas a API)**, como na imagem abaixo:

![Menu clique com botão direito no VSCode](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2rwpadxtgl2dl9dfylqp.png)

Após isso, as pastas e o conteúdo serão gerados na mesma pasta em que o arquivo .r2d2 se encontra.

![Pastas com os conteúdos no explorador de arquivos](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hyhn6xvlqwv1d7glhehy.png)

#### Como utilizar o código gerado em C# no Visual Studio:

1- Abra o arquivo da solução gerada no Visual Studio: Com o Visual Studio já instalado, apenas abra a pasta do backend e abra o arquivo com o nome do seu projeto `.sln`.
2- (Não ocorre em todos os casos) Correção da auto relação na entidade, caso tenha alguma auto relação, entre no arquivo .cs da entidade e faça a troca do nome da entidade para o nome desejado (um nome diferente do da própria entidade para evitar conflitos no C#)
![Exemplo da troca de nome](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2ntrzlc8zwwgto8obugk.png)
Depois disso, troque o nome da entidade também na relação dentro do `ContextDb.cs`:
![Exemplo troca de nome dentro do ContextDb](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/db0ime3hy7yq6uuyck0l.png)
Assim a auto relação funcionará corretamente.
3- Apenas clique para rodar o container docker e código.
![Menu do Visual Studio com o botão para rodar](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/taf6zqgweiq63trb7iht.png)
Após isso é só esperar tudo compilar, que ele abrirá uma página no seu navegador com o link da API, caso apareça uma página com Hello World tudo está funcionando.

#### Abrindo o Swagger:
1- Já na página da API no navegador(Hello World), basta adicionar `/swagger` ao final do link que entraremos na tela do swagger.

![Tela do Swagger](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tk4ob8mm33s3w3xmaxnr.png)

#### Exemplo:
[Link do repositório com o exemplo do Slave-One](https://gitlab.com/joaomarcosrpimentel/exemplo-r2d2-slave-one)
Neste repositório temos tudo o que foi gerado seguindo este manual.