Pular para o conteúdo

Superfície e contrato

O que um módulo oferece é um contrato com quem o usa — e a ferramenta que diz, antes do release, se ele foi quebrado.

A superfície de um módulo é o que ele exporta com relay: nomes, parâmetros, campos. Quem adota o módulo depende exatamente disso. Mudar a superfície é mudar o contrato — e Arcane.Abi compara duas versões e diz se a mudança quebra quem usava a anterior.

dataforge
adopt Arcane.Abi as Abi
adopt Arcane.IO as IO
adopt Arcane.OS as OS

pasta := $"{OS.temp_dir()}/df-abi-{randint(100000, 999999)}"
IO.mkdir(pasta)
antes := $"{pasta}/v1.df"
IO.write(antes, "action somar(a, b):\n    yield a + b\naction dobro(x):\n    yield x * 2\nrelay somar, dobro\n")

depois := $"{pasta}/v2.df"
IO.write(depois, "action somar(a, b, c := 0):\n    yield a + b + c\naction dobro(x):\n    yield x * 2\nrelay somar, dobro\n")

assert Abi.veredito(antes, depois) is "menor"          // acrescentou, não quebrou
assert Abi.compativel(antes, depois)
IO.remove_tree(pasta)