Pular para o conteúdo

Gestor de tarefas

CLI de tarefas com prazos, prioridade e persistência em JSON.

bash
dataforge install
dataforge run src/main.df -- adicionar "Comprar pão" --prioridade 3 --prazo 2026-09-15
dataforge run src/main.df -- listar --pendentes
dataforge run src/main.df -- concluir 1
dataforge run src/main.df -- resumo
bash
┌───┬───┬─────────────────────────┬────────┬───────────────────────┐
    # │ Tarefa                  │ Prior. │ Prazo                 │
├───┼───┼─────────────────────────┼────────┼───────────────────────┤
    1  Escrever a documentação  alta    2026-09-15            
   2  Revisar os testes        media                        
    3  Comprar café             baixa   2026-09-01 (atrasada) 
└───┴───┴─────────────────────────┴────────┴───────────────────────┘

Estrutura#

ArquivoResponsabilidade
src/tarefa.dfo modelo — um record
src/repositorio.dfpersistência, isolada atrás de uma interface
src/main.dfCLI e apresentação

O modelo#

dataforge
record Tarefa:
    id: Integer
    titulo: String
    prioridade: Integer
    prazo: String
    feita: Boolean

    action esta_atrasada():
        given self.feita or self.prazo is "":
            yield no
        yield D.dias_entre(D.hoje(), D.de_iso(self.prazo)) smaller 0

    action dias_restantes():
        given self.prazo is "":
            yield void
        yield D.dias_entre(D.hoje(), D.de_iso(self.prazo))

    action rotulo_prioridade():
        given self.prioridade bigger_eq 3:
            yield "alta"
        given self.prioridade is 2:
            yield "media"
        yield "baixa"

Tarefa é record porque o que muda é a lista que as contém. Concluir uma cria uma cópia com with, e o original fica intacto — impossível alterar por engano em outro ponto do código.

Configuração em camadas#

dataforge
action carregar_config():
    cfg := C.novo()
    cfg := C.padroes(cfg, {
        "arquivo": "tarefas.json",
        "estilo": "simples",
        "cor": yes
    })
    cfg := C.do_arquivo(cfg, "tarefas.config.json")
    cfg := C.do_ambiente(cfg, "TAREFAS_")
    yield cfg

Padrão, arquivo, ambiente, argumentos — nessa ordem de precedência. cofre guarda de onde veio cada valor, o que responde à pergunta que se faz às três da manhã.

Arquivo corrompido não derruba#

Um JSON quebrado avisa e começa vazio, sem apagar o original. Derrubar o programa por causa de um arquivo que alguém editou à mão seria pior que seguir — e há teste para isso.